如何确定路径的长度?


Answers:


7

如先前的回答所述,计算贝塞尔曲线的长度非常困难(不可能吗?)。我会说100%的游戏使用的是长度的近似值,几乎总是足够准确。

几个月前,我使用建议的方法将曲线分成“小”段并增加其长度来实现。有一个C ++实现的例子在这里


11

测量贝塞尔曲线的长度很困难。如果您不介意有一点点误差,那么一个简单的解决方案就是用直线近似贝塞尔曲线并计算线长的总和。您创建的细分越多,近似值越好。


我可能会考虑这一点,但是如何确定我应该拥有多少个路段以及如何映射这些路段以使其路径上有起点和终点呢?这个技术有名字吗?(因此我在Google上进行了搜索)
Valentin Radu

一种简单的方法是仅使用从B(0)B(1)的点的线性分布...就像您实际用来绘制曲线的方法一样。查看Dan的答案中的源代码。
bummzack,2011年

我很乐意解释投票
否决权

7

必须近似高阶(即大于1阶)样条长度参数化;它不能直接表示,因此要找到直接的解决方案并不容易。

一些现有的实现(复制粘贴代码):

这组作者说,使用Chebyshev逼近法,精度随着曲线尺寸的增加而提高。请看第7-8页的伪代码,其余部分是对其他算法的描述,基于这些算法,您可以忽略它们。在线上有许多参考资料将此方法称为一种很好的方法。

另请参见这些简洁的方法。


5

最初是作为对@bummzack答案的评论的评论,但时间过长。

我如何确定我应该有多少段

有两种方法。第一个只是用于绘制贝塞尔曲线的标准算法:控制点形成曲线的边界框,因此,如果所有控制点都在从起点到终点的线段的epsilon内,则您近似为一条线;否则,您可以使用de Casteljau算法进行细分。根据最终结果中希望的误差选择Epsilon。(对于渲染,通常为0.5像素)。

另一种方法是使用间隔算法的改进。以从头到尾的线的长度为下限,以通过控制点的线的长度之和为上限。同样,根据最终错误要求进行细分。

通常可以在t = 0.5处进行细分,但是de Casteljau的算法允许在任意点进行分割,因此,如果您具有控制点C_0至C_3的三次贝塞尔曲线,并且C_2比C_1更接近端点之间的线段,则可能会发现在1/3或2/3之一会给出更严格的界限。我还没有研究过代数来证明哪种方法更好,但是如果您愿意,您可以进行实验并提出报告。如果没有别的,我想指出的是那里的选项。


3

可以通过对sqrt((dx / dt)²+(dy / dt)²)进行积分来计算参数化曲线的长度,其中dx / dt是曲线的x分量的导数,dy / dt是曲线的y分量的导数。在贝塞尔样条曲线的情况下,这两个是相同的,因为方程可以扩展到任意维度。

三次贝塞尔样条曲线的公式如下:B(t)=(1-t³)* P0 + 3(1- t)²t* P1 + 3(1- t)t²* P2 +t³P3其中P0至P3是控制点。

根据Wolfram | Alpha,此公式的导数为:d(B(t))/ dt = 3(t(t(P3-P0)+ P2(2-3t)+ P1(3t²-4t + 1))

现在,您可以将其重新放入曲线长度的方程式中,并计算从t = 0到t = 1的积分。不幸的是,当我尝试这样做时,Wolfram | Alpha会超时。但是,您可以进行数值积分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.