指向随机形状的多边形?

时间:2013-11-22 06:59:52

标签: python algorithm

可以使用着名的光线投射算法轻松确定一个点是否在多边形中。

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

但是,如果多边形不是完全凸起的呢?

在给定边界点的情况下,如何确定某点是否位于随机形状多边形中?

假设我有一个边界点的多边形,如此

enter image description here

我该怎么办?

最好是在Python中,但也欢迎任何通用解决方案。

2 个答案:

答案 0 :(得分:0)

投射光线,并计算光线穿过多边形的次数。 (如果边缘恰好沿着光线,这可能会令人烦恼并容易出错。)如果它是奇数,则该点位于多边形中。否则,它不是。

答案 1 :(得分:0)

实际上,如果你使用光线投射方法,它将起作用 非零绕线数规则,而不是常见的奇偶规则

这是在Adobe的 Postscript语言参考中解释的方式(其中“path”一词表示定义多边形的多边形顶点列表)。

  

非零绕组数规则确定给定点是否为   通过从概念上将光线从该点绘制到路径中   在任何方向无限,然后检查一个地方   路径的一部分穿过光线。从0开始计算   每次路径段从左到右穿过光线时,规则会增加1   每当一个片段从右到左穿过时,右和减1。   在计算了所有的交叉点后,如果结果为0则该点为   在路径之外;否则就在里面。