实验三
实验要求:
本次实验的内容主要为:绘制下面三种形状。
- 贝塞尔曲线的绘制
- Surfaces of revolution
- Sweep Surfaces
实现思路及实现结果:
1、贝塞尔曲线
用鼠标确定点,这里的点都是画出的曲线必须经过的点(为了实现和示例相似的效果)。将相邻的点连起来,所有点画完后,将首尾连接。
由于贝塞尔曲线需要约束点,而按照上面的方法画图时没有人为设置约束点,因此需要计算约束点。每三个连续的点,可以确定出两个约束点。
for (int i = 0; i < point_num; i++) { q[i][0] = (points[i][0] + points[(i + 1) % point_num][0]) / 2; q[i][1] = (points[i][1] + points[(i + 1) % point_num][1]) / 2; }
最后,按照贝塞尔曲线的公式,计算曲线上点的位置并连线。
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9af788abd057a70009a2cdbd5f51f061.png)
2、旋转曲面
先使用bezier曲线画曲线。
![](https://i-blog.csdnimg.cn/blog_migrate/d0387abdd399134a9ba20ae6c12919a2.png)
确定一条曲线后,让曲线绕y轴旋转,得到一个曲面。
曲面由四边形面片组成。每一个在画bezier曲线时取到的t,对应一圈四边形面片。一圈四边形面片共720个,是对圆的角度进行等分后的结果。
![](https://i-blog.csdnimg.cn/blog_migrate/2f7bdda7cbee0df665567ecdfc847d64.png)
进行旋转以进一步观察效果。
![](https://i-blog.csdnimg.cn/blog_migrate/5cf90a2cac035ee050f9c582ece20ae0.png)
俯视图。
![](https://i-blog.csdnimg.cn/blog_migrate/10b0bd10a18a355e5673a58b4f9f0499.png)
3、扫掠曲面
画一个扫掠曲面需要一条轮廓线和一条引导线。
让轮廓线按照引导线的走向扫掠,可以得到一个扫掠曲面。
与画旋转曲面时类似,曲面由四边形面片组成。用bizier曲线将轮廓线和引导线画出后,通过插值得到曲面内部点的位置。
![](https://i-blog.csdnimg.cn/blog_migrate/4ad4aa2c65f7d4f10024bf051b03a30b.jpeg)
结果1:
画轮廓线、引导线:
![](https://i-blog.csdnimg.cn/blog_migrate/6d507d34622a60204aebabae16d6ab05.png)
扫掠:
![](https://i-blog.csdnimg.cn/blog_migrate/18f8dd297a7d93ce999676069b79772a.png)
结果2:
画轮廓线、引导线:
![](https://i-blog.csdnimg.cn/blog_migrate/824a86d5d9ea19862c36c23c7590a308.png)
扫掠:
![](https://i-blog.csdnimg.cn/blog_migrate/e6e4eb5be941e8f4ea4c51431070f901.png)
github链接:https://github.com/sdu-graphics/experiments-zxj107/tree/main/experiment3