判断点P是否在三角形ABC内部
(1)计算叉乘
MA = PA×PB
MB = PB×PC
MC = PC×PA
(2)叉乘算法
PA×PB = (A-P)×(B-P)
= (Xa-Xp)(Yb-Yp)-(Ya-Yp)(Xb-Xp)
(3)判定
如果全部大于0或者全部小于0(由于三角形三个点顺序取反了)则P在三角形内部
否则在边线上或者在三角形外部.
(1)计算叉乘
MA = PA×PB
MB = PB×PC
MC = PC×PA
(2)叉乘算法
PA×PB = (A-P)×(B-P)
= (Xa-Xp)(Yb-Yp)-(Ya-Yp)(Xb-Xp)
float Cross(Vector2 p, Vector2 a, Vector2 b)
{
return (a.x-p.x)*(b.y-p.y)-(a.y-p.y)*(b.x-p.x);
}
(3)判定
如果全部大于0或者全部小于0(由于三角形三个点顺序取反了)则P在三角形内部
否则在边线上或者在三角形外部.
bool IsInTriangle(Vector2 a, Vector2 b, Vector2 c, Vector2 p)
{
float ma = Cross(p, a, b);
float mb = Cross(p, b, c);
float mc = Cross(p, c, a);
return (ma>0 && mb>0 && mc>0) || (ma<0 && mb<0 && mc <0);
}
(4)必要条件判定
<1>如果点P不在三角形的包围矩形内, 则点不在三角形内
<2>如果点P到三角形内某个点G(比如重心, 或者某个顶点)的距离,大于所有三个点到这个点G的距离, 则点P不在三角形内