向量法:若点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;
}