【TOJ 3005】Triangle(判断点是否在三角形内)

描述

Given the coordinates of the vertices of a triangle,And a point. You just need to judge whether the point is in the Triangle.

输入

The input contains several test cases. For each test case, only line contains eight integer numbers , describing the coordinates of the triangle and the point. All the integer is in range of [-100 , 100].
The end of the input is indicated by a line containing eight zeros separated by spaces.

输出

For each test case , if the point is inside of the triangle ,please output the string ”YES”, else output the string “NO”. You just need to follow the following examples.

样例输入

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

样例输出

NO
YES
NO

题解

通过判断3个小三角形面积是否等于大三角形面积即可,这道题卡精度,要控制误差在1e-9

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y;
}a,b,c,p;
double edge(int x1,int y1,int x2,int y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double area(int x1,int y1,int x2,int y2,int x3,int y3)
{
    double A=edge(x1,y1,x2,y2);
    double B=edge(x1,y1,x3,y3);
    double C=edge(x3,y3,x2,y2);
    double L=(A+B+C)*1.0/2;
    return fabs(sqrt(L*(L-A)*(L-B)*(L-C)));
}
bool check(double a,double b,double c,double p)
{
    if(a==0||b==0||c==0)
        return false;
    if(fabs(a+b+c-p)<=1e-9)
        return true;
    return false;
}
int main()
{
    while(cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>p.x>>p.y,a.x||a.y||b.x||b.y||c.x||c.y||p.x||p.y)
    {
        double s=area(a.x,a.y,b.x,b.y,c.x,c.y);
        double abp=area(a.x,a.y,b.x,b.y,p.x,p.y);
        double acp=area(a.x,a.y,c.x,c.y,p.x,p.y);
        double bcp=area(c.x,c.y,b.x,b.y,p.x,p.y);

        if(check(abp,acp,bcp,s))
            printf("YES\n");
        else printf("NO\n");
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/kannyi/p/9038356.html

时间: 2024-10-13 07:41:10

【TOJ 3005】Triangle(判断点是否在三角形内)的相关文章

判断点是否在三角形内【转】

概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三角形的三个顶点得到三条线段PA,PB和PC,求出这三条线段与三角形各边的夹角,如果所有夹角之和为180度,那么点P在三角形内,否则不在,此法直观,但效率低下. 二 同向法 假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和

判断点是否在三角形内

http://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html#!comments 本文只是翻译和整理,原文在此http://www.blackpawn.com/texts/pointinpoly/default.html 概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三

二维平面上判断点是否在三角形内

最近在项目中碰到的这个问题,在此记录一下.已知三角形的三个顶点坐标,判断某个点是否在三角形中(在三角形的边上,我们也视作在三角形中),本文给出了三种方法.   算法1 利用面积法,如上图所示,如果点P在三角形ABC的内部,则三个小三角形PAB, PBC, PAC的面积之和 = ABC的面积,反之则不相等. 已知三角形的三个顶点坐标求其面积,可以根据向量的叉乘,参考here. 该算法详见后面的函数:IsPointInTriangle1   算法2 首先看一下这个问题,如何判断某两个点在某条直线的同

华为oj 之 判断点是否在三角形内

/* * 任意顶点为A.B.C的三角形,如果点P在三角形内,那么 * 1)点P和点C在AB边的同一侧 2)点P和点A在BC边的同一侧 3)点P和点B在AC边的同一侧 * 反之亦然(充要条件) * * 关键:如何判断某两个点在某条直线的同一侧 * 参考图示发现: *   对于点P: AB*BC的方向 和 AB*BP的方向相同 *    对于点P1: AB*BC的方向 和 AB*BP1的方向不同 * 故:对于边AB,以及点C.P,如果AB*BC的方向 和 AB*BP的方向相同, *    那么点P和

2D空间中判断一点是否在三角形内

本来打算做三角形填充多边形,但需要用到耳切法正在看.所以先研究了这个 要注意如果是XY坐标轴的2D空间,要取差乘分量z而不是y. 实现原理是,将三角形ABC三个边(AB,BC,CA)分别与比较点判断差乘,如果这3个差乘结果表示的方向一致,说明就在三角形内. 效果: 代码(Unity3D): using UnityEngine; using System.Collections; using System.Collections.Generic; public class TriangleColl

Triangle - POJ 2954(求三角形内的格子点的个数)

Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1. 代码如下: ---------------------------------------------------------------------------------------------------------------------------- #include<iostream> #include<string.h> #include<stdio.h> #inclu

几种方法判断平面点在三角形内

最近在做一个Unity实现的3D建模软件,其中需要在模型表面进行操作的时候,需要用到点和三角形位置关系的判定算法.由于一个模型往往是几千个三角片,所以这个判定算法必须高效,否则会影响最终程序的整体性能.这里记录一下一些算法,如有误请指出,谢谢! 首先假设点和三角形在同一平面内,如果不在同一平面,需要用其它方法先筛选. 常用的几种平面点-三角形位置关系判定方法有(以下算法执行必须先保证点和三角形位于同平面): 1.顺时针/逆时针判定法 该方法要求点的顺序是顺时针或逆时针的,如果是顺时针的点,沿着3

Project Euler 102:Triangle containment 包含原点的三角形

Triangle containment Three distinct points are plotted at random on a Cartesian plane, for which -1000 ≤ x, y ≤ 1000, such that a triangle is formed. Consider the following two triangles: A(-340,495), B(-153,-910), C(835,-947)X(-175,41), Y(-421,-714)

二维平面上判断点在三角形内的最优算法

园子里有很多关于点是否在三角形内的文章,提供了各种方法.这让人很纠结,到底该用哪种算法?这里提供一套我认为最优的算法.如果你有不同的意见,亦或有更好的算法,欢迎来讨论. 算法使用的是同向法,其原理是:假设点P位于三角形ABC内,会有这样一个规律:三角形的每一个边,其对角点与P在边的同一侧:或者说三角形的每一个顶点与P在其对角边的同一侧. (1)代码 // 2D vector class Vec2 { public: Vec2() { x = 0.0f; y = 0.0f; } Vec2(floa