首先,這個網上有很多相關的文章,比如
下面說,整個演算法需要注意的地方。
1) 切線的概念
切線不是斜率,可以理解為向量吧。比如p0到p1的切線就是(p1-p0)。可以標準化為單位向量。
2)簡單的切線
假如四個控制點p0,p1,p2,p3,那麼最簡單的計算p1點的切線是 p1-p0,p2的切線是p3-p2。
3)簡單切線的問題。
上訴求切線的方式是有問題的,因為p1的切線,你可以計算為(p1-p0)。如果點集反轉為p2,p1,p0,p5,那麼p1的切線又變成了(p2-p1)。所以簡單切線是有問題的。得到的結果如下圖所示。
4)調整後的切線
既然乙個點的切線可以有兩個值,那就用兩個值的平均咯。是的,就這麼簡單。同3)p1點的切線的值為(p1-p0)/2+(p2-p1)/2;
5) 整個演算法。
下面用c#實現的。
private void inithmatrix()
}
public listcomputehermite(pointf p1, pointf p2, pointf p3, pointf p4)
if (p4 == pointf.empty)
float radio1 = 0.5f;
float radio2 = 1 - radio1;
pointf k0 = new pointf(m0.x * radio1 + m2.x * radio2, m0.y * radio1 + m2.y * radio2);
pointf k1 = new pointf(m1.x * radio1 + m2.x * radio2, m1.y * radio1 + m2.y * radio2);
if (p1 == pointf.empty)
if (p4 == pointf.empty)
listitems = new list();
items.add(new pointf(p2.x, p2.y));
for (int i = 1; i < cstepcount; i++)
items.add(new pointf(p3.x, p3.y));
return items;
}
6)最後的效果
三次樣條曲線
include include using namespace std const int m 16 double dknowx m double dknowy m double dknowdy m double dknowddy m const int n 15 double dinsertx n...
三次曲線和五次曲線函式
三次曲線規劃函式 x0,x1分別為規劃起始位置和終止時刻位置,v0,v1分別為規劃起始速度和終止時刻速度 t為規劃時長,t為求解時刻 function y triple x0,x1,v0,v1,t,t a 2 x0 2 x1 v0 t v1 t t 3 b 3 x0 3 x1 2 v0 t v1 t...
分段三次Hermite插值Matlab實現
function m matrix hermite x,y,y0,yn,x value 輸入值分配,x input,y input均為陣列,y 0,y n為x 0,x n分別對應的一階導數值 x input x y input y y 0 y0 y n yn number size x input ...