单击鼠标时绘制多边形QUADS?

时间:2013-11-11 17:42:43

标签: opengl

当点击屏幕上的任何位置时如何绘制像方形或三角形的图形显示形状这是我的尝试我不知道在做什么 .................................................. ......................... .................................................. .....................................

   #include <windows.h> 

   #include <gl/Gl.h>

   #include <gl/glu.h>
   #include <gl/glut.h>

   GLsizei wh=500,ww=500;
   GLfloat size=3.0;
  void drawsquare( int x, int y)
    {
y=wh-y;
glBegin(GL_POLYGON);
glVertex2f(x+size,y+size);
glVertex2f(x-size,y+size);
glVertex2f(x-size,y-size);
glVertex2f(x+size,y-size);
glEnd();
glFlush();

      }

     void mymose(int button,int state,int x,int y)
      {
if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    drawsquare(x,y);
//if(button==GLUT_RIGHT_BUTTON_BUTTON && state==GLUT_UP)
    //     exit();
            }


    void myInit(){
glViewport(0,0,ww,wh);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)ww,0.0,(GLdouble)wh);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0,0.0,0.0,1.0);
glColor3f(1.0,0.0,0.0);
     }

    int main(int argc, char** argv)
     {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowSize(ww,wh);
glutInitWindowPosition(100,100);
glutCreateWindow("GLUT");
glutMouseFunc(mymose);

glutDisplayFunc(display);

glutMainLoop();
return 0;
}

1 个答案:

答案 0 :(得分:0)

你需要一个向量来存储点。

在鼠标回调中添加点,并通过glutPostRedisplay()请求重绘。

然后在display()中你可以旋转向量中的所有点并在它们周围绘制四边形:

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

struct Point
{
    Point( float x, float y ) : x(x), y(y) {}
    float x, y;
};
std::vector< Point > points;

void mouse( int button, int state, int x, int y )
{
    if( button == GLUT_LEFT_BUTTON && state == GLUT_UP )
    {
        points.push_back( Point( x, y ) );
    }
    if( button == GLUT_RIGHT_BUTTON && state == GLUT_UP )
    {
        points.clear();
    }
    glutPostRedisplay();
}

void display()
{
    glClearColor( 0, 0, 0, 1 );
    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    int w = glutGet( GLUT_WINDOW_WIDTH );
    int h = glutGet( GLUT_WINDOW_HEIGHT );
    glOrtho( 0, w, h, 0, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3ub( 255, 0, 0 );
    glBegin( GL_QUADS );
    for( size_t i = 0; i < points.size(); ++i )
    {
        const unsigned int SIZE = 20;
        const Point& pt = points[ i ];
        glVertex2i( pt.x - SIZE, pt.y - SIZE );
        glVertex2i( pt.x + SIZE, pt.y - SIZE );
        glVertex2i( pt.x + SIZE, pt.y + SIZE );
        glVertex2i( pt.x - SIZE, pt.y + SIZE );
    }
    glEnd();

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glutMouseFunc( mouse );
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;
}