51nod 1265 四点共面——计算几何

题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1265

以其中某一点向其它三点连向量,若四点共面,这三个向量定义的平行六面体的体积为零。

而这个体积等于这三个向量的混合积,所以只要验证混合积是否为零。

            |ax ay az|

而混合积(a,b,c)=(a×b)·c=   |bx by bz| 

            |cx cy cz|

证明也不难:https://baike.baidu.com/item/%E6%B7%B7%E5%90%88%E7%A7%AF/10564182?fr=kg_general

所以只需验证ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy的值即可。

再提一句:空间向量a、b的叉积:a×b=(ax,ay,az)×(bx,by,bz)=(ay*bz-az*by , az*bx-ax*bz , ax*by-ay*bx)

 1 #include<cstdio>
 2 using namespace std;
 3 struct Point{ int x,y,z; }p[3];
 4 int main(){
 5     int t;
 6     int x,y,z;
 7     int ax,ay,az,bx,by,bz,cx,cy,cz;
 8     scanf("%d", &t);
 9     for(int k = 1; k <= t; ++k){
10         scanf("%d%d%d",&x,&y,&z);//第一个点坐标
11         for(int i = 0; i < 3; ++i)//后三个点坐标
12             scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
13         ///构建向量
14         ax=p[0].x-x; ay=p[0].y-y; az=p[0].z-z;
15         bx=p[1].x-x; by=p[1].y-y; bz=p[1].z-z;
16         cx=p[2].x-x; cy=p[2].y-y; cz=p[2].z-z;
17         ///混合积
18         if(ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy == 0)
19             puts("Yes");
20         else puts("No");
21     }
22     return 0;
23 }

 

上一篇:【51Nod 1363】最小公倍数之和(欧拉函数)


下一篇:(DP)51NOD 1007正整数分组