2017-10-01 2 views
0

J'essaie de dessiner une forme comme vous le faites avec l'outil dans la peinture, où vous le faites glisser et quand vous relâchez la souris et il dessine la forme.Rectangle de dessin OpenGL avec glisser de la souris?

Actuellement, ce que mon programme fait est que si vous cliquez dessus, il va venir avec l'élastique pour vous montrer à quoi ressemble la forme, mais rien ne se dessine lorsque vous relâchez le clic de la souris.

Le code correspondant est le suivant:

// this function draws the list of objects 
void drawList() { 
    glClear(GL_COLOR_BUFFER_BIT); // Clear display window. 
    if (list[numObj].t==1){ 
     glBegin(GL_LINE_LOOP); 
     glVertex2i(list[numObj].x1, list[numObj].y1); 
     glVertex2i(list[numObj].x1, list[numObj].y2); 
     glVertex2i(list[numObj].x2, list[numObj].y2); 
     glVertex2i(list[numObj].x2, list[numObj].y1); 
     glEnd(); 
    } 
    glFlush(); 
} 

void mouseDraw(GLint button, GLint action, GLint xMouse, GLint yMouse) { 
    if (type == 1){ 
     if (button == GLUT_LEFT_BUTTON) { 
      if (action == GLUT_DOWN && button != GLUT_RIGHT_BUTTON && numObj < MaxNumObj -1) { 
       list[numObj].x1 = xMouse; 
       list[numObj].y1 = yMouse; 
       list[numObj].x2 = xMouse; 
       list[numObj].y2 = yMouse; 
       list[numObj].t = type; 
       list[numObj].s = 2; 
       list[numObj].r = red; 
       list[numObj].g = green; 
       list[numObj].b = blue; 
       glutPostRedisplay(); 

      } else if (action == GLUT_UP && button != GLUT_RIGHT_BUTTON) { 
       list[numObj].x2 = xMouse; 
       list[numObj].y2 = yMouse; 
       list[numObj].s = style; 
       numObj++; 
       glutPostRedisplay(); 
      } 
     } 
    } 
} 

// this function takes the mouse position while moving mouse, use this for intermediate drawing 
void Motion(GLint x, GLint y) { 
    // add the (x, y) coordinates of the second point to the intermediate rectangle 
    list[numObj].x2 = x; 
    list[numObj].y2 = y; 
    // redisplay the object list after the above insertion. It will give a rubber band effect 

    glutPostRedisplay (); 
} 

code principal concerné:

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
glutInitWindowPosition(100, 100); 
glutInitWindowSize(winWidth, winHeight); 
glutCreateWindow("SimpleDraw Example"); 

init(); 

// register call back funtions 
glutDisplayFunc(drawList); 
glutReshapeFunc(winReshapeFcn); 
glutMouseFunc(mouseDraw); 
glutMotionFunc(Motion); 

//add right click menu 
glutAttachMenu(GLUT_RIGHT_BUTTON); 

glutMainLoop(); 

S'il vous plaît ignorer les .s .t et d'autres choses, les seules choses pertinentes devraient être les x et ys.

Voici quelques gifs pour montrer mon résultat courant et le résultat souhaité:

mon programme actuel
my current program

ce que je veux faire
what I want it to do

+0

Utilisez un 'std :: vector' avec le type de données' list'. Sur 'GLUT_UP', gardez le rectangle de dessin actuel et placez-en un nouveau dans' std :: vector'. Dans 'drawList' vous devez dessiner tous les rectangles contenus dans le fichier' std :: vector' dans une boucle. – Rabbid76

+0

il semble que cela devrait fonctionner ... quel compilateur? Mon pari est '(action == GLUT_UP && bouton! = GLUT_RIGHT_BUTTON)' n'est pas évalué comme vous pensez essayer '((action == GLUT_UP) && (bouton! = GLUT_RIGHT_BUTTON))' et dans l'autre si trop ... est 'list []' alloué (statiquement ou dynamiquement) avec une taille plus grande que 1? Comment décidez-vous de rendre un objet édité? soit ajouter un peu de booléen ou incrémenter le 'numobj' sur la souris et utiliser' numobj-1' comme index plus tard. Rendez-vous les objets en boucle? – Spektre

+1

Ça marche maintenant! comme Rabbid76 a suggéré que je devais juste dessiner ma liste d'objets, donc j'ai juste utilisé une boucle for pour passer de 0 à numObj et dessiner les objets existants au début de la fonction draw – dshawn

Répondre

0

Vous devez dessiner tous les rectangles , que vous avez stocké dans votre list, du premier au dernier:

void drawList() { 

    glClear(GL_COLOR_BUFFER_BIT); // Clear display window. 

    for(size_t i = 0; i <= numObj; ++ i) { 

     if (list[numObj].t==1){ 

      glBegin(GL_LINE_LOOP); 
      glVertex2i(list[i].x1, list[i].y1); 
      glVertex2i(list[i].x1, list[i].y2); 
      glVertex2i(list[i].x2, list[i].y2); 
      glVertex2i(list[i].x2, list[i].y1); 
      glEnd(); 
     } 
    } 
    glFlush(); 
}