-2

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

   #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;
}
4

1 回答 1

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;
}
于 2013-11-12T21:38:47.923 回答