2009-10-04 88 views
4

如果我有一个特定长度的Catmull-Rom spline我如何计算它在某个距离的位置?通常为了计算catmull rom样条曲线中的点,您需要输入一个介于0和1之间的值以通过比例来获得它的位置,我怎样才能做到这一点?例如,如果我的样条长度为30单位,我怎样才能在距离8处获得它的位置?在一定距离之后获取一个catmull rom样条曲线的点吗?

我问的原因是因为它看起来像在[0,1]域中给出点的catmull rom样条曲线并不能保证它会给你到该样条曲线的距离处的点,例如,如果我输入0.5到一个长度为30的catmull romspline并不意味着我会在距离为15的样条线上获得位置,除非样条线本身实际上是一条直线。

回答

3

通常的方法是存储每个段的长度然后找出用ε值增加t的线段的部分长度,然后计算2点之间的线性距离,直到找到答案。显然,你的epsilon越小,得到的结果就越好,但它会产生出人意料的好结果。我用这种方法沿着一个catmul-ROM以恒定的速度移动,你看不到它加速和减速......它以恒定的速度移动。显然取决于你的细分市场有多紧张,你的epsilon价值将需要改变,但一般来说,你可以选择一个“足够好”的epsilon,一切都会好起来的。

找到答案非迭代是INCREDIBLY昂贵(我已经看到了派生,而回来,它不漂亮;))。你必须有一个微小的小量价值得到更糟糕的表现......

3

另一个链接: Adaptive Subdivision of Bezier Curves在反谷物几何库
主要是对像素 网格绘制贝塞尔曲线的不同问题用宽刷子,但看到最后。
(增加:) Antigrain也有一个可爱的例子/ bspline.cpp 其中你可以移动节和改变中间点的数量。

+0

我刚刚听说过AGG库,但我对它印象非常深刻。 – tfinniga 2009-10-09 15:46:45

1

Goz的回答是准确的 - 这是一个related discussion about length of Bezier curves。海报的总结是,计算(而且更简单)做一个近似比计算确切的答案。这适用,因为您可以更改参数样条曲线的基础,因此您可以将Catmull-Rom曲线转换为贝塞尔曲线段。

对于近似值,基本上将其分解为具有简单分析长度的基元,然后将所有简单长度相加。虽然大多数人使用线段,但您确实倾向于收缩。您可以通过使用小段来最小化误差,但近似值总是小于非线性曲线的真实长度。

如果您需要更高的准确性,可以使用paper from jgt讨论如何使用圆作为逼近原语,这显然更快/更准确但实现起来并不困难。它们包括一个示例C实现。

相关问题