题目链接: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
题目给出四个点,让判断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;
}