1265 四点共面(计算几何)

基准时间限制:1 秒 空间限制:131072 KB 分值: 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
2
3
4
5
1
1 2 0
2 3 0
4 0 0
0 0 0

Output示例

1
Yes

题解:

计算几何四点共面模版 已经包含四点共线的情况了

如果四点不能共线 那就用两次三点共线判断一下就行

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <cmath>
#include <list>
#include <vector>
using namespace std;

#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
struct point{
double x,y,z;
}q[4];
//叉积
point xmult(point u,point v){
point ret;
ret.x=u.y*v.z-v.y*u.z;
ret.y=u.z*v.x-u.x*v.z;
ret.z=u.x*v.y-u.y*v.x;
return ret;
}
//点积
double dmult(point u,point v){
return u.x*v.x+u.y*v.y+u.z*v.z;
}
//矢量差
point subt(point u,point v){
point ret;
ret.x=u.x-v.x;
ret.y=u.y-v.y;
ret.z=u.z-v.z;
return ret;
}
//取平面法向量
point pvec(point s1,point s2,point s3){
return xmult(subt(s1,s2),subt(s2,s3));
}
//向量大小
double vlen(point p){
return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
}
//判三点共线
int dots_inline(point a,point b,point c){
return vlen(xmult(subt(a,b),subt(b,c)))<eps;
}
//判四点共面
int dots_onplane(point a,point b,point c,point d){
return zero(dmult(pvec(a,b,c),subt(d,a)));
}
bool check(){
if(dots_onplane(q[0],q[1],q[2],q[3]))return true;
return false;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=0;i<4;i++){
scanf("%lf%lf%lf",&q[i].x,&q[i].y,&q[i].z);
}
if(check())puts("Yes");
else puts("No");
}
return 0;
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2018-2021 LeFlacon

奶茶一杯 快乐起飞

支付宝
微信