51nod 1265 四点共面(判四点共面)

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
1 2 0
2 3 0
4 0 0
0 0 0

Output示例

Yes

李陶冶 (题目提供者)

点击打开链接

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)

using namespace std;

struct point3{
    double x,y,z;
};

struct line3{
    point3 a,b;
};

struct plane3{
    point3 a,b,c;
};

point3 xmult(point3 u,point3 v){
    point3 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;
}

point3 subt(point3 u,point3 v){
    point3 ret;
    ret.x = u.x - v.x;
    ret.y = u.y - v.y;
    ret.z = u.z - v.z;
    return ret;
}

point3 pvec(point3 a,point3 b,point3 c){
    return xmult(subt(a,b),subt(b,c));
}

double dmult(point3 u,point3 v){
    return u.x*v.x + u.y*v.y + u.z*v.z;
}

int dots_onplane(point3 a,point3 b,point3 c,point3 d){
    return zero(dmult(pvec(a,b,c),subt(d,a)));
}

int main(){
    point3 a[4];
    int T;
    scanf("%d",&T);
    while(T--){
        for(int i=0;i<4;i++){
            scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z);
        }
        int flag = dots_onplane(a[0],a[1],a[2],a[3]);
        if(flag == 1){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,如有特殊需要请与博主联系 QQ : 793977586。

时间: 2024-10-10 15:00:13

51nod 1265 四点共面(判四点共面)的相关文章

51Nod 1265 四点共面

1265 四点共面 基准时间限制:1 秒 空间限制:131072 KB 给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面).如果共面,输出"Yes",否则输出"No". Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000

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

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

51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)

题目: 这题我WA了3次,那3次是用向量求角度去重算的,不知道错在哪了,不得不换思路. 第4次用斜率去重一次就过了. 注意:n定义成long long,不然求C(3,n)时会溢出. 代码: #include <bits\stdc++.h> using namespace std; typedef long long ll; struct point{ int x;int y; }a[2005]; map <long double,int>::iterator it; int mai

ACM 常用几何基本数学公式

ACM常用几何基本数学公式 1.   海伦公式求面积 公式描述:公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积. 2.   矢量向量求面积 3.   点到直线的距离公式 方法一:距离公式直接求 公式描述:公式中的直线方程为Ax+By+C=0,点P的坐标为(x0,y0).但是直线方程不是够直接.推荐使用方法二. 方法二:先用海伦公式求面积然后求三角形高 4.   点到线段的距离公式[或:点到线段最近的点] 有以下四种情况: 点在线段上,距离为0: 线段是一个点,用两点公式求: 三

HDU 5733 tetrahedron

计算几何.先判四点是否共面,共面则无解.然后计算出圆心坐标,然后计算圆心到任意一面的距离. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #includ

相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试

关键词:OpenCV::solvePnP 文章类型:方法封装.测试 @Author:VShawn([email protected]) @Date:2016-11-27 @Lab: [email protected] 前言 今天给大家带来的是一篇关于程序功能.性能测试的文章,读过<相机位姿估计1:根据四个特征点估计相机姿态>一文的同学应该会发现,直接使用OpenCV的solvePnP来估计相机位姿,在程序调用上相当麻烦,从一开始的参数设定到最后将计算出的矩阵转化为相机的位姿参数,需要花费近两百

三维空间中线与三角形相交判定

——读Computer Graphics Principles and Practice 3rd Edition第七章时遇见课文正文和代码中的错误,作记. 本文旨在阐释一种算法,用于在三维空间中寻找某一线(ray)与某一三角形的交点.此算法是计算机图形学中的基础算法之一. 1.预设概念 为了阐释此算法,必须先引入一组预设概念,借以使用计算机语言来描述三维空间中的线与三角形. 我们首先给出这些概念的定义及数据结构. 1.1 点(Point3D) 我们使用笛卡尔坐标系 (Cartesian coor

游泳池臭氧发生器:臭氧消毒法利用各型消毒剂处理泳池水优缺点对比

夏天,游泳池作为人们休闲娱乐场所之一,每天客流量相当大,经常对其消毒是保证人们健康重要保障,杀死泳池里细菌,防止人们疾病传染,改善水质环境,使水中细菌和氯达游泳池水质卫生标准,消除卫生不合格带来威胁,像水中加入一定量消毒剂是每天必备环节,最安全有重要意义.这篇文章主要对臭氧消毒法一一介绍. 在常温下,臭氧是一种不稳定气体,对各种类型细菌和病毒都有一定杀菌能力,降解有毒物质,游泳池水除臭,改善气味效果极佳.作用原理就是破坏脱氢酶呼吸系统,利用泳池水过滤器氧化各种类型蛋白质,这里总结了四点优点以及四

机器学习笔记——矩阵分析与应用

0.0 第三讲依然是数学,因为数学是解决一切问题的基础,一个问深入到最后都是数理知识的支撑.所谓基础决定上层建筑,比如参加ACM比赛,高手之间的比赛已经不是编程技巧了,更多的是数学知识的比拼.若想走得远,数学基础一定要打好.嗯,好遗憾之前学数学多是为了考试,学完就忘,现在要好好再复习一下.程博士用两个小时概讲了<线性代数><矩阵论>两本书的内容,结合其他的相关资料,总结一下. 1. 线性代数概念回顾 在听课之前,重新翻了一遍本科的<线性代数>,温习了线性代数中的重要概念