【问题标题】:Ray casting point in polygon test for polygon with ray-aligned edges具有光线对齐边缘的多边形的多边形测试中的光线投射点
【发布时间】:2017-01-09 11:25:16
【问题描述】:

我尝试将以下代码用于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  |--------|

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

那么我怎样才能使奇偶规则适用于这样的多边形呢?或者建议替代算法?

【问题讨论】:

  • 与非轴对齐的光线相交,例如光线在 45 度。
  • 这是否意味着奇偶规则(或任何光线投射算法)不适用于边缘平行于光线投射方向的多边形?这是一个主要限制,不是吗?
  • 它可以更好地处理光线边缘重叠。如果光线与边缘重叠,则需要检查与边缘邻居(上一个边缘和下一个边缘)的相交。例如,在光线方向上将下一个边缘移动到上一个边缘并检查光线是否与连接的边缘相交或仅在一个点接触。如果您绘制光线与连接的边相交。如果几何形状是 U 形(在右侧添加一个部分),则光线只会接触连接的边缘。
  • 我不相信代码不起作用。在您的示例中,对于上十字,从上边缘开始,顺时针方向,if 测试将报告 false、false、false、true、false、false 并且点在里面;为下十字,假,假,假,真,假,真,点在外。能举个数值例子吗?

标签: computational-geometry point-in-polygon


【解决方案1】:

以下取自here 的规则似乎有效

边缘交叉规则

向上的边缘包括其起始端点,但不包括其最终端点;

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

水平边被排除

边缘射线的交点必须在点 P 的右侧。

请注意,上述规则遵循以下约定

左边或底边上的点在里面,右边或顶边上的点在外面。这样,如果两个不同的多边形共享一个公共边界段,则该段上的一个点将位于一个多边形或另一个多边形中,但不能同时位于两个多边形中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多