第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
/* 利用三点的矩阵行列式解出平面方程,带入第四点验证 */ #include <bits/stdc++.h> #define pi acos(-1) #define eps 1e-6 using namespace std; int t; struct point{ double x,y,z; point(){} point(double _x,double _y,double _z){ x=_x; y=_y; z=_z; } }a,b,c,d; point v1,v2,v3; double sa1,sa2,sa3; int main(){ // freopen("in.txt","r",stdin); scanf("%d",&t); while(t--){ scanf("%lf%lf%lf",&a.x,&a.y,&a.z); scanf("%lf%lf%lf",&b.x,&b.y,&b.z); scanf("%lf%lf%lf",&c.x,&c.y,&c.z); scanf("%lf%lf%lf",&d.x,&d.y,&d.z); double D=-a.x*(b.y*c.z-c.y*b.z)-a.y*(b.x*c.z-c.x*b.z)-a.z*(b.x*c.y-c.z*b.y); double A=a.y*(b.z-c.z)+b.y*(c.z-a.z)+c.y*(a.z-b.z); double B=a.z*(b.x-c.x)+b.z*(c.x-a.x)+c.z*(a.x-b.x); double C=a.x*(b.y-c.y)+b.x*(c.y-a.y)+c.x*(a.y-b.y); if(d.x*A+d.y*B+d.z*C+D==0){ puts("Yes"); }else{ puts("No"); } } return 0; }
原文:http://www.cnblogs.com/wuwangchuxin0924/p/7858066.html