两点三次埃尔米特插值法
生活随笔
收集整理的這篇文章主要介紹了
两点三次埃尔米特插值法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
怎樣用畫筆畫光滑曲線-兩點三次埃爾米特插值法(轉自http://blog.sina.com.cn/s/blog_a8192bdd010105rx.html)
求幾點(3點以上)之間的光滑曲線是有很多辦法的,如果需要曲線通過目標點,可以用經典的三次樣條曲線,如果不需要曲線通過目標點,可以使用貝塞爾曲線。 例如,用三次樣條曲線,只要有4點,并且確定兩邊界點的斜率,既可以求得通過4點的光滑曲線,曲線在各端點處有2階光滑性。至于三次樣條曲線的公式及算法,可以隨便買一本《數值分析》研究一下。但我這幾天遇到的問題是,通過畫筆繪制曲線時,要繪制成光滑曲線。 畫筆的繪制同已知幾點求光滑曲線不同,畫筆要求的是實時繪制,也就是說畫筆走到哪就要把光滑曲線畫到哪,這里如果使用三次樣條曲線,局限性就在于,以下圖為例:
當畫筆走到B時,只有AB兩個端點,這時就要畫出AB之間的曲線(實時性),而三次樣條曲線要求有3點以上,這時就無法通過三次樣條曲線繪制出AB之間的光滑曲線。 其實可以變通一下,在畫筆走到C的時候(而不是走到B時)才畫出曲線,也就是曲線和畫筆的位置有一步的延遲,這樣走到C的時候就可以確定ABC三點。 但是這里還存在一個問題,三次樣條曲線需要制定兩端點的斜率,當畫筆走到C時,如果要畫出ABC之間的光滑曲線,需要知道A點的斜率和C點的斜率,當畫筆走到D時,需要知道B點的斜率和D點的斜率。 其實A點和B點這種(不是最后一個端點)的斜率還是可以給出的,但C點和D點這種最后一個端點的斜率缺無法給出,因為當畫筆走到C時,無法確定下一個D點的位置,所以無法確定CD的斜率,也就沒有辦法確定C點的斜率。 也曾考慮過當畫筆走到D點時再繪制前3點的曲線,但是如果這樣,那么假設存在下一點E,那么走到E的時候,ABC之間的曲線已經存在,這個時候僅需要繪制CD之間的曲線,又和以開始的繪制3點之前曲線有沖突。延伸下去考慮,其實在D點以后,問題已經演變為畫亮點之間光滑曲線,因此把前3個點的問題也轉化為2點之間光滑曲線的問題。 可以考慮的方法是: 1、前提條件是曲線永遠比畫筆延遲一步(這在實際繪制過程中用戶是完全察覺不到的)。 2、當走到C點時,繪制AB的曲線,走到D點時,繪制BC的曲線。 3、兩點之間的光滑曲線使用“兩點三次埃爾米特”公式求曲線方程。 由于兩點三次埃爾米特方程也需要給定兩端點的斜率,因此問題又回到求斜率的問題上。 繼續思考一下,假設A點是起始點,那么畫筆走到C時要繪制AB兩點之間光滑曲線,需要給定A點和B點的斜率,由于A點是開始點,所以給定斜率比較麻煩(也不是不可能),可以將問題轉化為起始點A的斜率等于直線AB的斜率。 那么B點的斜率是什么樣呢,由圖可知B點斜率介于AB斜率和BC斜率之間,所以可以近似取為AB和BC斜率的一半(AB和BC的中間線)。這樣就可以通過兩點三次埃爾米特公式計算出AB兩點間的曲線了(實際上根據這個方法繪制的AB間為直線)。 繼續走到D點,走到D點時需要繪制BC點的曲線,由于在C點時已經計算了B點斜率為AB、BC的中間線,所以B點斜率已知,同樣方法可以取C點斜率為BC、CD中間線為C點斜率,這樣已知BC兩點斜率再通過兩點三次埃爾米特公式即可求得BC之間曲線方程。 以此類推可以跟蹤畫筆繪制出光滑曲線。 本方法的局限性有3: 1、B點處1階、2階導數不連續(因為AB為直線,而BC為三次曲線),可以通過近似給得A點斜率方法彌補,不做贅述。 2、曲線始終滯后畫筆一個步驟(這在實際中用戶無法感覺到)。 3、由于中間端點的斜率始終取為兩條相交直線的中心線,所以理論上相對于三次樣條曲線不夠精確(也許光滑度和曲線形狀上欠佳)。 但實際根據以上思路實現之后發現基本上是感覺不到局限性的,所繪制曲線比較另人滿意。 由于本人水平有限,還沒有考慮出更好的方法跟蹤畫筆繪制出光滑曲線。也許本文提到的方法可以進一步優化。我會繼續研究。
總結
以上是生活随笔為你收集整理的两点三次埃尔米特插值法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI人工智能学习准备之路线图
- 下一篇: 微信小程序开发之倒计时定时器