1. 程式人生 > >1265 四點共面

1265 四點共面

div 一個數 四點共面 blue truct urn namespace name space

1265 四點共面

給出三維空間上的四個點(點與點的位置均不相同),判斷這4個點是否在同一個平面內(4點共線也算共面)。如果共面,輸出"Yes",否則輸出"No"。

輸入

第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

先建立一個面,然後判斷兩一個點是否在該平面上.
 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct Node{
 5     double x, y, z;
 6 }xn[5];
 7 int t;
 8 double A, B, C, D; 
 9 
10 void ptofdist(){ //點是否在面上
11     A = ((xn[2].y-xn[1].y)*(xn[3].z-xn[1].z)-(xn[2].z-xn[1].z)*(xn[3].y-xn[1
].y)); 12 B = ((xn[2].z-xn[1].z)*(xn[3].x-xn[1].x)-(xn[2].x-xn[1].x)*(xn[3].z-xn[1].z)); 13 C = ((xn[2].x-xn[1].x)*(xn[3].y-xn[1].y)-(xn[2].y-xn[1].y)*(xn[3].x-xn[1].x)); 14 D = -(A * xn[1].x + B * xn[1].y + C * xn[1].z); 15 } 16 17 int main(){ 18 cin>>t; 19 while(t--){
20 for(int i = 1; i <= 4; i++){ 21 cin>>xn[i].x>>xn[i].y>>xn[i].z; 22 } 23 ptofdist(); 24 double ret = A*xn[4].x+B*xn[4].y+xn[4].z*C+D; 25 if(ret == 0){ 26 puts("Yes"); 27 }else{ 28 puts("No"); 29 } 30 } 31 return 0; 32 }

1265 四點共面