/* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Mars 2002 */ /* Rasterisation de segments de droites */ /* sur un ecran bitmap */ #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; } ; int aff = 0; static segment seg1 = { { 3,11 },{ 22,17 } }; static segment seg2 = { { 10,2 },{ 18,13 } }; 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 lignePixelsTrouee(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 ; int cpt = 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 ; } cpt = (cpt+1)%4; if ( cumul > dx/3 ) 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 ; } cpt = (cpt+1)%4; if ( cumul > dx/3 ) pixel(x,y,c) ; } } } void ligneHuitConnexite(int xi,int yi,int xf,int yf,float *c) { 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,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 ( cumul <= dy/2 ) pixel(x,y-yinc,c); else pixel(x-xinc,y,c); } 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 ( cumul >= dx/2 ) pixel(x,y-yinc,c); else pixel(x-xinc,y,c); } pixel(x,y,c) ; } } } void dessineSegment(float *c,segment *s) { glColor4fv(c) ; glLineWidth(3.0) ; 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() ; glLineWidth(1.0) ; } void dessineQuadrillage(float *c) { int i; glColor4fv(c) ; glBegin(GL_LINES); for ( i = 1 ; i < 20 ; i++ ) { glVertex2d(1.0,i); glVertex2d(24.0,i); } for ( i = 1 ; i < 25 ; i++ ) { glVertex2d(i,1.0); glVertex2d(i,19.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()) ; lignePixelsTrouee((int) seg1.pi.x,(int) seg1.pi.y,(int) seg1.pf.x,(int) seg1.pf.y,couleurVertFonce()); lignePixelsTrouee((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 4 : dessineQuadrillage(couleurBleu()) ; ligneHuitConnexite((int) seg1.pi.x,(int) seg1.pi.y,(int) seg1.pf.x,(int) seg1.pf.y,couleurVertFonce()); ligneHuitConnexite((int) seg2.pi.x,(int) seg2.pi.y,(int) seg2.pf.x,(int) seg2.pf.y,couleurVertFonce()); dessineSegment(couleurRouge(),&seg1) ; dessineSegment(couleurRouge(),&seg2) ; break ; } glPopMatrix(); glFlush(); glutSwapBuffers() ; } void key(unsigned char key,int x,int y) { switch ( key ) { case 0x1B : exit(0); break; case 0x0D : aff = (aff+1)%5; 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(325,260); glutInitWindowPosition(50,50); glutCreateWindow("Essais de rasterisation"); myinit(); creationMenuBasique(); setParametresOrthoBasique(0.0,20.0,0.0,20.0,-50.0,50.0); glutReshapeFunc(reshapeOrthoBasique); glutKeyboardFunc(key); glutDisplayFunc(display); glutMainLoop(); return(0); }