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

         大二的时候,曾受老师所托,用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


程序的截图如下:

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


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

说明:  两个版本都是使用纯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)为:

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

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

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

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

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

你可能感兴趣的:(Computer,Graphics,OpenGL,Qt,B样条,B-spline,C++,B样条曲线)