PDA

Visualizza la versione completa : [C++] Modificare colore di una linea (OpenGL)


Heroes7
22-02-2011, 20:42
Salve a tutti, mi sono inoltrato da poco in questo mondo e son quindi alle prime armi..mi trovo un p˛ in difficoltÓ con un progettino che devo fare o meglio con una parte di questo.

Il progetto consiste nel disegnare tramite mouse una linea. Tenendo premuto il pulsante sinistro e spostando il mouse viene visualizzata la linea a seconda di dove spostiamo il cursore, poi quando rilasciamo il pulsante questa viene disegnata. Fin qui non ho avuto problemi..il problema Ŕ ora, ovvero devo creare un men¨ che mi permetta di cambiargli colore..ovviamente non ho problemi a creare il menu ma Ŕ dopo il problema, ovvero fargli cambiare colore........


#define MAX_LINE 50

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <STRING.h>
#include <math.h>
#include <GL/glut.h>

typedef struct linea{
int x1,x2,y1,y2;
int color;

} linea;

linea linee[MAX_LINE];
GLfloat colors[6][3]={{1.0, 0.0, 0.0}, {1.0, 1.0, 0.0},{0.0, 1.0, 0.0},
{0.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 0.5, 0.0}};

int in_linee = -1;
GLsizei wh = 500, ww = 500; /* initial window size */

void mydisplay(){
glViewport(0, 0, wh, ww);
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_LINES);
int i;
for(i=0; i<in_linee+1; i++){
glColor3fv(colors[linee[i].color]);
glVertex2i(linee[i].x1 , linee[i].y1);
glVertex2i(linee[i].x2 , linee[i].y2);
}
glEnd();
glFlush();
glutSwapBuffers();
}

void myMotion(int x, int y){
y = wh-y;
linee[in_linee].x2 = x;
linee[in_linee].y2 = y;
glutPostRedisplay();
}


void mymouse(int button, int state, int x, int y){
y = wh-y;

if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
in_linee +=1;
linee[in_linee].x1 = x;
linee[in_linee].y1 = y;
linee[in_linee].color = 0;
}
if(button == GLUT_LEFT_BUTTON && state == GLUT_UP){
linee[in_linee].x2 = x;
linee[in_linee].y2 = y;
if(linee[in_linee].x1 == linee[in_linee].x2 && linee[in_linee].y1 == linee[in_linee].y2){
in_linee -= 1;
}
glutPostRedisplay();
}

}

void mykey(unsigned char key, int x, int y){
switch(key){
case 26 :
in_linee = in_linee-1;
if(in_linee <0){
in_linee = -1;
}
break;
}
glutPostRedisplay();
}

void init(){
// colore nero come sfondo
glClearColor (0.0, 0.0, 0.0, 1.0);
// Disegna qualunque cosa di bianco
glColor3f(1.0, 1.0, 1.0);
// Imposta il volume della vista
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D(0, wh, 0, ww);
}

void demo_menu(int id)
{
switch (id) {
case 1:
exit(0);
break;
case 2:
linee[in_linee].color= glColor3fv(colors[linee[i].color]);
break;
case 3:
linee[in_linee].color= glColor3fv(colors[linee[i].color]);
break;
case 4:
linee[in_linee].color = glColor3fv(colors[linee[i].color]);
break;
case 5:
linee[in_linee].color = glColor3fv(colors[linee[i].color]);
break;
case 6:
linee[in_linee].color = glColor3fv(colors[linee[i].color]);
break;
default:
break;
}
glutPostRedisplay();
}

int main(int argc, char** argv){
glutInit(&argc,argv);

// Definiamo le proprietÓ della finestra
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(wh,ww);
glutInitWindowPosition(0,0);
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
//glutIdleFunc(myidle);
glutCreateMenu(demo_menu);
glutAddMenuEntry("quit",1);
glutAddMenuEntry("Colore Giallo",2);
glutAddMenuEntry("Colore Verde",3);
glutAddMenuEntry("Colore Blu",4);
glutAddMenuEntry("Colore Bianco",5);
glutAddMenuEntry("Colore Arancione",6);
glutAttachMenu(GLUT_RIGHT_BUTTON);

glutMouseFunc(mymouse);
glutMotionFunc(myMotion);
glutKeyboardFunc(mykey);



// Inizializziamo le variabili di stato di OpenGL
init();

// Entriamo nel ciclo di rendering
glutMainLoop();
}

Loading