2016-05-29 88 views
0

我正在使用多边形链来近似曲线。我想逼近曲线上所有点的曲率函数的平均值。我需要的一个曲率函数是,例如曲率的平方。计算具有不均匀分段长度的多边形链的平均曲率

我可以通过选择链上的某些点,计算这些点的曲率,对其应用函数(例如对其进行平方),然后对所计算的值进行平均来得到接近的结果。

我需要准确性和速度。我欣赏这两个 - 快速,但近似;以及准确但缓慢的解决方案。我正在使用Java,但答案不需要用Java编写 - 甚至根本不需要包含任何代码。

具有均匀段长度

如果多边形链的段都具有相等的长度多边形链,我可以计算顶点的曲率和进行平均这一点。我看到了两种方法来获得顶点的曲率。

一种方法是获取通过选定顶点,顶点之前和之后的顶点的圆。曲率是1 /半径的圆。

另一种方法是计算在所选择的顶点连接的两个区段的外部角度(以弧度为单位),然后通过一个段的长度除以它的绝对值。在下图中,φ标志着外角:

我不知道如果此方法是正确的,因为我没有数学推导,但它提供了一种类似于我已经通过实验发现结果到上面的方法。

具有非均匀段长度

多边形链不幸的是,有没有保证该段有统一的长度。

如果我尝试使用上述第一种方法,连接到较长段的顶点给出较低的曲率,即使它们明显更清晰。我尝试用所选顶点之前的一个点x单位和点之后的一个点x单位替换前一个和下一个顶点。我不知道如何设置x不变,以获得准确的结果。我试过的所有值似乎都给出了不准确的结果。

如果我尝试使用第二种方法,我不知道用什么长度来分割角度。如果我根本没有分割任何东西,我实际上得到相当好的结果来比较两条曲线并确定哪条曲线更加曲线,但我需要能够确定一个点的实际曲率。

有了这两种方法,还有一个问题,即具有较短段(其中点较密集)的部件会对平均值影响更大。

另一个可能的解决方案是忽略顶点,而是使用均匀间隔的链条上的一系列点,将它们视为新的多边形链(用直线连接点),然后计算曲率在这个新的链条上,使用我在标题为“具有均匀链段长度的多边形链”标题下提到的方法之一。然而,找到这样一个点的数组并不是微不足道的,因为我必须选择一个段的长度,并且只有在产生这些点之后,我才能看到所得到的链的长度是否可以被选定的段长度整除。

回答

1

如果你不是空间不足,你提到的最后的解决方案是最好的,因为“球”逼近,为你也许意识到,将给予更极端的情况下可怕的结果,尤其是曲率很大或变化很快。

有很多方法可以做到插值,其中最简单的二次和三次样条。但是,如果你有更多的前处理时间,拉格朗日多项式产生了很好的效果:https://en.wikipedia.org/wiki/Lagrange_polynomial。在你的角度划分方法


侧面说明,认为这个图:

enter image description here

(从简单的几何形状的内角有 THETA)

enter image description here

对于a << l。所以曲率:

enter image description here

所以你逼近其实正确为小曲率。

+0

感谢您的回答。 :)但我需要一些澄清。通过“最后一个解决方案”,你的意思是找到一个新的数组* *是*等间距的?这不是一个完整的解决方案。如果我这样做,我只能将问题减少到计算具有*统一*段长度的多边形链的平均曲率。我仍然必须使用1/circle_radius或角度/长度方法。 所以,你是在暗示我找到一个新的,类似的链条,一个是确实有统一的长度的线段,然后使用角度/长度的方法,因为球近似可以给坏的结果。那是对的吗? – user2623008

+1

@ user2623008我建议你计算出一个新的等距阵列具有良好的(但可能是昂贵的,像拉格朗日事)方法,_if只有if_你不介意,我已经试过了预计算时间 – 2016-05-31 16:48:21

+0

这样做有卡特莫尔-Rom样条曲线,但我遇到了一些问题。如果我在Catmull-Rom样条上取两个* d *单位的点,则它们可能在用直线连接时彼此更接近,这意味着生成的多边形链可能在段长度上不均匀。如果我试图找到样条曲线上实际上间隔相等(用直线)的点,则计算起来会更昂贵,最后一点可能与原始点的最后一点不同。但是,对于一个新问题,这已经成熟了。再次感谢您的帮助。 :) – user2623008

1

一种替代方法是使用局部抛物线近似来估计曲率。基本上,为了估计点P(i)处的曲率,可以取P(i-1),P(i)和P(i + 1)并从这3个点构造一个抛物线。然后,从抛物线计算P(i)处的曲率。请记住在构建抛物线时使用弦长(或向心)参数化。

+0

感谢您的回答。是的,对于具有统一线段长度的多边形链来说,这确实是一种有效的方法。你认为这会比用圆圈做更好吗?曲率通常被定义为半径的倒数,所以一个圆是我想到的第一个东西。另外,我认为我需要四点,因为有三点无限多的抛物线。 – user2623008

+1

你只需要3分来创建一个抛物线,抛物线基本上是一个2次多项式。根据我的经验,使用抛物线的局部近似将比使用圆弧获得更好的结果。但总有例外。 – fang

+0

感谢您的回复。是的,你是对的,你只需要三点。我不知道我在想什么。 – user2623008