2009-10-04 111 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實現。

相關問題