繁体   English   中英

找到立方B样条的长度

[英]Finding the length of a cubic B-spline

使用SciPy的的interpolate.splprep功能得到参数参数样条u ,但域u是不是花的线积分,这是输入的分段线性连接坐标。 我试过integrate.splint ,但只是给个人积分超过u 显然,我可以数字地整合一堆笛卡尔差分距离,但我想知道是否有闭合形式的方法来获得我忽略的样条或样条线段(使用scipy或numpy)的长度。

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

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

因为x和y都是立方参数函数,所以在简单函数方面没有封闭的解决方案。 数值整合是要走的路。 集成弧长表达式或简单地添加线段长度 - 取决于您所追求的准确性以及您想要施加多少努力。

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

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

你可以在这里找到一些Delphi代码: 链接文本

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM