编写一个生成B样条曲线的程序(建议首先实现生成一段B样条曲线的功能,然后通过函数调用生成整个B样条曲线),要求能够处理节点重复的情形。并生成由下列7个控制点产生的3次B样条图形:(0, 6)、(1,0)、(2,6)、(3,0)、(4, 6)、(5,0)、(6, 6)。

题目要求

B样条

要求:
1)由给定控制点产生一条均匀B样条曲线图形
2)由给定控制点产生一条准均匀B样条曲线图形
3)使用重节点,在曲线的中间产生一个尖角
4)循环使用控制点,生成一条封闭且光滑的均匀B样条曲线图形

注意:不要忘记提供说明文档:
1)提供说明文档。对整体思路、对重要的函数功能和参数进行说明。
2)不要使用均匀B样条和重复控制点来控制曲线形状,要使用节点矢量。
3)拷贝屏幕图像。

实现思路

生成一段B样条曲线

根据B样条递推公式:

B样条曲线的原理

写出B样条曲线的基函数deBoor_Cox(float t, intk, int i)。

deBoor_Cox函数有三个输入参数:

  • 控制点的数量n

  • 多项式次数为k

  • 节点数 m = n+k+1

一段B样条曲线公式为:

一段B样条曲线公式

编写函数drawCurve(vector vertices, int i, int k) ,绘制ti到t(i+1)的曲线, 次数为k

整个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

解压密码

B样条项目文件下载(含OpenGL库)

这里的freeglut300文件夹就是OpenGL库文件,有了这个文件夹,直接双击B_Curve文件夹里的sln工程文件然后运行就可以了。

源代码

运行结果

运行结果


版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenGLBCurve.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!
▶ 站长邮箱 [email protected][email protected] ,如不方便留言可邮件联系。

最后修改:2022 年 11 月 25 日
如果觉得我的文章对你有用,请随意赞赏