我使用B樣條曲線擬合來獲得一條平滑曲線。如果我獲得兩個光滑的B樣條,那麼我怎麼才能順利連接。例如,我有59個點((x0,y0,z0),...,(x58,y58,z58)),並且我有兩個擬合的B樣條。一個B樣條爲前30個點,另一個爲後30個點,兩個點共有一個公共點((x29,y29,z29))。由於曲線擬合,點(x29,y29,z29)將被修改兩次,並且會有兩個新的位置。如果我只連接兩個新位置,最終曲線在點(x29,y29,z29)處將不平滑。目前,我一起對所有數據執行曲線擬合,但會完全修改前30個點的平滑曲線。我希望只修改第一條平滑曲線的連接部分。我知道我需要在關節處施加相等的衍生物。我不知道該怎麼做。如何連接兩個擬合的B樣條曲線?
回答
看起來你正在用B樣條曲線或類似的東西做LS擬合,並且通常這樣獲得的B樣條不會通過任何數據點。這就是爲什麼兩個B樣條不符合共同點。
要解決此問題,您可以增強您的LS擬合功能,以將約束作爲輸入的一部分。在你的情況下,這些約束是線性的,因此你的問題仍然是線性的。完成此步驟後,可以預先計算公共點處的斜率,並約束B樣條曲線擬合公共點和常見斜率。這樣獲得的兩個B樣條至少在公共點處是G1連續的。儘管如此,實現受約束的LS擬合併不是一項簡單的任務,在這裏也不容易闡述。所以,你必須自己做一些「谷歌搜索」。另一種解決方案是「調整」兩個B樣條,使它們以G1方式連接。但是這樣做肯定會增加擬合誤差,因爲最小平方誤差的感覺被破壞了。通過「調整」,我打算在本地更改B樣條的控制點。在下面我會提供更多細節。假設有兩個B樣條C1(t)和C2(t),C1(t)的最後兩個控制點分別是P(n-2)和P(n-1),前兩個控制點C2(t)的點是Q(0)和Q(1)。假定P(n-1)和Q(0)接近兩個數據集的公共點(x29,y29,z29)。調整B樣條曲線僅僅意味着改變P(n-2),P(n-1),Q(0)和Q(1)的位置,使得這兩條B樣條曲線將以G1方式相交。要做到這一點,
1)我們首先通過移動P(n-1)和Q(0)到相同的位置,它可以是(x29,y29,z29)或簡單的P (n-1)和Q(0)。我們將這個新位置表示爲R.
2)現在檢查P(n-2),R和Q(1)是否共線。如果它們碰巧是共線的,那麼兩條B樣條曲線也將是G1,並且你完成了。如果它們不是共線的,則找到從P(n-2)和Q(1)通過R的最佳近似線,然後將P(n-2)和Q(1)投影到該線上,並使用投影點作爲P(n-2)和Q(1)的新位置。
經過這兩步後,這兩條B樣條曲線應該以G1方式連接。但是常見關節周圍原始數據點的誤差會變大。
- 1. 我怎樣才能同時曲線擬合兩條曲線?我如何曲線擬合複數?
- 2. flex 4:如何連接兩條曲線?
- 3. 擬合曲線,另一條曲線
- 4. 如何使用擬合點創建dxf樣條曲線?
- 5. 在OpenGL中渲染B樣條曲線
- 6. 指定在樣條曲線中使用bs函數的b樣條擬合的自由度程序包
- 7. 如何擬合指數曲線如a * b^t in r?
- 8. 曲線擬合
- 9. 如何使用貝塞爾曲線繪製B樣條?
- 10. 連接兩個點中的R曲線(S-ISH曲線)
- 11. 曲線擬合scipy
- 12. scipy.optimize曲線擬合
- 13. Spotfire曲線擬合
- 14. python曲線擬合
- 15. Python曲線擬合
- 16. 的Python:如何擬合曲線
- 17. 曲線樣條(python)
- 18. 曲線擬合耦合ODEs
- 19. 用樣條線連接點
- 20. 用lsq曲線擬合加權曲線擬合
- 21. 曲線擬合普朗克曲線
- 22. OpenCV中的曲線擬合
- 23. LabView中的曲線擬合
- 24. PHP中的曲線擬合
- 25. Lua上的曲線擬合
- 26. 如何在GNUplot中用曲線連接兩個點?
- 27. 如何改善numpy曲線擬合
- 28. Matlab:如何求解曲線擬合
- 29. 什麼是B樣條曲線的度數概念?
- 30. 擬合曲線 - 擬合參數
您的回覆對我很有幫助。你能澄清關於調整兩個B樣條的想法嗎?我正在考慮使用這種方法,因爲最小平方不重要。最好給一些鏈接或文件。 – 2014-10-29 07:17:10
目前我正在閱讀論文:http://www1.eafit.edu.co/cadcamcae/documents/BiCurve_MultiPatch_AnalesIngGrafica_2008.pdf – 2014-10-29 09:01:18
@OP:我在關於如何調整B樣條以實現G1連續性的答案中增加了更多內容。 – fang 2014-10-29 20:23:21