综述
上一节我们利用种子填充算法实现了机器人的区域填充,我们可以发现,种子填充需要一定是时间,并不能在第一时间填充完毕。这里我们介绍一种更加简单的方法,我们利用 glPolygonMode 来绘制机器人,感受一下。
注意
我们曾经分别使用过类库和直线圆弧生成算法来绘制过机器人的线条。 类库绘制法:OpenGL 绘图实例一之机器人的绘制 算法绘制法:OpenGL 绘图实例二之直线和圆弧的绘制 填充算法也有两种,一种是种子填充算法,另一种就是本篇说的方法。 在这里我们可以归一下类,算法绘制线条方法和种子填充算法中的每一个点都是我们一点点绘制的,都是我们利用算法一点点计算的坐标来绘制,因此,可以把他俩归为一对。而类库绘制线条方法和本篇说的填充方法都是指定一部分点,类库为我们实现了填充,因此可以把他俩归为一对。下面就让我们来感受一下类库填充的魅力吧!
函数说明
1.函数原型
函数原型:void glPolygonMode(GLenum face, GLenum mode); 说明:控制一个多边形的正面和背面的绘图模式。表示多边形应该被画成点、轮廓还是填充形式。在默认情况下,多边形的正面和背面都被画成填充形式。 函数 glPolygonMode()用于改变当前的多边形绘制模式,它有两个参数。第一个参数指定哪些面将被这个调用,可能的值为 GL_FRONT、GL_BACK 或 GL_FRONT_AND_BACK,分别对应于前向多边形、后向多边形或两者。第二个参数指定将要使用的模式,可以为 GL_POINT、GL_LINE 或 GL_FILL。 下面我们来用一个小 Demo 来感受一下
1 |
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); |
以上三种模式分别是绘制了填充的三角形,三角形的边界,三角形的三个点。
2.画多边形
在 glBegin 的参数传入 GL_POLYGON,绘制的时候所有的点就会连接而成一个多边形。
3.线条的粗细
1 |
glLineWidth(lineWidth); |
利用这个方法,我们可以传入像素值大小,比如传入 2,画线的时候就是 2 像素的粗细。
绘制机器人
接下来我们利用这个方法来绘制机器人吧!我们可以注意到,定义了 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)之后, 如果 glBegin 传入的是 GL_LINE_LOOP,绘制的仍然是封闭的曲线,如果 glBegin 传入的是 GL_POLYGON,绘制的则是封闭的填充的图形。 如果要实现上图的机器人,我们既要绘制黑色的边线,又要绘制带颜色的区块。所以我们就需要分别调用两种绘制模式,绘制的过程是完全相同的。所以,我们可以把模式当做一个变量来传入参数中改变绘制模式。比如之前的绘制三角形的方法
1 |
//画三角形,传入三个点的坐标 |
就可以改写为
1 |
//画三角形,传入三个点的坐标 |
在调用的时候我们只需要分别传入 GL_LINE_LOOP 和 GL_POLYGON 就可以了。 所有之前的方法改写如下
1 |
//画矩形,传入的是左下角XY坐标和右上角XY坐标 |
那么我们实现了上面的方法之后。比如我现在要画一个矩形,就要传入 GL_LINE_LOOP 绘制一个边缘,然后再传入 GL_POLYGON 绘制一个填充的矩形,其中这个矩形的长宽等于边缘的长宽减去线的宽度(经过探索发现,应该减去线宽的一半才对,因为线的基准点是在线宽的中心的) 所以,我们可以定义一个画带边矩形的方法,比如
1 |
//画填充的矩形,传入左上角和右下角的坐标 |
我们先定义了边界颜色绘制了边界,然后定义了图形的颜色来绘制填充的图形。其中 color 作为参数,可以传入不同的 RGB 值。 定义颜色 RGB 数组即可
1 |
int border[3]={0,0,0}; |
调用的时候我们只需要
1 |
glFillRect(-108,45,-81,0,darkGrey); |
就可以绘制一个黑色边界的矩形了,填充色为暗灰色。 其他类似的方法实现如下
1 |
//画填充的三角形,传值为逆时针,此法针对于机器人的正三角形 |
恩,万事俱备只欠东风了,下面我们调用一下这几个函数直接进行绘制就好啦。 display 中的绘图调用如下
1 |
//函数用来画图 |
恩,这样就大功告成啦,是不是比种子填充算法简单多了?
运行结果
总结
本节我们利用了类库的方法来实现了颜色填充,是不是很简单?