简单快速判断一点是否在三角形内

我们最常见的是可能是“重心法” “内角和法”,“面积法”,今天我在这里讨论使用一种三角形的逆时针和顺时针方法,其实也是同向法。

一、p 点必须在AB和AC所形成的夹角内,这样△BAP和△CAP必须是一个顺时针和一个逆时针,也就是同为逆时针或同为顺时针时,点P肯定不在△ABC内。

二、 若条件一符合,则在判断△ABP和△CBP的情况,因为我们已经知道△BAP,而△ABP和它相反,所以只要判断△CBP和△BAP是否同为逆时针或顺时针就可以判断三角形的情况

三、就是在边界上的一些特殊处理。

而三角的顺时针和逆时针可以用向量的叉乘判断。

dfd              

总结:次算法一般要用两次叉乘,最多用三次叉乘就可以判断得出。最近在网上查资料很多都是用面积方法,而面积方法都是要使用四次叉乘才可以得到。

PS:若有不足之处欢迎大家指正

 1  public double DotPoints(Point p1,Point p2,Point p3)
2 {
3 return ((p1.X - p2.X) * (p3.Y - p2.Y) - (p1.Y - p2.Y) * (p3.X - p2.X));//向量的叉乘
4 }
5 //判断点p 是否在点A、B、C构成的三角行内,若点P在三角形边上也认为在三角行内
6 public bool isInTriangle(Point A, Point B, Point C, Point P)
7 {
8 double ca, ba, cb;
9 ca = DotPoints(C, A, P);
10 ba = DotPoints(B, A, P);
11 if ((ca > 0 && ba > 0) || (ca < 0 && ba < 0))//若同位逆时针或同为顺时针时则不在三角形内
12 return false;
13 if (ca == 0 && ba == 0) return true;//在A点上的情况
14 cb = DotPoints(C, B, P);
15 if (cb == 0) return true;//在BC边上,也可能B,或C点
16 if (ba == 0)//和AB边共线的情况
17 {
18 if ((ca > 0 && cb > 0) || (ca < 0 && cb < 0))//不在ACB夹角内
19 return false;
20 else return true;//在AB边上
21 }
22 if ((ba > 0 && cb > 0) || (ba < 0 && cb < 0))//在三角形内
23 return true;
24 else return false;
25 }

posted on 2011-12-07 23:49  青悠我♡  阅读(1520)  评论(1编辑  收藏  举报

导航