利用四点组成构成的三个向量的混合积为0来判断是否共面。
#include <stdio.h>
#include<math.h>
typedef struct
{
double x,y,z;
}P;
P p[5];
double mul(P a,P b){return a.x*b.x+a.y*b.y+a.z*b.z;}
P del(P a,P b)
{
P ans;
ans.x=a.x-b.x,ans.y=a.y-b.y,ans.z=a.z-b.z;
return ans;
}
int cmp(double x)
{
if(fabs(x)<1e-15) return 0;
if(x>0) return 1;
return -1;
}
P xmul(P a,P b)
{
P ans;
ans.x=a.y*b.z-b.y*a.z;
ans.y=a.z*b.x-b.z*a.x;
ans.z=a.x*b.y-b.x*a.y;
return ans;
}
int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
for(i=1;i<=4;++i ) scanf( "%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z );
if(cmp(mul(del(p[4],p[1]),xmul(del(p[3],p[1]),del(p[2],p[1]))))==0) puts("Yes");
else puts("No");
}
return 0;
}