4.4 点是否在三角形内

题目:给定一个三角形和一个点,判断这个点是否在三角形内。。

第一种方法:面积相等法

如果点在三角形内部,则如果将三角形的三个顶点与这个点相连所得的三个小三角形的面积之和与原三角形的面积相等

S(A,B,D) + S(A,C,D) + S(B,C,D) = S(A,B,C)

第二种方法:向量叉积法

判断点P3是否在向向P1P2的左边,只需要通过两个向量P1P2、P1P3做叉积就可以判断

P1P2 X P1P3 > 0 则 P3在P1P2左边

P1P2 X P1P3 = 0 则 P3在P1P2上

P1P2 X P1P3 < 0 则 P3在P1P2右边

注:两个点的叉积:

V1(x1, y1) X V2(x2, y2) = x1y2 – y1x2

代码:

struct point {
	double x;
	double y;
};

double Distance(point A,point B) {
	return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}

double Area(point A, point B, point C) {
	double a, b, c, p;
	a = Distance(B,C);
	b = Distance(A,C);
	c = Distance(A,B);
	p = (a + b + c) / 2;
	return sqrt((p - a) * (p - b) * (p - c) * p);
}
double CrossProduct(point A, point B, point C) {
	double result = (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
	return result;
}

bool IsInTriangle(point A,point B,point C, point D) {
	double AreaSum = Area(A,B,D) + Area(B,C,D) + Area(A,C,D);
	double AreaSor = Area(A,B,C);
	if(AreaSum - AreaSor > 0.000001)
		return false;
	else
		return true;
}

bool IsInTriangle2(point A, point B, point C, point D) {
	if(CrossProduct(A,B,D) >= 0 && CrossProduct(B,C,D) >= 0 && CrossProduct(C,A,D) >= 0)
		return true;
	else
		return false;
}
时间: 2024-10-12 04:49:14

4.4 点是否在三角形内的相关文章

华为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和

均匀的生成圆和三角形内的随机点

代码在每一章节最后   一.均匀生成圆内的随机点 我们知道生成矩形内的随机点比较容易,只要分别随机生成相应的横坐标和纵坐标,比如随机生成范围[-10,10]内横坐标x,随机生成范围[-20,20]内的纵坐标y,那么(x,y)就是生成的随机点.由此,我们很容易的想到了算法1 算法1(正确的): 每个圆对应一个外切矩形,我们随机生成矩形内的点,如果该点在圆内,就返回改点,否则重新生成直到生成的点在圆内. 该方法的缺点是有可能连续几次都生成不了符合要求的点.(可以求得:每次生成点时,该点有 的概率在圆

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

概述 给定三角形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和三

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

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

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

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

上机题目(中级)-判断一个点是否在三角形内(Java)

题目如下: 代码如下: package huawei; public final class Demo { public static boolean isInTriangle(POINT A, POINT B, POINT C, POINT P) { double ABC = triAngleArea(A, B, C); double ABp = triAngleArea(A, B, P); double ACp = triAngleArea(A, C, P); double BCp = tr

点是否在三角形内

题目描述:         如果在一个二维坐标系中,已知三角形三个点的坐标,那么对于坐标系中的任意一点,如何判断该点是否在三角形内(点在三角形边线上也认为在三角形内)? 假设三角形的三个点的坐标为ABC(逆时针顺序),需要判断点D是否在该三角形内. 解法一 代码如下: struct point { double x, y; }; double Area(point A, point B, point C) { //边长 double a, b, c = 0; //计算出三角形边长,分别为a,b,

编程之美---点是否在三角形内

已知三角形的三个顶点坐标,判断某个点是否在三角形中(在三角形的边上,我们也视作在三角形中) 解法一:通过点和三个顶点连接起来,从而计算点和三角形的每条边构成的三角形计算面积,然后把这三个面积加起来和原三角形面积进行比较. 解法二:从点和直线的关系着手,若点在三角形内,那么沿着三角形的边界逆时针走,点一定保持在边界的左边,可通过两个向量叉积的正负来判断是否在左边.