51Nod_1265 四点共面
http://www.51nod.com/Challenge/Problem.html#!#problemId=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"。
样例输入
1
1 2 0
2 3 0
4 0 0
0 0 0
样例输出
Yes
分析
运用混合积进行判断。
C++程序
#include<iostream>
#include<cmath>
using namespace std;
const double EPS=1e-8;
struct Point{
double x,y,z;
Point(){}
Point(double x,double y,double z):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
{
return x*a.x+y*a.y+z*a.z;
}
//叉积
Point operator ^(const Point &a)const
{
return Point(y*a.z-z*a.y,z*a.x-x*a.z,x*a.y-y*a.x);
}
};
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
Point p[4];
for(int i=0;i<4;i++)
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
double temp=((p[1]-p[0])^(p[2]-p[0]))*(p[3]-p[0]);
if(fabs(temp)<EPS)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}