鸡在玩铁丝。
具体来说,二维平面上有一根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;
}
标签:BA,BC,EF,三维,second,叉积,铁丝,向量,first
From: https://www.cnblogs.com/ccag/p/17068985.html