我们说我的轮廓形状由两个函数x(p)
和y(p)
定义,其中p
是沿着形状周长行进的距离,在{之间标准化{1}}和0
。例如,关于原点的单位圆将定义为1
和x(p) = sin(2 * pi * p)
。
确定点是否在该圆内的简单测试是计算点与原点的距离,然后检测该距离是否小于或等于y(p) = cos(2 * pi * p)
。
但是,如果我的形状有多个交叉点,并且比圆形更复杂呢?
对由一组点定义的离散形状进行point in polygon测试。该算法非常容易找到,因为它在很多地方使用过。但是,如果我不想使用我的形状的离散定义,我可以使用什么算法来确定绕组数,假设形状是在编译时定义的?
答案 0 :(得分:1)
如果您知道形状内部(或外部)的点并且形状是平滑且不相交的,则可以将已知点连接到任何其他点并计算它穿过边界的次数。偶数次意味着未知点在内部(或外部)类似。奇数意味着相反的情况。
这是基于Jordan Curve定理。我记得,定理证明需要匝数,但应用非常简单。
答案 1 :(得分:1)
如何计算闭合曲线的总曲率(假设它在任何地方都是可微的),然后除以2PI?请参阅Wiki的Total Curvature页面here。
答案 2 :(得分:1)
在多边形测试中推广点,您可以找到y(p)=0
的所有解x(p)>0
,并使用其数字的奇偶校验。
如果是圆圈,则cos(2πp)=0
为p=(k+1/2)π
,p
范围内[0,1)
只有一个值sin(2πp)>0
。
如果你可以解析地解决y
方程那么好。否则你需要一个可靠的数值求解器,能够发现所有根。另一种方法是展平曲线(将其绘制为折线,确保最大偏差容差),并应用多边形算法。
为了第二个例子,让我们考虑Pascal的limaçon与等式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
处,以简并的方式)。