/* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Mars 2002 */ /* Ligne brisee et polygone */ #include #include #include #include #include #include #include "ModuleCouleurs.h" #include "ModuleManipulateur.h" #include "ModuleMenus.h" #include "ModuleReshape.h" #include "ModuleFont.h" struct coord2D { float x; float y; } ; struct polygone { int np; coord2D *p; } ; static int aff = 0 ; static int pol = 0 ; static coord2D pt1[5] = { { 25,0 }, { 5,18 }, { -10,14 }, { -21,-12 }, { 14,-17 } }; static coord2D pt2[7] = { { 26,2 }, { 7,22 }, { -10,22 }, { -21,-1 }, { -7,-17 }, { 10,-22 }, { 19,-19 } }; static polygone p1 = { 5,pt1 }; static polygone p2 = { 7,pt2 }; void myinit() { setAlignement(CENTER); glClearColor(0.8F,0.8F,0.8F,1.0F); } void afficheSommets(polygone *p) { int i; glColor4fv(couleurBleu()) ; for ( i = 0 ; i < p->np ; i++ ) { float x = p->p[i].x; float y = p->p[i].y; float d = sqrt(x*x+y*y); x /= d/12.0F; y /= d/12.0F; placeFontCursor(p->p[i].x,p->p[i].y,0.0) ; deplacementCursor(x,-y,0) ; simpleBitmapOutput(1,REGULAR8x13,"P") ; deplacementCursor(x+5,-y+2,0) ; simpleBitmapOutput(1,REGULAR6x10,"%d",i) ; } } void dessineLigneBrisee(polygone *p) { int i ; glPushMatrix() ; glColor4fv(couleurNoir()) ; glLineWidth(2.0) ; glBegin(GL_LINE_STRIP) ; for ( i = 0 ; i < p->np ; i++ ) glVertex2fv((float *) &p->p[i]); glEnd() ; glLineWidth(1.0) ; afficheSommets(p); glPopMatrix() ; } void dessinePolygone(float *coul,polygone *p) { int i; glPushMatrix() ; glColor4fv(coul) ; glBegin(GL_POLYGON) ; for ( i = 0 ; i < p->np ; i++ ) glVertex2fv((float *) &p->p[i]); glEnd() ; glColor4fv(couleurNoir()) ; glLineWidth(2.0) ; glBegin(GL_LINE_LOOP) ; for ( i = 0 ; i < p->np ; i++ ) glVertex2fv((float *) &p->p[i]); glEnd() ; glLineWidth(1.0) ; afficheSommets(p); glPopMatrix() ; } void display() { polygone *p; switch ( pol ) { case 0 : p = &p1; break; case 1 : p = &p2; break; } glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); manipulateurSouris(); manipulateurClavier(); switch (aff) { case 0 : dessineLigneBrisee(p) ; break ; case 1 : dessinePolygone(couleurRose(),p) ; break ; } glPopMatrix(); glFlush(); glutSwapBuffers() ; } void key(unsigned char key,int x,int y) { if ( keyManipulateur(key,x,y) ) glutPostRedisplay(); else switch ( key ) { case 0x0D : aff = (aff+1)%2; glutPostRedisplay(); break; case 0x20 : pol = (pol+1)%2; glutPostRedisplay(); break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); glutInitWindowSize(230,200); glutInitWindowPosition(50,50); glutCreateWindow("Ligne brisee et polygone"); myinit(); creationMenuBasique(); setParametresOrthoBasique(-30.0,30.0,-30.0,30.0,-50.0,50.0); setManipulateurDistance(1.0F); glutReshapeFunc(reshapeOrthoBasique); glutKeyboardFunc(key); glutSpecialFunc(specialBasique); glutMotionFunc(motionBasique); glutMouseFunc(sourisBasique); glutDisplayFunc(display); glutMainLoop(); return(0); }