51Nod 1265:四点共面(计算几何)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1265
题目给出四个点,让判断4点是否共面,共面输出Yes,不共面输出No.
如果A、B、C、D四点共面则他们的混合积是0,混合积为0则四面共面。
(vector(AB)×vector(AC))·vector(AD) = 0
向量的叉乘:a×b = (l,m,n) × (o,p,q) = (mq-np,no-lq,lp-mo)
向量的点乘:a·b  = (l,m,n)·(o,p,q) = l*o+m*p+n*q

因为叉乘求的是那两个向量所在平面的法向量。


#include <stdio.h>  
#include <math.h>  
#include <stdlib.h>  
#define eps 1e-8  
  
struct point      ///点结构体  
{  
    double x,y,z;  
}p[4];  
struct Vector     ///向量结构体  
{  
    double x,y,z;  
}v[4];  
struct Vector getVector(point a,point b)  
{  
    struct Vector v1;  
    v1.x = a.x-b.x;  
    v1.y = a.y-b.y;  
    v1.z = a.z-b.z;  
    return v1;  
};  
///向量的叉乘:a×b = (l,m,n) × (o,p,q) = (mq-np,no-lq,lp-mo).  
struct Vector crossProduct(Vector v1,Vector v2)  
{  
    Vector v3;  
    v3.x = v1.y*v2.z-v1.z*v2.y;  
    v3.y = v1.z*v2.x-v1.x*v2.z;  
    v3.z = v1.x*v2.y-v1.y*v2.x;  
    return v3;  
};  
///向量的点乘a·b  
double dotProduct(Vector v1,Vector v2)  
{  
    return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z;  
}  
int main()  
{  
    int t;  
    scanf("%d",&t);  
    while(t--)  
    {  
        for(int i = 0; i < 4; i++)  
             scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);  
        v[0] = getVector(p[0],p[1]);  
        v[1] = getVector(p[0],p[2]);  
        v[2] = getVector(p[0],p[3]);  
        v[3] = crossProduct(v[1],v[2]);    
        double ans = dotProduct(v[0],v[3]);  
        if(fabs(ans)>eps)  
            printf("No\n");  
        else  
            printf("Yes\n");  
    }  
    return 0;  
}  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值