Hermit插值曲线代码与显示效果
生活随笔
收集整理的這篇文章主要介紹了
Hermit插值曲线代码与显示效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介
? ? ? ? Hermit插值是拉格朗日(Lagrange)插值的推廣。其不僅要插值于節點,而且要插值于節點的斜率。給定n+1個點x0,x1,…,xn的函數值f(x),及其斜率f'(x),其Hermit插值公式為:
實現代碼
// xmin 控制點x方向最小值 // xmax 控制點x方向最大值 // origin_pts 所有控制點 // origin_slopes 其中y值表示控制點的斜率 // generate_pts 生成的Hermit曲線 // N 生成Hermit曲線點數量int N = 100; for (int n = 0; n <= N; n++) {float x = (xmax - xmin)*n / N + xmin;float y = 0;for (int i = 0; i < origin_pts.size(); i++){float yi = 1 * origin_pts.at(i).y;float lkn1 = 1, lkr1 = 1;float lkn = 1, lkr = 1;for (int j = 0; j < origin_pts.size(); j++){vec3 pt = origin_pts.at(j);vec3 slope = origin_slopes.at(j);if (i != j){lkn *= ((x - pt.x) / (origin_pts.at(i).x - origin_pts.at(j).x));lkr *= ((x - pt.x) / (origin_pts.at(i).x - origin_pts.at(j).x));lkn1 /= (origin_pts.at(i).x - origin_pts.at(j).x);lkr1 /= (origin_pts.at(i).x - origin_pts.at(j).x);}}y = y + ((1 - (x - origin_pts.at(i).x)*(lkn1 + lkr1))*lkn*lkr)*yi;yi = 1 * origin_slopes.at(i).y;yi *= (x - origin_pts.at(i).x);for (int j = 0; j < origin_pts.size(); j++){if (i != j){//yi = yi*(x - origin_pts.at(j).x) / (origin_pts.at(i).x - origin_pts.at(j).x);vec3 pt = origin_pts.at(j);vec3 slope = origin_slopes.at(j);//yi = pt.y + (x - pt.x)*(slope.y - 2 * pt.y);//yi *= yi;yi *= ((x - pt.x) / (origin_pts.at(i).x - origin_pts.at(j).x));yi *= ((x - pt.x) / (origin_pts.at(i).x - origin_pts.at(j).x));}}y += yi;}generate_pts.push_back(vec3(x, y, 0.0f)); }演示效果
? ? 輸入控制點及其斜率
(-3,-3), 0
(-1,1), 1
(0,3), -1
(3,4), 2
(5,5), 0
? ? 顯示效果
總結
以上是生活随笔為你收集整理的Hermit插值曲线代码与显示效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hermit插值 matlab,分段线性
- 下一篇: 一张图搞清楚HDMI和AV接口