给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。
Output
输出共T行,如果共面输出"Yes",否则输出"No"。
Input示例
1 1 2 0 2 3 0 4 0 0 0 0 0
Output示例
Yes
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
using namespace std;
struct point3{
double x,y,z;
};
struct line3{
point3 a,b;
};
struct plane3{
point3 a,b,c;
};
point3 xmult(point3 u,point3 v){
point3 ret;
ret.x = u.y*v.z - v.y*u.z;
ret.y = u.z*v.x - u.x*v.z;
ret.z = u.x*v.y - u.y*v.x;
return ret;
}
point3 subt(point3 u,point3 v){
point3 ret;
ret.x = u.x - v.x;
ret.y = u.y - v.y;
ret.z = u.z - v.z;
return ret;
}
point3 pvec(point3 a,point3 b,point3 c){
return xmult(subt(a,b),subt(b,c));
}
double dmult(point3 u,point3 v){
return u.x*v.x + u.y*v.y + u.z*v.z;
}
int dots_onplane(point3 a,point3 b,point3 c,point3 d){
return zero(dmult(pvec(a,b,c),subt(d,a)));
}
int main(){
point3 a[4];
int T;
scanf("%d",&T);
while(T--){
for(int i=0;i<4;i++){
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z);
}
int flag = dots_onplane(a[0],a[1],a[2],a[3]);
if(flag == 1){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}