可以使用着名的光线投射算法轻松确定一个点是否在凸多边形中。
def point_inside_polygon(x, y, poly):
""" Deciding if a point is inside (True, False otherwise) a polygon,
where poly is a list of pairs (x,y) containing the polygon's vertices.
The algorithm is called the 'Ray Casting Method' """
n = len(poly)
inside = False
p1x, p1y = poly[0]
for i in range(n):
p2x, p2y = poly[i % n]
if y > min(p1y, p2y):
if y <= max(p1y, p2y):
if x <= max(p1x, p2x):
if p1y != p2y:
xinters = (y-p1y) * (p2x-p1x) / (p2y-p1y) + p1x
if p1x == p2x or x <= xinters:
inside = not inside
p1x, p1y = p2x, p2y
return inside
但是,如果多边形不是完全凸起的呢?
在给定边界点的情况下,如何确定某点是否位于随机形状多边形中?
假设我有一个边界点的多边形,如此
我该怎么办?
最好是在Python中,但也欢迎任何通用解决方案。
答案 0 :(得分:0)
投射光线,并计算光线穿过多边形的次数。 (如果边缘恰好沿着光线,这可能会令人烦恼并容易出错。)如果它是奇数,则该点位于多边形中。否则,它不是。
答案 1 :(得分:0)
实际上,如果你使用光线投射方法,它将起作用 非零绕线数规则,而不是常见的奇偶规则。
这是在Adobe的 Postscript语言参考中解释的方式(其中“path”一词表示定义多边形的多边形顶点列表)。
非零绕组数规则确定给定点是否为 通过从概念上将光线从该点绘制到路径中 在任何方向无限,然后检查一个地方 路径的一部分穿过光线。从0开始计算 每次路径段从左到右穿过光线时,规则会增加1 每当一个片段从右到左穿过时,右和减1。 在计算了所有的交叉点后,如果结果为0则该点为 在路径之外;否则就在里面。