投稿    登录
  您好,欢迎光临崔庆才的博客,祝大家新年快乐,鸡年大吉!

OpenGL绘图实例四之区域颜色填充

C/C++ 崔庆才 4223浏览 5评论

综述

上一节我们利用种子填充算法实现了机器人的区域填充,我们可以发现,种子填充需要一定是时间,并不能在第一时间填充完毕。这里我们介绍一种更加简单的方法,我们利用 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来感受一下

以上三种模式分别是绘制了填充的三角形,三角形的边界,三角形的三个点。

2.画多边形

在glBegin的参数传入GL_POLYGON,绘制的时候所有的点就会连接而成一个多边形。

3.线条的粗细

利用这个方法,我们可以传入像素值大小,比如传入2,画线的时候就是2像素的粗细。

绘制机器人

接下来我们利用这个方法来绘制机器人吧!我们可以注意到,定义了glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)之后,

如果glBegin传入的是GL_LINE_LOOP,绘制的仍然是封闭的曲线,如果glBegin传入的是GL_POLYGON,绘制的则是封闭的填充的图形。

图片1

 

如果要实现上图的机器人,我们既要绘制黑色的边线,又要绘制带颜色的区块。所以我们就需要分别调用两种绘制模式,绘制的过程是完全相同的。所以,我们可以把模式当做一个变量来传入参数中改变绘制模式。比如之前的绘制三角形的方法

就可以改写为

在调用的时候我们只需要分别传入GL_LINE_LOOP和GL_POLYGON就可以了。

所有之前的方法改写如下

那么我们实现了上面的方法之后。比如我现在要画一个矩形,就要传入GL_LINE_LOOP绘制一个边缘,然后再传入GL_POLYGON绘制一个填充的矩形,其中这个矩形的长宽等于边缘的长宽减去线的宽度(经过探索发现,应该减去线宽的一半才对,因为线的基准点是在线宽的中心的)

所以,我们可以定义一个画带边矩形的方法,比如

我们先定义了边界颜色绘制了边界,然后定义了图形的颜色来绘制填充的图形。其中color作为参数,可以传入不同的RGB值。

定义颜色RGB数组即可

调用的时候我们只需要

就可以绘制一个黑色边界的矩形了,填充色为暗灰色。

其他类似的方法实现如下

恩,万事俱备只欠东风了,下面我们调用一下这几个函数直接进行绘制就好啦。

display中的绘图调用如下

恩,这样就大功告成啦,是不是比种子填充算法简单多了?

运行结果

QQ截图20150421000536

恩,那些小白点就忽略吧!!这叫不拘小节!!哈哈哈!!

总结

本节我们利用了类库的方法来实现了颜色填充,是不是很简单?

转载请注明:静觅 » OpenGL绘图实例四之区域颜色填充

喜欢 (10)or分享 (0)

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的

  1. 3.线条的粗细

    glLineWidth(lineWidth);
    这个方法opengl里面有 是要重新写吗 俺是初学者嘿嘿

  2. //画填充的三角形,传值为逆时针,此法针对于机器人的正三角形
    void glFillTri(int x1,int y1,int x2,int y2,int x3,int y3,int color[3]){
    glColor3ub(border[0],border[1],border[2]);
    glTri(x1,y1,x2,y2,x3,y3,GL_LINE_LOOP);
    glColor3ub(color[0],color[1],color[2]);
    glTri(x1+lineWidth/2,y1+lineWidth/2,x2-lineWidth/2,y2+lineWidth/2,x3,y3-lineWidth/2,GL_POLYGON);

    我想问关于这个lineWidth 不是在这个方法未定义吗
    }