【发布时间】: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