/* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Janvier 2005 */ /* Variantes du trace de segments */ /* par l'algorithme de Bresenham */ #include #include #include #include #include #include #include "ModuleCouleurs.h" #include "ModuleMenus.h" #include "ModuleReshape.h" struct coord2D { double x; double y; } ; struct segment { coord2D pi; coord2D pf; } ; static int aff = 0; static int pt = 1; static segment seg1 = { { 45,22 },{ 3,35 } }; static segment seg2 = { { 17,2 },{ 9,29 } }; static segment seg = { { 45,22 },{ 3,35 } }; void pixel(int x,int y,float *c) { glColor4fv(c); glBegin(GL_QUADS) ; glVertex2i(x,y) ; glVertex2i(x+1,y) ; glVertex2i(x+1,y+1) ; glVertex2i(x,y+1) ; glEnd() ; glColor4fv(couleurNoir()); glBegin(GL_LINE_LOOP) ; glVertex2i(x,y) ; glVertex2i(x+1,y) ; glVertex2i(x+1,y+1) ; glVertex2i(x,y+1) ; glEnd() ; } void lignePixels(int xi,int yi, int xf,int yf, float *c) { int i,cumul ; int x = xi ; int y = yi ; int dx = xf - xi ; int dy = yf - yi ; int xinc = ( dx > 0 ) ? 1 : -1 ; int yinc = ( dy > 0 ) ? 1 : -1 ; dx = abs(dx) ; dy = abs(dy) ; pixel(x,y,c) ; if ( dx > dy ) { cumul = dx / 2 ; for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; if (cumul >= dx) { cumul -= dx ; y += yinc ; } pixel(x,y,c) ; } } else { cumul = dy / 2 ; for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; } pixel(x,y,c) ; } } } void lignePixelsAvecMotif(int xi,int yi, int xf,int yf, int motif, float *c) { int i,cumul ; int x = xi ; int y = yi ; int dx = xf - xi ; int dy = yf - yi ; int xinc = ( dx > 0 ) ? 1 : -1 ; int yinc = ( dy > 0 ) ? 1 : -1 ; dx = abs(dx) ; dy = abs(dy) ; if ( motif&0x0001 ) pixel(x,y,c) ; if ( dx > dy ) { cumul = dx / 2 ; for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; if (cumul >= dx) { cumul -= dx ; y += yinc ; } if ( (motif>>(i%16))&0x0001 ) pixel(x,y,c) ; } } else { cumul = dy / 2 ; for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; } if ( (motif>>(i%16))&0x0001 ) pixel(x,y,c) ; } } } void ligneHuitConnexite(int xi,int yi, int xf,int yf, float *c1, float *c2) { int dx,dy,i,xinc,yinc,cumul,x,y ; x = xi ; y = yi ; dx = xf - xi ; dy = yf - yi ; xinc = ( dx > 0 ) ? 1 : -1 ; yinc = ( dy > 0 ) ? 1 : -1 ; dx = abs(dx) ; dy = abs(dy) ; pixel(x,y,c1) ; if ( dx > dy ) { cumul = dx / 2 ; for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; if (cumul >= dx) { cumul -= dx ; y += yinc ; if ( cumul > dy/2 ) pixel(x-xinc,y,c2); else pixel(x,y-yinc,c2); } pixel(x,y,c1) ; } } else { cumul = dy / 2 ; for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; if ( cumul > dx/2 ) pixel(x,y-yinc,c2); else pixel(x-xinc,y,c2); } pixel(x,y,c1) ; } } } void dessineSegment(float *c,segment *s) { glColor4fv(c) ; glBegin(GL_LINES) ; glVertex2d(s->pi.x+0.5,s->pi.y+0.5); glVertex2d(s->pf.x+0.5,s->pf.y+0.5); glEnd() ; } void dessineQuadrillage(float *c) { int i; glColor4fv(c) ; glBegin(GL_LINES); for ( i = 1 ; i < 50 ; i++ ) { glVertex2d(1.0,i); glVertex2d(49.0,i); } for ( i = 1 ; i < 50 ; i++ ) { glVertex2d(i,1.0); glVertex2d(i,39.0); } glEnd() ; } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); switch (aff) { case 0 : dessineSegment(couleurRouge(),&seg1) ; dessineSegment(couleurRouge(),&seg2) ; break ; case 1 : dessineQuadrillage(couleurBleu()) ; dessineSegment(couleurRouge(),&seg1) ; dessineSegment(couleurRouge(),&seg2) ; break ; case 2 : dessineQuadrillage(couleurBleu()) ; lignePixels((int) seg1.pi.x, (int) seg1.pi.y, (int) seg1.pf.x, (int) seg1.pf.y, couleurVertFonce()); lignePixels((int) seg2.pi.x, (int) seg2.pi.y, (int) seg2.pf.x, (int) seg2.pf.y, couleurVertFonce()); dessineSegment(couleurRouge(),&seg1) ; dessineSegment(couleurRouge(),&seg2) ; break ; case 3 : dessineQuadrillage(couleurBleu()) ; lignePixelsAvecMotif((int) seg1.pi.x, (int) seg1.pi.y, (int) seg1.pf.x, (int) seg1.pf.y, 0xF176, couleurVertFonce()); lignePixelsAvecMotif((int) seg2.pi.x, (int) seg2.pi.y, (int) seg2.pf.x, (int) seg2.pf.y, 0xF176, couleurVertFonce()); dessineSegment(couleurRouge(),&seg1) ; dessineSegment(couleurRouge(),&seg2) ; break ; case 4 : dessineQuadrillage(couleurBleu()) ; ligneHuitConnexite((int) seg1.pi.x, (int) seg1.pi.y, (int) seg1.pf.x, (int) seg1.pf.y, couleurVertFonce(), couleurJaune()); ligneHuitConnexite((int) seg2.pi.x, (int) seg2.pi.y, (int) seg2.pf.x, (int) seg2.pf.y, couleurVertFonce(), couleurJaune()); dessineSegment(couleurRouge(),&seg1) ; dessineSegment(couleurRouge(),&seg2) ; break ; case 5 : dessineQuadrillage(couleurBleu()) ; lignePixelsAvecMotif((int) seg.pi.x, (int) seg.pi.y, (int) seg.pf.x, (int) seg.pf.y, 0xF176, couleurVertFonce()); dessineSegment(couleurRouge(),&seg) ; break ; case 6 : dessineQuadrillage(couleurBleu()) ; ligneHuitConnexite((int) seg.pi.x, (int) seg.pi.y, (int) seg.pf.x, (int) seg.pf.y, couleurVertFonce(), couleurJaune()); dessineSegment(couleurRouge(),&seg) ; break ; } glPopMatrix(); glFlush(); glutSwapBuffers() ; } void key(unsigned char key,int x,int y) { switch ( key ) { case 0x1B : exit(0); break; case ' ' : pt = !pt; break; case 0x0D : aff = (aff+1)%7; glutPostRedisplay(); break; } } void special(int key,int x,int y) { switch ( key ) { case GLUT_KEY_RIGHT : if ( pt ) seg.pi.x++; else seg.pf.x++; glutPostRedisplay(); break; case GLUT_KEY_LEFT : if ( pt ) seg.pi.x--; else seg.pf.x--; glutPostRedisplay(); break; case GLUT_KEY_DOWN : if ( pt ) seg.pi.y--; else seg.pf.y--; glutPostRedisplay(); break; case GLUT_KEY_UP : if ( pt ) seg.pi.y++; else seg.pf.y++; glutPostRedisplay(); break; } } void myinit() { glClearColor(0.8F,0.8F,0.8F,1.0F); } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); glutInitWindowSize(350,280); glutInitWindowPosition(50,50); glutCreateWindow("Segments de Bresenham"); myinit(); creationMenuBasique(); setParametresOrthoBasique(0.0,40.0,0.0,40.0,-50.0,50.0); glutReshapeFunc(reshapeOrthoBasique); glutKeyboardFunc(key); glutSpecialFunc(special); glutDisplayFunc(display); glutMainLoop(); return(0); }