闭合轮廓绕组数的算法

时间:2015-10-20 21:52:58

标签: algorithm computational-geometry hlsl

我们说我的轮廓形状由两个函数x(p)y(p)定义,其中p是沿着形状周长行进的距离,在{之间标准化{1}}和0。例如,关于原点的单位圆将定义为1x(p) = sin(2 * pi * p)

确定点是否在该圆内的简单测试是计算点与原点的距离,然后检测该距离是否小于或等于y(p) = cos(2 * pi * p)

但是,如果我的形状有多个交叉点,并且比圆形更复杂呢?

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

3 个答案:

答案 0 :(得分:1)

如果您知道形状内部(或外部)的点并且形状是平滑且不相交的,则可以将已知点连接到任何其他点并计算它穿过边界的次数。偶数次意味着未知点在内部(或外部)类似。奇数意味着相反的情况。

这是基于Jordan Curve定理。我记得,定理证明需要匝数,但应用非常简单。

答案 1 :(得分:1)

如何计算闭合曲线的总曲率(假设它在任何地方都是可微的),然后除以2PI?请参阅Wiki的Total Curvature页面here

答案 2 :(得分:1)

在多边形测试中推广点,您可以找到y(p)=0的所有解x(p)>0,并使用其数字的奇偶校验。

如果是圆圈,则cos(2πp)=0p=(k+1/2)πp范围内[0,1)只有一个值sin(2πp)>0

如果你可以解析地解决y方程那么好。否则你需要一个可靠的数值求解器,能够发现所有根。另一种方法是展平曲线(将其绘制为折线,确保最大偏差容差),并应用多边形算法。

enter image description here

为了第二个例子,让我们考虑Pascal的limaçon与等式r = 0.5 + cos Θ,以及一些测试点X

enter image description here

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

代表Θ=02π/3π4π/3。相应的横坐标为1.500.50

您可以得出结论,X轴上的内部点位于0.51.5之间(也在0处,以简并的方式)。