Hermit插值曲线代码与显示效果

来源:互联网 发布:usb网络共享电脑驱动xp 编辑:程序博客网 时间:2024/06/06 21:43

简介

        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

    显示效果


1 0
原创粉丝点击