51 Nod 1265 四点共面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51 Nod 1265 四点共面相关的知识,希望对你有一定的参考价值。
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#problemId=1265¬iceId=352691
题意:判断四点共面
题解:假设有a,b,c,d四个点,如果ab,ac,ad三个向量线性相关,那么三个向量共面(充要条件)。
如何判断三个向量是否线性相关,以三个向量元素列一个3x3的行列式,如果求得的值为0,说明线性相关。
证明:如果ab,ac,ad线性相关,那么ab=k1*ac+k2*ad,根据行列式的性质:如果两行(列)成比例,那么行列式的值为0。
(这个可以先把系数提取出来,然后就有两行(列)相同,行列式的值为0)
1 #include <iostream> 2 using namespace std; 3 4 struct point{ 5 int x,y,z; 6 }; 7 8 int is_coplanar(point a,point b,point c,point d){ 9 point ab,ac,ad; 10 ab.x=a.x-b.x,ab.y=a.y-b.y,ab.z=a.z-b.z; 11 ac.x=a.x-c.x,ac.y=a.y-c.y,ac.z=a.z-c.z; 12 ad.x=a.x-d.x,ad.y=a.y-d.y,ad.z=a.z-d.z; 13 int tmp=ab.x*ac.y*ad.z+ab.y*ac.z*ad.x+ac.x*ad.y*ab.z; 14 tmp-=ab.z*ac.y*ad.x+ab.x*ac.z*ad.y+ab.y*ac.x*ad.z; 15 return tmp; 16 } 17 18 int main(){ 19 int t; 20 cin>>t; 21 while(t--){ 22 point a,b,c,d; 23 cin>>a.x>>a.y>>a.z>>b.x>>b.y>>b.z>>c.x>>c.y>>c.z>>d.x>>d.y>>d.z; 24 if(!is_coplanar(a,b,c,d)) cout<<"Yes"<<endl; 25 else cout<<"No"<<endl; 26 } 27 28 return 0; 29 }
以上是关于51 Nod 1265 四点共面的主要内容,如果未能解决你的问题,请参考以下文章