找到立方B样条的长度

时间:2010-02-02 01:27:47

标签: python scipy interpolation

使用scipy的interpolate.splprep函数获取参数u的参数样条曲线,但u的域不是样条曲线的线积分,它是输入的分段线性连接坐标。我尝试了integrate.splint,但这只是给出了u以上的个体积分。显然,我可以数字地整合一堆笛卡尔差分距离,但我想知道是否有闭合形式的方法来获得我正在忽略的样条或样条线段(使用scipy或numpy)的长度。

编辑:我正在寻找一种封闭形式的解决方案或一种非常快速的方法来收敛机器精度答案。我几乎放弃了数字根寻找方法,现在主要是在一个封闭形式的答案之后。如果任何人有任何积分椭圆函数的经验或者可以指向一个好的资源(除了Wolfram),那就太好了。

我将尝试使用Maxima尝试获得我认为样条曲线的一个片段的函数的无限积分:我在MathOverflow上交叉发布

2 个答案:

答案 0 :(得分:6)

因为x& y是立方参数函数,就简单函数而言,没有封闭的解决方案。数值整合是要走的路。无论是积分弧长表达还是简单地添加线段长度 - 取决于您所追求的精确度以及您想要施加多少努力。

准确而快速的“添加线段长度”方法:

使用recurvise细分(de Casteljeau算法的一种形式)生成点,可以以最少的点数为您提供高度精确的表示。 如果它们不符合标准,则仅细分细分。通常,标准基于连接控制点(船体或笼子)的长度。 对于立方,通常比较P0P1 + P1P2 + P2P3与P0P3的接近程度,其中P0,P1,P2& P3是定义贝塞尔曲线的控制点。

你可以在这里找到一些Delphi代码: link text

转换为Python应该相对容易。 它会产生积分。代码已经计算了段的长度以测试标准。您可以在此过程中简单地累积这些长度值。

答案 1 :(得分:4)

您可以将函数sqrt(x'(u)**2+y'(u)**2)集成到u上,您可以使用scipy.interpolate.splev计算坐标的导数x'y'。可以使用scipy.integrate中的一个例程完成集成(quad精确[Clenshaw-Curtis],romberg通常更快)。这应该更精确,并且可能比添加大量小距离更快(相当于与矩形规则集成)。