2016-04-22 92 views
1

我目前正在使用基於唯一B樣條定義的路徑。 B樣條由一組控制點和結值給出。控制點和節點的數量可能會有所不同(並保持一致)。沿着B樣條的長度測量

使用De Boor算法,我可以評估曲線上的位置並獲得這些位置的正切值。 目前爲止這麼好。

現在如何測量(/近似)沿B樣條路徑的弧長?

+0

嗨,歡迎來到堆棧溢出,這只是一個消息,我發送給新成員,以幫助一點點。新用戶的學習曲線並非如此陡峭,但瞭解如何使用堆棧並不總是顯而易見的。請花幾分鐘時間看看這裏[問],這也很重要,看這裏.. [mcve] ..此外,如果答案對你有效,請點擊答案左邊的勾號,以便該問題被標記爲已回答 – Claudius

+0

De Boor使事情變得簡單,但會省略有關曲線本身的任何信息,而不是它給出的內容。如果你確實需要一些分析方法而不是使用Codor的答案(這在每個真實世界的應用程序中都能正常工作),那麼實際上需要計算基函數,然後在每個多項式分段上使用解析曲線積分。 – Aziuth

+0

是的,你需要計算一個從t = t_start到t = t_end的定積分| d point(t)/ dt | dt –

回答

2

數值上,可以通過在樣條線上生成一些等距點,在它們之間測量它們並總結這些距離。使用的點越多,近似值越精確。

+0

我不認爲他們需要等距離,儘管這可能會讓你得到給定數量的點最準確的答案。例如。它應該足以反覆挑選歐幾里德距離最大的一對相鄰點,並創建一個新點,其參數值在它們之間的中點(TTBOMK,這通常*不會*將新點放在沿着相等距離的位置從另外兩個曲線)。 –

+0

的確,我做到了。如果我希望達到最低精度,這很重。 (再次)我希望找到任何算法的特殊屬性以獲得良好的近似值。 – Gav

0

arc-length of a parametric curve

⌠₁ ________________ 
⎮ √ dx(t)² + dy(t)² dt 
⌡₀ 

或者,積分其切線的整個曲線上的長度。 對於t < - (0,1);統一的參數化。

首先,您需要將bspline曲線轉換爲複合貝塞爾樣條曲線。 這是通過插入「結」(伯姆算法) http://www.infogoaround.org/JBook/bstobez.html

對於貝塞爾曲線,我們可以非常容易地計算每個點的切線。 並使用數值積分算法,如Gauss-Legendre quadrature來整合切線的長度。

這是一個demo in javasript使用paper.js的代碼庫。

請注意,算法是非常準確的(在浮點數學範圍內,上面的維基百科鏈接有一個更好的例子)。 由於N點Gaus​​s-Legendre積分對於2N-1次多項式是精確的。 演示中誤差的大小主要是由於圓形不能完全表示爲均勻的貝塞爾曲線,所以我們的曲線只是一個近似值。

+0

非常感謝。聽起來不錯。我會消化和測試這個。我會回到這個反應。再次感謝。 – Gav