如何判断一个点是在三角形的内部还是外部

https://blog.csdn.net/sixdaycoder/article/details/79791389
在讲这个办法之前,我们先看另一个问题。

如果给定一条线段AB和点C,能否判断出来C和AB的位置关系呢?

这里的位置关系是指C是在向量AB上,还是在AB的顺时针方向,又或者是在AB的逆时针呢?
在这里插入图片描述
这里的C就是我们说的在AB的逆时针方向。
那么我们如何判断C和AB的位置关系呢?
先给出代码,然后给予解释:

//i输入 : 向量A->B,点p
//return true : A,B,p构成顺时针
struct Point{
	double x,y;
};
Point P[N], test;

// 沿A,B,p三个点是不是顺时针 
bool Is_clockwise(Point A, Point B, Point p){
	return (B.x-A.x)*(p.y-A.y) - (B.y-A.y)*(p.x-A.x) < 0;
}

判断 p 是否在A-B的顺时针方向,做AB向量(A指向B,下同),Ap向量,两个向量叉乘,如果结果 < 0,说明是顺时针。否则有两种情况:p在AB上或在其逆时针方向。

向量叉乘:
向量a 和b 叉乘, 得到一个垂直于a 和b 的向量a ×b , 它的方向由右手螺旋法则确定, 它的长度是a和b 张开的平行四边形的面积:
在这里插入图片描述

判断点是否在三角形外

如果3个点依次为顺时针排列,如图A,B,C,可以看到,如果p同时满足:在AB向量,BC向量,CA向量的顺时针方向,那么p一定在三角形内部。
在这里插入图片描述
问题是输入的三个点不一定按照顺时针排列。此时我们可以调整一下。

bool Inside_triangle(Point A, Point B, Point C, Point p){
	if(!Is_clockwise(A,B,C)) swap(B,C); // 如果不是顺时针,将A,B,C调整成顺时针 
	return Is_clockwise(A,B,p)&&Is_clockwise(B,C,p)&&Is_clockwise(C,A,p) ;
}

猜你喜欢

转载自blog.csdn.net/CY05627/article/details/88403615