首页 > 其他 > 详细

1265 四点共面

时间:2017-11-18 23:11:23      阅读:262      评论:0      收藏:0      [点我收藏+]
给出三维空间上的四个点(点与点的位置均不相同),判断这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 四点共面

原文:http://www.cnblogs.com/wuwangchuxin0924/p/7858066.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!