51Nod_1265 四点共面【混合积】

                                       51Nod_1265 四点共面

                                       http://www.51nod.com/Challenge/Problem.html#!#problemId=1265

题意

给出三维空间上的四个点(点与点的位置均不相同),判断这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"。

样例输入

1
1 2 0
2 3 0
4 0 0
0 0 0

样例输出

Yes

分析

运用混合积进行判断。

C++程序

#include<iostream>
#include<cmath>

using namespace std;

const double EPS=1e-8;

struct Point{
	double x,y,z;
	Point(){}
	Point(double x,double y,double z):x(x),y(y),z(z){}
	//向量减 
	Point operator -(const Point &a)const
	{
		return Point(x-a.x,y-a.y,z-a.z);
	} 
	//点积 
	double operator *(const Point &a)const
	{
		return x*a.x+y*a.y+z*a.z;
	}
	//叉积 
	Point operator ^(const Point &a)const
	{
		return Point(y*a.z-z*a.y,z*a.x-x*a.z,x*a.y-y*a.x);
	}
};

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		Point p[4];
		for(int i=0;i<4;i++)
		  scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
		double temp=((p[1]-p[0])^(p[2]-p[0]))*(p[3]-p[0]);
		if(fabs(temp)<EPS)
		   printf("Yes\n");
		else
		   printf("No\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SongBai1997/article/details/85106468
今日推荐