编写一个生成B样条曲线的程序(建议首先实现生成一段B样条曲线的功能,然后通过函数调用生成整个B样条曲线),要求能够处理节点重复的情形。并生成由下列7个控制点产生的3次B样条图形:(0, 6)、(1,0)、(2,6)、(3,0)、(4, 6)、(5,0)、(6, 6)。
题目要求
要求:
1)由给定控制点产生一条均匀B样条曲线图形
2)由给定控制点产生一条准均匀B样条曲线图形
3)使用重节点,在曲线的中间产生一个尖角
4)循环使用控制点,生成一条封闭且光滑的均匀B样条曲线图形
注意:不要忘记提供说明文档:
1)提供说明文档。对整体思路、对重要的函数功能和参数进行说明。
2)不要使用均匀B样条和重复控制点来控制曲线形状,要使用节点矢量。
3)拷贝屏幕图像。
实现思路
生成一段B样条曲线
根据B样条递推公式:
写出B样条曲线的基函数deBoor_Cox(float t, intk, int i)。
deBoor_Cox函数有三个输入参数:
- 控制点的数量n
- 多项式次数为k
- 节点数 m = n+k+1
一段B样条曲线公式为:
编写函数drawCurve(vector
整个B样条曲线
根据要求,需要确定三个问题:
1、 是否有尖角
如果在第corner个控制点处有尖角,则在该控制点后插k个相同控制点,和k个节点,形成k+1重节点
2、 是否为准均匀
如果为准均匀,在首尾各插入k个节点,形成k+1重节点
3、 是否为封闭曲线
如果为封闭曲线,则将前3个控制点添加到控制点数组末端,节点顺延3个。
由此编写节点生成函数generate_knots(),同时对控制点也进行更改。
最后建立一个通过调用节点生成和绘制一段曲线函数drawQuasi_uniform_B_curve( bool is_Quasi_uniform, int corner, bool is_closed),生成整段曲线的函数
源代码
解压密码:www.52txr.cn
这里的freeglut300文件夹就是OpenGL库文件,有了这个文件夹,直接双击B_Curve
文件夹里的sln工程文件然后运行就可以了。