判断点在凸多边形內
判断点在凸多边形内的算法有很多,可以参考链接3,个人尝试使用了同侧法,此处也只解析这个方法
算法原理:
同侧法是判断点在向量哪一侧的一个方法,这个算法的概念是来自于参考文献一,参考文献一判断的是点在三角形内。
通过对这个算法的尝试,发现这个算法完全可是适用于任意凸多边形。
判断点在多边形内的设计思路也很简单,就是将凸多边形想象成首位相连方向都是顺时针或者是逆时针的一组向量(一定是AB,BC,CA,如下图,一定不能出现AB,BC,AC这种向量首尾不能衔接的情况),被凸多边形包住的点都在这组向量的一侧(顺时针都在右侧,逆时针都在左侧),
同侧法:
注意:此方法只适合凸多边形
python代码复现:
def SubPoint(point1, point2): x = point1[0] - point2[0] y = point1[1] - point2[1] return (x, y) def CrossProduct(point1, point2): return point1[0] * point2[1] - point1[1] * point2[0] def IsPointInConvexPolygon(pointlst, targetp): length = len(pointlst) if length == 0: ValueError("pointlst is wrong") nCurCrossProduct = 0.0 nLastValue = 0.0 for i in range(length): indbegin = i indend = i + 1 if indend == length: indend = 0 vU = SubPoint(targetp, pointlst[indbegin]) vV = SubPoint(targetp, pointlst[indend]) nCurCrossProduct = CrossProduct(vU, vV) if (i > 0 and (nCurCrossProduct * nLastValue <= 0)): return False nLastValue = nCurCrossProduct return True 参考链接二中C的代码
结果:
程序中,我创建了一张彩色图像,然后给与了六边形的六个顶点,遍历图像,将在六边形内的像素赋白色,在六边形外的像素赋黑色,得到结果如图
关于凹多边形不适用的说明:
说太多都是废话,直接上图,虽然图糙了点。很显然顺时针时,绿色部分在1、2、3、4、6的右侧,但是在5的左侧,因此凹多边形不适用。
参考链接:
https://zhuanlan.zhihu.com/p/106253152
https://www.cnblogs.com/calence/p/9988172.html
https://www.zhihu.com/question/27505636