闭合轮廓的绕数算法
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)=0
为p=(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
对于 Θ=0
、2π/3
、π
、4π/3
。对应的横坐标为1.5
、0
、0.5
和0
.
您可以得出结论,X 轴上的内部点在 0.5
和 1.5
之间(也在 0
以退化的方式)。
假设我有一个由两个函数 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)=0
为p=(k+1/2)π
,p
范围内只有一个值[0,1)
使得sin(2πp)>0
.
到目前为止,如果您可以解析地求解 y
方程,那就太好了。否则,您将需要一个可靠的数值求解器,能够找出所有的根。另一种方法是使曲线变平(将其绘制为折线,确保最大偏差容差),然后应用多边形算法。
为了第二个例子,让我们用等式 r = 0.5 + cos Θ
和沿 X
.
y = (0.5 + cos Θ) sin Θ = 0
对于 Θ=0
、2π/3
、π
、4π/3
。对应的横坐标为1.5
、0
、0.5
和0
.
您可以得出结论,X 轴上的内部点在 0.5
和 1.5
之间(也在 0
以退化的方式)。