我想要关于点的闭合的分段线性路径(例如多边形)的winding number,但另外,我想检测路径何时通过该点。因此,我将标准绕组数加倍。对于具有CCW方向的非交叉多边形,该值将为:
同样在其他情况下。 (编辑:image of a few examples)
当点位于边缘或顶点时,我发现的每个算法都会失败。
我的另一个要求是,当所有输入(即点的坐标和路径的顶点)是整数时,它必须给出完全正确的结果。因此,这几乎排除了三角函数或平方根,并且必须谨慎使用除法。
我不需要处理具有两个连续重合点或180度转弯的退化路径。
无论如何,我想我有一个解决方案。然而,它似乎有点不优雅,我不相信它是正确的。 (我真的很困惑当点在顶点时会发生什么。)这是在python:
def orient((x,y), (a0,b0), (a1,b1)):
return cmp((a1-a0)*y + (b0-b1)*x + a0*b1-a1*b0, 0)
def windingnumber(p0, ps):
w, h = 0, [cmp(p, p0) for p in ps]
for j in range(len(ps)):
i, k = (j-1)%len(ps), (j+1)%len(ps)
if h[j] * h[k] == -1:
w += orient(p0, ps[j], ps[k])
elif h[j] == 0 and h[i] == h[k]:
w += orient(ps[k], ps[i], ps[j])
return w
Link to a version with comments and unit tests.
我想要一个正确算法的链接,或者我的算法正确的一些确认,或者我的算法失败的测试用例。谢谢!
答案 0 :(得分:3)
问题在于你的假设是错误的。
没有为轮廓上的点定义匝数。 (尤其没有很好地定义积分。)
如果您按两次相同的路径行驶,则会获得两倍的匝数。因此,如果您认为如果该点数在该计数上,则该数字为1是假的,那么这实际上意味着如果您去一次的蜿蜒数是1/2,但这显然是错误的,因为匝数始终是一个整数。