曲線插值(一)

2021-08-31 04:12:36 字數 1223 閱讀 2710

我看了不少插值的方法,有的方法講得莫名其妙,乙個程式,一些係數,為什麼這個係數是1,而不是0.5從來不講,讓人很懷疑其可用性。

後來做刀光的時候,採集的刀光的點不夠圓滑,需要用到插值——想想自己的高數還沒有完全忘光,乾脆自己推導乙個得了。

首先我們要明白什麼叫做光滑的曲線,可以這麼認為,這個曲線是乙個運動物體,在時間[0,1]內運動的軌跡。而要求的光滑的曲線,就是要求物體運動 過程中沒有速度的突變。且要求不同的曲線段之間,速度也不能有突變。據此,我們可以大約知道插值一段曲線,需要指導曲線其實點的位置和速度,結束點的位置 和速度。由於有四個已知變數,顯然,用乙個四次方程來描述這個曲線是再合適不過了。

方程如下:

f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d [0 <= t <= 1]

對f(t)求導,得到速度方程:

f'(t) = 3 * a * t ^ 2 + 2 * b * t + c [0 <= t <= 1]

所以f(0) = d = x0(起始點位置)

f(1) = a + b + c + d = x1(結束點位置)

f'(0) = c = y0(起始點速度)

f'(1) = 3 * a + 2 * b + c = y1(結束點速度)

聯合上面四個式子可解得

a = 2 * x0 - 2 * x1 + y0 + y1

b = 3 * x1 - 3 * x0 - y1 - 2 * y0

c = y0

d = x0

再利用f(t) = a * t ^ 3 + b * t ^ 2 + c * t + d [0 <= t <= 1]

就可以插值這斷曲線了

當然,事情還沒有完,通常情況下,我們得到的資料只有各個取樣點的位置,沒有速度。這個時候,速度怎麼辦?我的解決辦法是,在有3個取樣點的時候(p0,p1,p2),計算出p1取樣點的速度,另外,再假設取樣時間間隔是均勻的,因此:

v1 = (p2 - p0) * 0.5

在有n個取樣的時候,特殊處理起始點和結束點的速度

v0 = p1 - p0;

vn = pn - p(n-1)

這樣得到的曲線完全滿足平滑的要求,缺點是,曲線開始插值的時候要延遲乙個取樣點的時間,有的時候,v0 速度很快,因此,會出現一條有縫隙刀光。針對當前專案,我在第一次取樣的時候,將時間稍微往後加了0.001秒,按照當前的運動趨勢多取樣了一次,從而消 除了這個縫隙。因為**的運動時間很短,即使**錯誤,也不影響刀光的外觀。

利用Eigen進行B Spline 曲線插值運算

b spline curve即b樣條曲線,1972 年gordon riesenfeld 等人提出,為了解決bezier曲線的不足 bezier 曲線不能做區域性修改 bezier 曲線的拼接比較複雜 b樣條曲線的計算原理可參考這裡 或者看中文的更詳細的介紹可參考 計算機輔助幾何設計與非均勻有理b樣...

三次B樣條曲線插值c

b樣條擬合通常把離散點集作為控制點來求擬合曲線,原理和過程可參看 如果想要求得過離散點的插值曲線,需要先用離散點反求控制點,然後用求得的控制點擬合曲線。原理在這篇文章中介紹較詳細 通過離散點集反求控制點 vector bsplineinterpolate vector discretepoints ...

區域性路徑規劃 01 曲線插值法

begin x left t right a 0 a 1t a 2t 2 a 3t 3 y left t right b 0 b 1t b 2t 2 b 3t 3 end begin x left t right a 0 a 1t a 2t 2 a 3t 3 a 4t 4 a 5t 5 y left...