簡體   English   中英

從粗糙點生成三次貝塞爾曲線

[英]Generating a cubic bezier curve from rough points

我正在尋找一種使我的應用程序在徒手模式下產生更平滑結果的方法。 現在,它只是簡單地添加每個mousemove點,並由此創建一個多邊形。 我注意到現代矢量應用程序會生成貝塞爾曲線,以使其看起來更加平滑,我想知道這樣做是如何進行的? 那么,如何通過用戶對平滑曲線的粗略輸入來獲得4個點進行貝塞爾曲線插值?

謝謝

僅當您距離上一個點有一定距離閾值時才存儲新點如何?

像但不是完全一樣的ransac(請參閱Ransac )在這里可以很好地工作。 Ransac同時找到一種解決方案,同時消除了異常值。 當從一小部分數據中生成假設並易於針對整個集合測試假設時,Ransac很好。 這很適合您的問題。

基本思路:
環:

  1. 從完整集合中隨機抽取少量點以創建貝塞爾曲線。
  2. 計算您擁有的每個點到該曲線的距離。
  3. 消除超出某個閾值的點。
  4. <見下文>
  5. 將其余點的平方距離相加即可得到一個分數。
  6. 保持分數最高的解決方案。

為了使這個真正的ransac,您需要找到4的函數來解決您的原始問題。 天啊 也就是說,您需要能夠基於在步驟3中未消除的所有點來計算曲線。這就是我建議上述內容的原因。 它既快速又容易,並且可能使您非常接近,尤其是因為您實際上沒有明顯的異常值。

如果要解決一般問題,可以使用levenberg-marquardt( LM )優化。

您想定義一個帶有少量點的貝塞爾曲線。 您可以使用LM通過最小化所有點到曲線的平方距離來優化曲線的參數(點位置)。 這是您的目標函數 ,即距離的平方和。

訣竅是為LM計算梯度和粗麻布。 您可以通過數字方式執行此操作,而不必進行任何數學運算。 使用數值微分來計算用於查找梯度的雅可比行列式(J)。 (LM還使用雅可比行列近似黑森州。)

Matti提到了GSL用於平滑花鍵。 我不了解GSL,但事實證明它具有LM和數值微分的實現。

您也可以使用平滑樣條線。 如果您對GPL表示滿意,請查看GSL http://www.gnu.org/software/gsl/以獲得實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM