具有光线对齐边的多边形的多边形测试中的光线投射点

时间:2017-01-06 12:03:32

标签: computational-geometry point-in-polygon

我尝试将以下代码用于Even-Odd Rule from Wikipedia

# x, y -- x and y coordinates of point
# poly -- a list of tuples [(x, y), (x, y), ...]
def isPointInPath(x, y, poly):
        num = len(poly)
        i = 0
        j = num - 1
        c = False
        for i in range(num):
                if  ((poly[i][1] > y) != (poly[j][1] > y)) and \
                        (x < (poly[j][0] - poly[i][0]) * (y - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]):
                    c = not c
                j = i
        return c

不幸的是,当我的测试点与其中一个水平边缘对齐时,它为我的简单直线多边形给出了错误的结果

     -----
     |   |
     | x  ----|
  x  |--------|

将水平边缘视为边缘会使两个点都被视为在内,而忽略水平边缘会使两个点都被视为外部

那么如何才能使偶数规则适用于这样的多边形呢?或建议替代算法?

1 个答案:

答案 0 :(得分:0)

here的以下规则似乎有效

  

边缘交叉规则

     

向上边缘包括其起始端点,并排除其最终端点;

     

向下边缘排除其起始端点,并包括其最终端点;

     

排除水平边

     

边缘光线交点必须严格地位于P点右侧。

请注意,上述规则遵循

的惯例
  

左侧或底部边缘上的点位于内侧,右侧或上侧边缘上的点位于外侧。这样,如果两个不同的多边形共享一个公共边界段,那么该段上的一个点将位于一个多边形或另一个多边形中,但不能同时位于两个多边形中。

此外,作者还指出,此方法仅适用于简单(非自相交)多边形。 它还建议使用绕线数的有效实现,而不是更好地处理非简单多边形