向量叉积判断三角形是否进行了三维旋转

2023牛客寒假算法一 E 叉积判断三维旋转

鸡在玩铁丝。

具体来说,二维平面上有一根L型的铁丝,由AB和BC两条线段组成,鸡可以用以下三种操作玩铁丝:

1、在平面内任意地平移铁丝,即铁丝上每一个点横坐标都变化Δx、纵坐标都变化Δy;

2、以B点为轴,任意地旋转铁丝,旋转是在平面上进行的(即旋转过程中铁丝不能离开地面);

3、鸡是三维生物!鸡将该铁丝拿起,在自己手里任意的调整铁丝的姿态后(鸡不能使铁丝发生形变)再随意放回平面上任意位置。

鸡可以任意(任意顺序、任意次数、不同的操作可以交替使用)使用上述三种操作来操作铁丝,经过一段时间的操作后,得到新铁丝的位置可以用线段DE和EF描述。注意DE并不保证与AB对应,EF同理,即DEF只描述操作后铁丝的形状。现在,你想知道只根据ABC与DEF的信息,是否可以断言鸡一定使用过至少一次第三种操作。

都变了类型的加减即使是只需要其符号也要一double形式返回,int有取为0的危险

double判断相等,相差在一定的精度内即可

#include <iostream>
#include<math.h>

using namespace std;

typedef double db;
typedef pair<int, int> PII;
typedef pair<db, db> pdb;
const db eps=1e-3;
PII a, b, c;
pdb x, y, z;
pdb BA, BC, ED, EF;

db len(pdb x)
{
    return x.first * x.first + x.second * x.second;
}

int main()
{
    int k;
    cin >> k;
    while (k--)
    {
        cin >> a.first >> a.second >> b.first >> b.second >> c.first >> c.second;
        cin >> x.first >> x.second >> y.first >> y.second >> z.first >> z.second;

        BA = {a.first - b.first, a.second - b.second}, BC = {c.first - b.first, c.second - b.second};
        if (len(BA) == len(BC))
        {
            puts("NO");
            continue;
        }

        ED = {x.first - y.first, x.second - y.second}, EF = {z.first - y.first, z.second - y.second};
        if (fabs(len(ED) - len(BC)) < eps)
        {
            swap(BA, BC);
        }

        db r1 = BA.first * BC.second - BA.second * BC.first;
        db r2 = ED.first * EF.second - ED.second * EF.first;

        if (r1 * r2 < 0)
        {
            puts("YES");
        }
        else
        {
            puts("NO");
        }
    }
    return 0;
}
posted on 2023-01-27 16:19  rain_wind_read  阅读(33)  评论(0)    收藏  举报