/* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Avril 2001 */ /* Progammation de l'algorithme */ /* de Bresenham pour le trace de segments */ #include #include #include #include #include #include #include "ModuleCouleurs.h" #include "ModuleMenus.h" #include "ModuleManipulateur.h" #include "ModuleReshape.h" static int aff = 0 ; static float angle = 0 ; static int p1[] = { 18,15 } ; static int p2[] = { 27,15 } ; static int anim = 0; void line(int *p1,int *p2) { glColor4fv(couleurBleu()) ; glBegin(GL_LINES) ; glVertex2f(p1[0]*10,p1[1]*10) ; glVertex2f(p2[0]*10,p2[1]*10) ; glEnd() ; } void pixel(int x,int y,float *c) { glColor4fv(c) ; glBegin(GL_QUADS) ; glVertex2f(x*10-5,y*10-5) ; glVertex2f(x*10-5,y*10+5) ; glVertex2f(x*10+5,y*10+5) ; glVertex2f(x*10+5,y*10-5) ; glEnd() ; } void ligneQuatreConnexite(float *c,int *p1,int *p2) { int dx,dy,i,xinc,yinc,cumul,x,y ; x = p1[0] ; y = p1[1] ; dx = p2[0] - p1[0] ; dy = p2[1] - p1[1] ; xinc = ( dx > 0 ) ? 1 : -1 ; 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 ligneHuitConnexite(float *c1,float *c2,int *p1,int *p2) { int dx,dy,i,xinc,yinc,cumul,x,y ; x = p1[0] ; y = p1[1] ; dx = p2[0] - p1[0] ; dy = p2[1] - p1[1] ; 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 < dx/2 ) pixel(x,y-yinc,c2); else pixel(x-xinc,y,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 > dy/2 ) pixel(x,y-yinc,c2); else pixel(x-xinc,y,c2); } pixel(x,y,c1) ; } } } void ligneAvecMotif(float *c,int *p1,int *p2,int pattern) { int dx,dy,i,xinc,yinc,cumul,x,y ; int cp = 0; x = p1[0] ; y = p1[1] ; dx = p2[0] - p1[0] ; dy = p2[1] - p1[1] ; xinc = ( dx > 0 ) ? 1 : -1 ; yinc = ( dy > 0 ) ? 1 : -1 ; dx = abs(dx) ; dy = abs(dy) ; int bt = (pattern >> cp) & 0x1; if ( bt ) pixel(x,y,c) ; cp = (cp+1)%32; if ( dx > dy ) { cumul = dx / 2 ; for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; if (cumul >= dx) { cumul -= dx ; y += yinc ; } int bt = (pattern >> cp) & 0x1; if ( bt ) pixel(x,y,c) ; cp = (cp+1)%32; } } else { cumul = dy / 2 ; for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; } int bt = (pattern >> cp) & 0x1; if ( bt ) pixel(x,y,c) ; cp = (cp+1)%32; } } } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); switch (aff) { case 0 : ligneQuatreConnexite(couleurRouge(),p1,p2) ; line(p1,p2) ; break ; case 1 : ligneAvecMotif(couleurRouge(),p1,p2,0xF3A2D75B) ; line(p1,p2) ; break ; case 2 : ligneHuitConnexite(couleurRouge(),couleurVert(),p1,p2) ; line(p1,p2) ; break ; } glPopMatrix(); glFlush(); glutSwapBuffers() ; } void idle() { if ( anim ) { angle += 0.003F; p1[0] =(int) (16 + 10*cos(angle)); p2[0] =(int) (16 + 14*cos(1.314*angle)); p1[1] =(int) (16 + 8*sin(angle)); p2[1] =(int) (16 + 14*sin(1.314*angle)); glutPostRedisplay() ; } } void reshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,w,0,h,-10.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key,int x,int y) { switch ( key ) { case 0x0D : anim = !anim; break; case 0x20 : aff = (aff+1)%3; break; case '\033' : exit(0); break ; } glutPostRedisplay(); } void init() { glShadeModel(GL_SMOOTH); glClearColor(0.8F,0.8F,0.8F,1.0F); } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); glutInitWindowSize(300,300); glutCreateWindow("Algorithme de Bresenham"); init(); creationMenuBasique(); setParametresOrthoBasique(-5.0,5.0,-5.0,5.0,-500.0,500.0); setManipulateurDistance(1.0F); glutReshapeFunc(reshapeOrthoBasique); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(idle); glutMainLoop(); return(0); }