实验目的和要求
学会配置GLUT开发库并使用Visual Studio C++开发OpenGL程序。
实验内容和原理
在Windows系统中,配置GLUT库:解压并打开文件夹glut.zip,取出glut.h,glut32.lib,glut32.dll。之后有两种配置方式,一是将以上3个文件分别放在系统盘的相应目录下;二是针对具体项目(本次实验给定项目Ex1)进行配置。
开发OpenGL程序:编译运行项目Ex1,确认无误后修改代码生成以下图形:
主要仪器设备
Visual Studio 2017
Glut压缩包
Ex1 工程
操作方法和实验步骤
配置环境
首先在包含工程文件的文件夹中创建了OpenGL的目录,按照如下分层存放GLUT文件:
为保证工程文件以及该实验内容可以在不同的机器上运行,在VS2017的解决方案里做了如下处理:
注意!!!!该实验是在Release x64版本下实现的,请务必注意运行环境!!!!
五角星的绘制
众所周知OpenGL是只能绘制凸多边形的,对于五角星这样的非凸多边形,只能采取分割成若干凸多边形的方式来绘制。我采取的是分割成五个单位四边形来绘制的。
如下图所示,每一个正五角星都可以贝尔分割成由五个类似于四边形ABCD构成的图形。重点的角度已在图中标出。其中∠ABC=pi/10,∠BAC=pi/5。在绘制五角星之前,我们先确定了两个点——五角星的中心点A以及其中一个顶点B。下面我们通过几何关系求出C、D两个点。
那么通过解三角形,我们可以得出两个关系式:
CH/AH=tan36° CH/BH=tan18°
变形得到:
AH=tan18°/(tan36°+tan18°)* AB
CH=tan36°* AH
这样,我们就可以解出C的坐标,D坐标同理即可。单位四边形的绘制代码实现如下:
下一步是根据一个单位四边形绕点A旋转若干个72°后得到剩余四个四边形,拼成一个五角星。在代码实现中,我定义了一个二维旋转函数rotate2d(),其参数表中包含中心点的坐标以及顶点坐标的指针形式和旋转角度。通过三角变换,可以更新顶点坐标值,从而写入指针中。旋转函数和五角星绘制的具体代码如下:
五角星位置的确定
我参考了我们五星红旗的设计图。然而非常鬼畜的一点是,示例文件中给出的数据显示画出的红色矩形竟然是长宽比1:1?事实上,国旗的长宽比是3:2。于是乎死马当作活马医,暂且就用相同的方法这么画它。
首先将矩形分成四份,其中中心点即为坐标原点(这是一个二维图形,理论上二维坐标就够了,至于第三个坐标参数可以理解为在z=0.5这个平面上)。从图中可以清楚地确定出五个五角星中心点的具体坐标以及大五角星的上方的顶点坐标。其余四个五角星的顶点坐标的确定需要通过解几何关系的方法。其画法为:以四点为圆心,各以一等分为半径,分别作四个圆。在每个圆上各定出五个等距离的点,其中均须各有一点位于大五角星中心点与以上四个圆心的各联结线上。然后用构成大五角星的同样方法,构成小五角星。此四颗小五角星均各有一个角尖正对大五角星的中心点。
具体计算时,先通过反三角函数关系解出夹角,然后用正弦或余弦函数求出连线,减去一个单位圆对应的长度后得到顶点的横纵坐标。国旗绘制五角星部分的代码如下:
实验数据记录和处理
在数据处理方面有一点:因为原矩形给出的比例过于诡异,在后面画五角星确定位置时,对于单位圆的半径大小,采用了十等分的结果而不是十五等份的结果。
实验结果与分析
有一点非常奇特的现象:随着图形窗口的调整,这个图形的比例会发生不同程度的变形:
还不是很清楚这一点怎么解决……因为很多GLUT库的函数还没有很深入地了解和接触,目前查到了这几个函数或许可以解决:
glutReshapFun():用以指定窗口大小调整时的重绘制函数,但是需要先自己注册一个窗口改变的函数,还没有摸索出来这个函数应该怎么写。有时间的话会完善这里。
讨论、心得
在绘制五角星的过程中,还考虑到了其他的方法,也有尝试实现过:
1.绘制一系列单位三角形;
将五角星分解为10个形如△ABD的三角形,共用五角星中心点作为顶点,这样就可以使用GL_TRIANGLE_FAN(连接成扇形的三角形系列)几何图元类型进行填充。
2.外周五个三角形+中心的正五边形;
这种方法比较繁琐,最后没有采用。但显然也是可行的。
另外,关于图形缩放变形的问题,也是值得后续继续讨论的问题。还会继续研究与学习。
♻️ 资源
大小:1.06MB
➡️资源下载:https://download.csdn.net/download/s1t16/87404303
注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!