问题描述 :
给出三维空间上的四个点(点与点的位置均不相同),判断这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"
Sample Input
1 1 2 0 2 3 0 4 0 0 0 0 0Sample Output
Yes
题解 :
三个点可确定一个面,求出该面的法向量,在三点中任意找一点与剩余一点构成一个向量,再判断其与法向量的 垂直、相交、平行 关系,只要知道求法向量的公式,一切ok !!
四点 : (a,b,c) (a1,b1,c1) (a2,b2,c2) (a3,b3,c3)
向量1 : (x1,y1,z1) double x1=a1-a; double y1=b1-b; double z1=c1-c;
向量2 : (x2,y2,z2) double x2=a2-a; double y2=b2-b; double z2=c2-c;
向量3 : (x3,y3,z3) double x3=a3-a; double y3=b3-b; double z3=c3-c;
法向量 : (x,y,z)
|y1 z1|
X = | | X = y1*z2-y2*z1
|y2 z2|
|x1 z1|
Y = - | | Y = -(x1*z2-x2*z1)=x2*z1-x1*z2
|x2 z2|
|x1 y1|
Z = | | Z = x1*y2-x2*y1
|x2 y2|
垂直 : x*x3+y*y3+z*z3=0
#include<stdio.h>
int main(){
int t;
double a,b,c,a1,b1,c1,a2,b2,c2,a3,b3,c3;
scanf("%d",&t);
while(t--){
scanf("%lf %lf %lf",&a,&b,&c);
scanf("%lf %lf %lf",&a1,&b1,&c1);
scanf("%lf %lf %lf",&a2,&b2,&c2);
scanf("%lf %lf %lf",&a3,&b3,&c3);
double x1=a1-a; double y1=b1-b; double z1=c1-c;
double x2=a2-a; double y2=b2-b; double z2=c2-c;
double x3=a3-a; double y3=b3-b; double z3=c3-c;
double x=y1*z2-y2*z1;
double y=x2*z1-x1*z2;
double z=x1*y2-x2*y1;
double g=x3*x+y3*y+z3*z;
if(g==0){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}