[图形学] 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)为: