我使用多边形链来近似曲线。我想近似曲线上所有点的曲率函数的平均值。我需要的一个曲率函数是,例如,曲率的平方。
我可以通过选择链上的某些点,计算这些点的曲率,在其上应用函数(例如对其进行平方),然后对计算值进行平均来接近它。
我需要准确性和速度。我很欣赏 - 快速,但近似;以及准确但缓慢的解决方案。我在Java工作,但答案不需要用Java编写 - 它根本不需要包含任何代码。
如果多边形链的段都具有相同的长度,我可以计算顶点中的曲率然后对其求平均值。我看到两种方法来获得顶点的曲率。
一种方法是获取穿过所选顶点的圆,即前面的顶点和后面的顶点。然后曲率为1 /圆的半径。
另一种方法是计算在所选顶点处连接的两个分段的外部角度(以弧度表示),然后将其绝对值除以分段的长度。在下图中,φ标记外角:
我不确定这种方法是否正确,因为我没有在数学上得出它,但我通过实验注意到它给出了与上述方法类似的结果。
不幸的是,不能保证段的长度一致。
如果我尝试使用上述第一种方法,连接到较长段的顶点会产生较低的曲率,即使它们明显更清晰。我尝试用前面的x个单位替换前一个和下一个顶点,然后选择一个点x个单位。我不知道将x常数设置为什么,以获得准确的结果。我试过的所有价值似乎都给出了不准确的结果。
如果我尝试使用第二种方法,我不知道分割角度的长度。如果我没有任何分数,我实际上得到了很好的结果,比较两条曲线并确定哪条曲线是曲线的,但我需要能够确定一个点的实际曲率。
使用这两种方法还存在这样的问题:具有较短片段的部分(其中点更密集)将影响平均值。
另一种可能的解决方案是忽略顶点,而是使用 均匀间隔的链上的点阵列,将它们视为新的多边形链(用直线连接点),然后使用我在标题为“具有均匀段长度的多边形链”标题下提到的方法之一来计算这条新链上的曲率。
但是,找到这样一个点数组并不是一件容易的事,因为我必须选择一个段长度,并且只有在生成点之后,我才能看出结果链的长度是否可以被所选的段长度整除。 / p>
答案 0 :(得分:1)
如果你不缩短空间,你提到的最后一个解决方案将是最好的,因为"球体"你可能已经意识到,逼近会在更极端的情况下产生可怕的结果,尤其是曲率很大或快速变化时。
有许多方法可以进行插值,最简单的方法是二次和三次样条。但是,如果您有更多的预处理时间,拉格朗日多项式会产生非常好的结果:https://en.wikipedia.org/wiki/Lagrange_polynomial。
关于角度划分方法的旁注,请考虑此图:
(从简单的几何形状开始,内部角度也 theta)
a << l
。所以曲率:
因此,对于小曲率,您的逼近实际上正确。
答案 1 :(得分:1)
另一种方法是使用局部抛物线近似来估计曲率。基本上,为了估计点P(i)处的曲率,你取P(i-1),P(i)和P(i + 1)并从这3个点构造抛物线。然后,从抛物线计算P(i)处的曲率。记住在构造抛物线时使用弦长(或向心)参数化。