我尝试将以下代码用于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 |--------|
将水平边缘视为边缘会使两个点都被视为在内,而忽略水平边缘会使两个点都被视为外部
那么如何才能使偶数规则适用于这样的多边形呢?或建议替代算法?
答案 0 :(得分:0)
here的以下规则似乎有效
边缘交叉规则
向上边缘包括其起始端点,并排除其最终端点;
向下边缘排除其起始端点,并包括其最终端点;
排除水平边
边缘光线交点必须严格地位于P点右侧。
请注意,上述规则遵循
的惯例左侧或底部边缘上的点位于内侧,右侧或上侧边缘上的点位于外侧。这样,如果两个不同的多边形共享一个公共边界段,那么该段上的一个点将位于一个多边形或另一个多边形中,但不能同时位于两个多边形中。
此外,作者还指出,此方法仅适用于简单(非自相交)多边形。 它还建议使用绕线数的有效实现,而不是更好地处理非简单多边形