代码都放在一起了,如果接下来的实验有需要私信一下就好哦
链接: https://pan.baidu.com/s/1cBTTbbzRCVBCX_H4jf6qMA 提取码: kj8w
第二次实验作业 直线光栅化算法 实验报告
老师的评语是:实验正确实现了任意斜率情况下的画直线算法,且可以通过鼠标交互画出多条直线形成图案。实验报告较简单,可以对代码设计进行更详细清晰的说明。此外drawline函数可以写得更精简些,不用每种斜率情况都调用各自的循环来生成点,可以在变换后统一调用斜率在0-1直接的画直线代码即可。
一、实验原理
1.本次实验利用OpenGL的GLFW库进行操作,实现了用户通过键盘、鼠标进行直线的绘制,以及用户可以基于交互的直线绘制,即通过鼠标点击,或者键盘输入点,随意在屏幕上画出任意的直线段,且可以基于直线为基本图元作出几何图形,比如花纹状图案。
2.实验过程中,利用VAO、VBO来存储直线或者图案的点集vertices,然后用OpenGL的绘制功能glDrawArrays将直线或者图案绘制出来。
3.直线的绘制原理是基于两个点的坐标,通过DDA算法,画出两个点之间的直线段;直线的绘制过程中,核心思想是,把用户可能输入的所有可能都通过对称原理转化为斜率为0<k<1之间的,而且第一个点的横坐标x0必定小于第二个点横坐标x1的直线,最后再把点集通过对称原理还原,绘制成用户需要的直线。
二、代码设计及说明
本次实验根据实验要求不同实现了不同的功能,直线的计算代码,以及一小部分点集存储代码都封装成了函数,减少主函数中不必要的冗余。如上文所述,直线的绘制过程中,核心思想是,把用户可能输入的所有可能都通过对称原理转化为斜率为0<k<1之间的直线。在此放上四种不同情况的处理代码。
(1)斜率为0~1之间
图1 代码部分示意图(1)
斜率为0~1是最基础的直线,其他直线均为在此基础上做对称得到的。按照老师上课给出的思路实现的代码,d的值是点选取上方还是下方的依据,并且d的值在每次选择后会进行更新。
(2)斜率大于1
图2 代码部分示意图(2)
与前一个的不同之处是坐标关于y=x直线做了对称,即在输入点的时候将x和y的顺序调换。还封装了一个swap函数,用于交换两个数的值。
(3)斜率为-1~0之间
图3 代码部分示意图(3)
与第一种情况关于x=0直线做了对称,即一开始将x变为-x。
(4)斜率小于-1
图4 代码部分示意图(4)
是(3)和(4)的结合情况。
(5)利用鼠标点击获取坐标
图5 代码部分示意图(5)
glfw库中有获取当前数鼠标位置的回调函数,这个函数接收一个window指针和一个回调函数,然后定义自己的回调函数就可以了。
三、实验运行结果
1)给定直线两个端点的坐标
图6 运行结果示意图(1)
直线两个端点的坐标所可能出现的4种情况以及加上反过来画的4种情况。
2)键盘输入
图7 运行结果示意图(2)
分别是斜率大于1和斜率0~1的直线
3)鼠标输入
图8 运行结果示意图(3)
画的是写报告时WPS崩了的心情以及要求的一朵花
四、实验总结
通过本次实验,我深刻地了解了OpenGL中glfw库的核心函数,实验过程中我遇到了很多的困难,都是因为对glfw库的不熟悉导致的。但在自己看了一些GLFW的文档、通过自己学习获得很多知识,我也对 OpenGL中的VAO、VBO等各种变量有了更加具体的了解。