闭合轮廓的绕数算法

Algorithm for the Winding Number of a Closed Contour

假设我有一个由两个函数 x(p)y(p) 定义的等高线形状,其中 p 是沿着形状周长移动的距离,在 [=13] 之间归一化=] 和 1。例如,关于原点的单位圆将定义为 x(p) = sin(2 * pi * p)y(p) = cos(2 * pi * p).

确定一个点是否在该圆内的一个简单测试是计算该点与原点的距离,然后检测该距离是否小于或等于 1.

但是如果我的形状有多个交叉点,并且比圆形复杂得多怎么办?

对于由一组点定义的离散形状存在 point in polygon 测试。这个算法很容易找到,因为它被用在很多地方。但是如果我不想使用我的形状的离散定义,我可以使用什么算法来确定绕组数,假设形状是在编译时定义的?

如果你知道一个点在形状内部(或外部)并且形状光滑且不相交,那么你可以将已知点连接到任何其他点并计算它越过边界的次数.偶数次表示未知点同样位于内部(或外部)。奇数表示相反。

这是基于乔丹曲线定理。我记得,定理的证明需要绕数,但是应用起来很简单。

如何计算闭合曲线的总曲率(假设它处处可微),然后除以 2PI?请参阅 Wiki 的总曲率页面 here

推广多边形测试中的点,您可以找到 y(p)=0 的所有解决方案,使得 x(p)>0 并使用它们的奇偶性。

在圆的情况下,cos(2πp)=0p=(k+1/2)πp范围内只有一个值[0,1)使得sin(2πp)>0.

到目前为止,如果您可以解析地求解 y 方程,那就太好了。否则,您将需要一个可靠的数值求解器,能够找出所有的根。另一种方法是使曲线变平(将其绘制为折线,确保最大偏差容差),然后应用多边形算法。


为了第二个例子,让我们用等式 r = 0.5 + cos Θ 和沿 X.

的一些测试点来考虑 Pascal 的 limaçon

y = (0.5 + cos Θ) sin Θ = 0

对于 Θ=02π/3π4π/3。对应的横坐标为1.500.50.

您可以得出结论,X 轴上的内部点在 0.51.5 之间(也在 0 以退化的方式)。