不正确的随机彩色矩形

Posted

技术标签:

【中文标题】不正确的随机彩色矩形【英文标题】:Incorrect random coloured rectangle 【发布时间】:2019-03-11 15:27:01 【问题描述】:

我想在 GL_POLYGON 中显示随机颜色。

但颜色仅在最小化和最大化时发生变化。它在最大化时选择不同的颜色,在最小化时选择不同的颜色。但只要我继续最小化和最大化,它就会随机化颜色

#include <GL/gl.h>
#include <GL/glut.h>
#include <cstdlib>

void display( void )

    glClear( GL_COLOR_BUFFER_BIT );
    glBegin( GL_POLYGON );
    for( int i = 0; i < 255; i++ )
    
        glColor3ub( rand(), rand(), rand() );
    
    glVertex3f( 0.25, 0.25, 0.0 );
    glVertex3f( 0.75, 0.25, 0.0 );
    glVertex3f( 0.75, 0.75, 0.0 );
    glVertex3f( 0.25, 0.75, 0.0 );
    glEnd();

    glColor3f( 0.0, 0.0, 0.0 );
    glRectf( 0.45, 0.25, 0.55, 0.05 );
    glRectf( 0.35, 0.08, 0.65, 0.02 );

    glFlush();


void init( void )

    glClearColor( 1.0, 1.0, 1.0, 1.0 );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 );


int main( int argc, char** argv )

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize( 250, 250 );
    glutInitWindowPosition( 100, 100 );
    glutCreateWindow( "Assignment" );
    init();
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;

【问题讨论】:

【参考方案1】:

glutDisplayFunc() 仅在操作系统需要重新绘制窗口时调用您的回调。如果您想要更多常规电话,您需要通过glutPostRedisplay() 自己触发它们:

... 当 GLUT 确定需要重新显示窗口的法线平面时,会调用窗口的显示回调。 ...

...

GLUT 根据窗口的重新显示状态确定何时触发显示回调。可以通过调用glutPostRedisplay 显式设置窗口的重新显示状态,或者作为窗口系统报告的窗口损坏的结果隐式设置。一个窗口的多个发布的重新显示由 GLUT 合并以最小化调用的显示回调的数量。

我喜欢用glutTimerFunc()定期调用glutPostRedisplay()

#include <GL/glut.h>
#include <cstdlib>

void timer( int value )

    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );


void display()

    glClearColor( 0.2, 0.2, 0.2, 1 );
    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glBegin( GL_POLYGON );
    glColor3ub( rand(), rand(), rand() );
    glVertex3f( 0.25, 0.25, 0.0 );
    glVertex3f( 0.75, 0.25, 0.0 );
    glVertex3f( 0.75, 0.75, 0.0 );
    glVertex3f( 0.25, 0.75, 0.0 );
    glEnd();

    glColor3f( 0.0, 0.0, 0.0 );
    glRectf( 0.45, 0.25, 0.55, 0.05 );
    glRectf( 0.35, 0.08, 0.65, 0.02 );

    glutSwapBuffers();


int main( int argc, char** argv )

    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( 250, 250 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;

【讨论】:

以上是关于不正确的随机彩色矩形的主要内容,如果未能解决你的问题,请参考以下文章

随机大小的均匀彩色图像的最小图像格式是啥?

无重叠的高效随机矩形放置

OpenGL随机大小矩形代码更改绘制的矩形

在 OpenCV 中创建随机彩色图像

ActionScript 3 随机彩色弹性条纹

随机彩色弹性条纹