判断点是否在三角形内部

向量法:若点P位于三角形内部的话,则从某一点出发绕三角形一圈时,点P始终会在路径的同一侧,如下图点P始终在路径的左侧:

当点P在三角形外部时,如下图,点P在路径BC段的右侧

因此,只需判断点P相对于路径的方向是否有变化即可知道P点是不是在三角形内部。
如何判断P点相对于AB的方位呢?可以使用向量积。
向量积的模 |AB╳AP| = |AB| * |AP| * sinθ,
θ为向量 AB AP 的夹角∠PAB,
可知:当点P位于AB左侧时θ在0°到-180°之间sinθ > 0,
当点P位于AB右侧时θ在-180到0°之间sinθ < 0。

因此,只需要求得叉积的正负即可推出点P所处的位置。
需要注意的是,为了正确地使用向量的方向,需要保证三角形 ABC 是逆时针方向的,也就是计算ABXAP,BCXBP,CAXCP,顺序不能乱,并且结果要同时大于0或小于0才满足点在三角形内部。

#include <iostream>
using namespace std;

struct Point
{
	double x;
	double y;
};

bool IsInsideTriangle(Point p, Point A, Point B, Point C)
{
	double AB = (B.x - A.x) * (p.y - A.y) - (B.y - A.y) * (p.x - A.x);
	double BC = (C.x - B.x) * (p.y - B.y) - (C.y - B.y) * (p.x - B.x);
	double CA = (A.x - C.x) * (p.y - C.y) - (A.y - C.y) * (p.x - C.x);

	if (((AB > 0 && BC > 0 && CA > 0) || (AB < 0 && BC < 0 && CA < 0)))
		return true;
	else
		return false;
}
int main()
{
	Point A, B, C, p;
	cout << "请输入A点坐标:";
	cin >> A.x >> A.y;
	cout << "请输入B点坐标:";
	cin >> B.x >> B.y;
	cout << "请输入C点坐标:";
	cin >> C.x >> C.y;
	cout << "请输入p点坐标:";
	cin >> p.x >> p.y;
	if (IsInsideTriangle(p, A, B, C))
	{
		cout << "Point is inside the triangle." << endl;;
	}
	else
	{
		cout << "Point is outside the triangle." << endl;;
	}
	return 0;
}


                      
 

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值