1265 四点共面

Posted 勿忘初心0924

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1265 四点共面相关的知识,希望对你有一定的参考价值。

给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。
Output
输出共T行,如果共面输出"Yes",否则输出"No"。
Input示例
1
1 2 0
2 3 0
4 0 0
0 0 0
Output示例
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;
}

 

以上是关于1265 四点共面的主要内容,如果未能解决你的问题,请参考以下文章

1265 四点共面

51Nod 1265 四点共面

51nod--1265 四点共面

51 Nod 1265 四点共面

1265 四点共面

51Nod1265 四点共面