[图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)

http://blog.csdn.net/mahabharata_/article/details/71856907

   大二的时候,曾受老师所托,用C++而不是OpenGL去写B样条曲线的教学程序。时隔一年,发现源码找不见了,所以重新写了一遍,也完善了部分功能,顺便发一篇博客分享一下。

        这里给出的资源有:两个打包程序、最新版本的源代码。


下载链接:(使用时请注明出处哦~~ )

        1.  (新版本)源代码:http://download.csdn.net/detail/mahabharata_/9841652

        2.  (新版本)演示程序:http://download.csdn.net/detail/mahabharata_/9841677

        3.  (旧版本)演示程序:http://download.csdn.net/detail/mahabharata_/9814823


程序的截图如下:




说明:  两个版本都是使用纯Qt实现的,没有使用OpenGL所以非常方便阅读。如需要使用win32、MFC等框架编写,也只需在此基础上做简单的修改。

功能:

      1. 鼠标左键可以添加新控制点,也可以选中并拖动已有的控制点。

      2. 支持1次、2次、3次的B-Spline曲线(即2阶、3阶、4阶)

      3. 可以选择是否显示曲线上关键结点的位置和标号,以及控制点的标号。

      4. Backspace删除末端控制点,C键清屏。


B样条曲线的相关知识:

      定义:给定n+1个控制点{P0、P1、......、Pn},每个控制点都有对应的一个基函数Ni,p(u),其中u为自变量,i为第i个结点,p为曲线的次数(次数=阶数-1),则可以用下式来定义B样条曲线:

                

     (定义域: p≤ u ≤ n+1,事实上定义域的上限取多少无所谓)

      根据定义,可以发现B样条曲线上的每一个点其实是:所有控制点的一个加权平均。这里的“权”由基函数Ni,p(u)确定。随着u从下限p逐渐增长,控制点对应的基函数的取值也会随之变化,从而产生曲线上新的点。

关于基函数Ni,p(u),可以由Cox-de Boor公式得出。这里给出三个简单的基函数的示例:

(1)当曲线次数p=1时,基函数Ni,1(u)为:


(2)当曲线次数p=2时,基函数Ni,2(u)为:


(3)当曲线次数p=3时,基函数Ni,3(u)为:


  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
B样条曲线是一种广泛应用于计算机图形学中的数学曲线模型。它的原理是通过一系列控制点来定义曲线的形状,使用参数化的方法来计算曲线上的点的坐标。 B样条曲线的定义包括两个部分:节点序列和控制点。节点序列是在参数空间上均匀分布的一系列参数值,它们定义了曲线上的插值节点。控制点是用来确定曲线形状的点,它们的位置和数量会直接影响曲线的形状。 B样条曲线的生成过程包括两个主要步骤:节点生成和曲线计算。节点生成的原则是通过一定的算法来根据控制点的数量和位置,生成合适的节点序列。常见的节点生成算法有均匀节点生成和插值节点生成。 在节点生成完成后,可以使用插值或逼近方法来计算曲线上的点的坐标。C语言提供了许多数学计算函数,可以用来计算相应的B样条曲线上一个使用C语言实现B样条曲线演示程序源码程序使用了OpenGL函数来绘制曲线。 ```c #include <stdio.h> #include <GL/glut.h> GLfloat ctrlPoints[4][3] = { {-4.0, -4.0, 0.0}, {-2.0, 4.0, 0.0}, {2.0, -4.0, 0.0}, {4.0, 4.0, 0.0} }; void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlPoints[0][0]); glEnable(GL_MAP1_VERTEX_3); glBegin(GL_LINE_STRIP); for (i = 0; i <= 30; i++) { glEvalCoord1f((GLfloat)i/30.0); } glEnd(); glPointSize(5.0); glColor3f(0.0, 0.0, 1.0); glBegin(GL_POINTS); for (i = 0; i < 4; i++) { glVertex3fv(&ctrlPoints[i][0]); } glEnd(); glFlush(); } void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-5.0, 5.0, -5.0, 5.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 400); glutInitWindowPosition(100, 100); glutCreateWindow("B-spline Curve"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 这个演示程序定义了一个四个控制点的B样条曲线,并使用OpenGL函数将曲线绘制出来。控制点的坐标被存储在二维数组`ctrlPoints`中。在`display`函数中,首先使用`glMap1f`函数定义了一个B样条曲线,并启用了对应的OpenGL功能。然后使用`glEvalCoord1f`函数计算曲线上的点的坐标,并绘制出来。最后使用`glBegin`和`glEnd`函数分别定义了绘制曲线和控制点的绘制过程。 在程序的`init`函数中进行了一些初始化工作,如设置背景颜色和投影矩阵等。在`main`函数中进行了一些初始化操作并启动了程序的主事件循环。 通过运行这个演示程序,可以看到一个B样条曲线的绘制结果,以及控制点的位置。可以通过修改`ctrlPoints`数组中的值来改变曲线的形状。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值