1265 四点共面(板子)
给出三维空间上的四个点点与点的位置均不相同判断这4个点是否在同一个平面内4点共线也算共面。如果共面输出Yes否则输出No。输入第1行一个数T表示输入的测试数量(1 T 1000)第2 - 4T 1行每行4行表示一组数据每行3个数x, y, z, 表示该点的位置坐标(-1000 x, y, z 1000)。输出输出共T行如果共面输出Yes否则输出No。输入样例11 2 02 3 04 0 00 0 0输出样例Yes题解确定空间中的四个点三维是否共面对于四个点 以一个点为原点对于其他三个点有AB C三个向量 求出 A X B cross product 就是以A B构成的平面的一个法向量如果 AB共线则法向量为0 在求其与C之间的点积 如果为0 则表示两个向量为0。 所以四点共面。#includebits/stdc.h using namespace std; const double EPS1e-8; struct Point{//点 二维三维 double x,y,z; Point(){}; Point(double x,double y,double z0):x(x),y(y),z(z){} Point operator - (const Point a)const //向量减 { return Point(x-a.x,y-a.y,z-a.z); } /*double operator ^(const Point a)const//向量积sin { //二维 三维 return x*a.y-y*a.x//y*a.z-z*a.y-x*a.zz*a.x;//值 } */ Point operator ^(const Point a)const//向量积sin { return Point(y*a.z-z*a.y,z*a.x-x*a.z,x*a.y-y*a.x);//法向量 } double operator *(const Point a)const//点积cos { // 二维 三维 return x*a.xy*a.yz*a.z; } }; /* struct Circle{//圆 double x,y,r; Circle(){} Circle(double x,double y,double r):x(x),y(y),r(r){} }; //默认 是 返还true 否 返回false bool Cross(const Pointp1,const Pointp2,const Pointp3,const Pointp4) { //判断向量p1p2是否跨立p3p4 double a1(p3-p1)^(p2-p1); double a2(p4-p1)^(p2-p1); if(a1*a20)//同向 return false; return true; } //判断线段p1p2与圆是否相交 bool Lcc(Point p1,Point p2,Circle c) { bool flag1(p1.x-c.x)*(p1.x-c.x)(p1.y-c.y)*(p1.y-c.y)c.r*c.r; //判断点p1是否在圆内 bool flag2(p2.x-c.x)*(p2.x-c.x)(p2.y-c.y)*(p2.y-c.y)c.r*c.r; //判断点p2是否在圆内 if(flag1flag2)//两点都在圆内不相交 return false; if(flag1||flag2)//一点在圆内一点在圆外相交 return true; //两点在圆外判断形成的线段是否与圆相交 double A,B,C,dis1,dis2,angle1,angle2; //将直线p1p2化为一般式AxByC0的形式先化为两点式然后由两点式得出一般式 Ap1.y-p2.y; Bp2.x-p1.x; Cp1.x*p2.y-p2.x*p1.y; //使用距离公式判断圆心到直线axbyc0的距离是否大于半径 dis1A*c.xB*c.yC; dis1*dis1; dis2(A*AB*B)*c.r*c.r; if(dis1dis2)//距离大于半径 return false; angle1(c.x-p1.x)*(p2.x-p1.x)(c.y-p1.y)*(p2.y-p1.y);//c-p1与p1p2夹角 angle2(c.x-p2.x)*(p1.x-p2.x)(c.y-p2.y)*(p1.y-p2.y);//c-p2与p1p2夹角 if(angle10angle20)//都是锐角 相交 return true; return false; } */ //判断四点是否共面 int main() { int t; cint; while(t--) { Point p[4]; for(int i0;i4;i) cinp[i].xp[i].yp[i].z; double tmp((p[1]-p[0])^(p[2]-p[0]))*(p[3]-p[0]); if(fabs(tmp)EPS) coutYes\n; else coutNo\n; } return 0; }