B样条曲线

B样条曲线

B样条曲线

deBoor_Cox函数

// B样条基函数       deBoor_Cox 递推公式
// i: 控制点计数
// k: 次数
// t: 节点
// knots: 节点向量,用来分段
double deBoor_Cox(int i, int k, double t, double *knots)
{
    // 递归出口
    if (k == 0) // k=0, 零次基函数显示为一个阶梯函数
    {
        if (t >= knots[i] && t < knots[i + 1])
            return 1.0;
        else 
            return 0.0;
    }

    // 2个分母
    double den1 = knots[i + k] - knots[i];
    double den2 = knots[i + k + 1] - knots[i + 1];

    // 2个系数
    double a = 0, b = 0;

    // 4个判定 设置 0/0=1 的情况
    if (den1 == 0 && den2 == 0)
    {
        a = 1;
        b = 1;
    }
    else if (den1 != 0 && den2 == 0)
    {
        a = (double)(t - knots[i]) / den1;
        b = 1;
    }
    else if (den1 == 0 && den2 != 0)
    {
        a = 1;
        b = (double)(knots[i + k + 1] - t) / den2;
    }
    else
    {
        a = (double)(t - knots[i]) / den1;
        b = (double)(knots[i + k + 1] - t) / den2;
    }
    
    return a*deBoor_Cox(i, k - 1, t, knots) + b*deBoor_Cox(i + 1, k - 1, t, knots); // 尾递归
}

drawBSplineCurve

// 画B样条曲线       cubic.txt中的节点是不均匀分割点
void drawBSplineCurve()
{
    // u_k <= u <= u_n+1    k:次数 n+1:控制点数
    double tmin = b.knots[b.degree]; // 3
    double tmax = b.knots[b.cntNum]; // 4

    //double tmin = 0, tmax = 5; // 当指定 t 上下界为节点矢量上下界时,曲线会闭合
    double steps = (tmax - tmin) / (insertNum - 1); // 步长
    cout << "步长" << steps << endl << endl;

    cout << "插入点数目" << insertNum << endl << endl;
    cout << "插入点坐标" << endl;

    glColor3f(0.0, 1.0, 0.0);
    glLineWidth(3.0);
    glBegin(GL_LINE_STRIP);
    for (int i = 0; i < insertNum; i++)
    {
        // 顶点初始化
        Point2D p;
        p.x = 0.0;
        p.y = 0.0;
        double t = tmin + i*steps; // 均匀插值
        for (int j = 0; j < b.cntNum; j++)
        {
            double Nik = deBoor_Cox(j, b.degree, t, b.knots); // 基函数
            p.x += Nik*b.cnt_points[j].x;
            p.y += Nik*b.cnt_points[j].y;
        }
        cout << p.x << "," << p.y << endl;
        glVertex2f(p.x, p.y);
    }
    glEnd();
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • points 为要插值的样条曲线型值点数组fitPoints 为插值后的样条曲线型值点数组
    七维树阅读 7,510评论 3 1
  • 《医疗革命》的读书笔记 作 者:邵学杰 出版社:中信出版社 版 次:2016年9月第1版 作者简介: 邵学杰:我国...
    格式化_001阅读 6,109评论 2 4
  • 写在前面 最早接触样条是在科学计算的课程上,当时主要讲了三次样条及由此推出的三斜率方程组。 后来便在阅读ESL(T...
    未雅阅读 6,141评论 0 0
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 13,800评论 0 5
  • 最后一道已知大题是在Bezier曲线、B样条曲线、多边形裁剪中出的画图题,务必记牢公式~~~ Bezier曲线和曲...
    susu2016阅读 6,644评论 0 3

友情链接更多精彩内容