Le source: RemplissageFacette3D.cpp
#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> #include <stdio.h> #include <stdlib.h> #include <math.h> float anglex = 0.0F ; float angley = 0.0F ; float anglez = 0.0F ; int aff = 0 ; int yy = 0 ; void ligne(int xi,int yi,int zi,int xf,int yf,int zf,int *px,int *pz) { int i,cumul,cumulz ; int x = xi ; int y = yi ; int z = zi ; int dx = xf - xi ; int dy = yf - yi ; int dz = zf - zi ; int xinc = ( dx > 0 ) ? 1 : -1 ; int yinc = ( dy > 0 ) ? 1 : -1 ; int zinc = ( dz > 0 ) ? 1 : -1 ; dx = abs(dx) ; dy = abs(dy) ; dz = abs(dz) ; px[y] = x ; pz[y] = z ; if ( dx > dy ) { cumul = dx / 2 ; cumulz = dy / 2 ; while (cumulz >= dx) { cumulz -= dx ; z += zinc ; } for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; cumulz += dz ; if (cumul >= dx) { cumul -= dx ; y += yinc ; } while (cumulz >= dx) { cumulz -= dx ; z += zinc ; } px[y] = x ; pz[y] = z ; } } else { cumul = dy / 2 ; cumulz = dy / 2 ; while ( cumulz >= dy ) { cumulz -= dy ; z += zinc ; } for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; cumulz += dz ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; } while ( cumulz >= dy ) { cumulz -= dy ; z += zinc ; } px[y] = x ; pz[y] = z ; } } if ( z != zf ) printf("*\n") ; } void ligneCote(int xi,int yi,int zi,int xf,int yf,int zf,int *px,int *pz) { if ( xi > xf ) ligne(xf,yf,zf,xi,yi,zi,px,pz) ; else ligne(xi,yi,zi,xf,yf,zf,px,pz) ; } void axes() { float rouge[] = { 1.0F,1.0F,0.0F,1.0F }; glColor4fv(rouge) ; glBegin(GL_LINES) ; glVertex3f(0.0F,0.0F,0.0F) ; glVertex3f(20.0F,0.0F,0.0F) ; glEnd() ; float vert[] = { 0.0F,1.0F,1.0F,1.0F }; glColor4fv(vert) ; glBegin(GL_LINES) ; glVertex3f(0.0F,0.0F,0.0F) ; glVertex3f(0.0F,20.0F,0.0F) ; glEnd() ; float bleu[] = { 0.0F,0.0F,1.0F,1.0F }; glColor4fv(bleu) ; glBegin(GL_LINES) ; glVertex3f(0.0F,0.0F,0.0F) ; glVertex3f(0.0F,0.0F,20.0F) ; glEnd() ; } void CALLBACK init() { glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glClearColor(0.8F,0.8F,0.8F,1.0F); } void Facette(float *coul,float *p1,float *p2,float *p3) { glPushMatrix() ; glColor4fv(coul) ; glBegin(GL_TRIANGLES) ; glVertex3fv(p1) ; glVertex3fv(p2) ; glVertex3fv(p3) ; glEnd() ; float noir[] = { 0.0F,0.0F,0.0F } ; glColor3fv(noir) ; glLineWidth(1.0) ; glBegin(GL_LINE_LOOP) ; glVertex3fv(p1) ; glVertex3fv(p2) ; glVertex3fv(p3) ; glEnd() ; glLineWidth(1.0) ; glPopMatrix() ; } void Pixel(int x, int y,int z) { glBegin(GL_QUADS) ; glVertex3f(2*x-30.0F,2*y-30.0F,2.0F*z) ; glVertex3f(2*x-28.0F,2*y-30.0F,2.0F*z) ; glVertex3f(2*x-28.0F,2*y-28.0F,2.0F*z) ; glVertex3f(2*x-30.0F,2*y-28.0F,2.0F*z) ; glEnd() ; } void LigneDiscrete(int y,int x1,int z1,int x2,int z2) { if ( x2 != -100 ) { int i,cumul ; int x = x1 ; int z = z1 ; int dx = x2 - x1 ; int dz = z2 - z1 ; int xinc = ( dx > 0 ) ? 1 : -1 ; int zinc = ( dz > 0 ) ? 1 : -1 ; dx = abs(dx) ; dz = abs(dz) ; Pixel(x,y,z) ; cumul = dz / 2 ; while ( cumul > dx ) { cumul -= dx ; z += zinc ; } for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dz ; while ( cumul > dx ) { cumul -= dx ; z += zinc ; } Pixel(x,y,z) ; } } } void FacetteDiscrete(float *coul,float *p1,float *p2,float *p3) { glColor4fv(coul) ; glPushMatrix() ; int px1[30] ; int px2[30] ; int px3[30] ; int pz1[30] ; int pz2[30] ; int pz3[30] ; for ( int i = 0 ; i < 30 ; i++ ) { px1[i] = px2[i] = px3[i] = -100 ; pz1[i] = pz2[i] = pz3[i] = 0 ; } ligneCote((int) (p1[0]+30)/2,(int) (p1[1]+30)/2,(int) (p1[2])/2,(int) (p2[0]+30)/2,(int) (p2[1]+30)/2,(int) (p2[2])/2,px1,pz1) ; ligneCote((int) (p1[0]+30)/2,(int) (p1[1]+30)/2,(int) (p1[2])/2,(int) (p3[0]+30)/2,(int) (p3[1]+30)/2,(int) (p3[2])/2,px2,pz2) ; ligneCote((int) (p2[0]+30)/2,(int) (p2[1]+30)/2,(int) (p2[2])/2,(int) (p3[0]+30)/2,(int) (p3[1]+30)/2,(int) (p3[2])/2,px3,pz3) ; int x1[30] ; int x2[30] ; int z1[30] ; int z2[30] ; for ( i = 0 ; i < 30 ; i++ ) { x1[i] = x2[i] = -100 ; z1[i] = z2[i] = 0 ; } for ( i = 0 ; i < 30 ; i++ ) { if ( px1[i] > x1[i] ) { x1[i] = px1[i] ; z1[i] = pz1[i] ; } if ( px2[i] > x1[i] ) { x1[i] = px2[i] ; z1[i] = pz2[i] ; } if ( px3[i] > x1[i] ) { x1[i] = px3[i] ; z1[i] = pz3[i] ; } } for ( i = 0 ; i < 30 ; i++ ) x2[i] = x1[i] ; for ( i = 0 ; i < 30 ; i++ ) { if ( ( px1[i] <= x2[i] ) && ( px1[i] != -100 ) ) { x2[i] = px1[i] ; z2[i] = pz1[i] ; } if ( ( px2[i] <= x2[i] ) && ( px2[i] != -100 ) ) { x2[i] = px2[i] ; z2[i] = pz2[i] ; } if ( ( px3[i] <= x2[i] ) && ( px3[i] != -100 ) ) { x2[i] = px3[i] ; z2[i] = pz3[i] ; } } for ( int y = 0 ; y < 30 ; y++ ) LigneDiscrete(y,x2[y],z2[y],x1[y],z1[y]) ; glPopMatrix() ; } void lignePixels(int xi,int yi,int zi,int xf,int yf,int zf) { int i,cumul,cumulz ; int x = xi ; int y = yi ; int z = zi ; int dx = xf - xi ; int dy = yf - yi ; int dz = zf - zi ; int xinc = ( dx > 0 ) ? 1 : -1 ; int yinc = ( dy > 0 ) ? 1 : -1 ; int zinc = ( dz > 0 ) ? 1 : -1 ; dx = abs(dx) ; dy = abs(dy) ; dz = abs(dz) ; Pixel(x,y,z) ; if ( dx > dy ) { cumul = dx / 2 ; cumulz = dy / 2 ; while (cumulz >= dx) { cumulz -= dx ; z += zinc ; } for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; cumulz += dz ; if (cumul >= dx) { cumul -= dx ; y += yinc ; } while (cumulz >= dx) { cumulz -= dx ; z += zinc ; } Pixel(x,y,z) ; } } else { cumul = dy / 2 ; cumulz = dy / 2 ; while ( cumulz >= dy ) { cumulz -= dy ; z += zinc ; } for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; cumulz += dz ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; } while ( cumulz >= dy ) { cumulz -= dy ; z += zinc ; } Pixel(x,y,z) ; } } } void CoteFacette(float *coul,float *p1,float *p2) { glColor4fv(coul) ; glPushMatrix() ; lignePixels((int) (p1[0]+30)/2,(int) (p1[1]+30)/2,(int) (p1[2])/2,(int) (p2[0]+30)/2,(int) (p2[1]+30)/2,(int) (p2[2])/2) ; glPopMatrix() ; } void FacetteDiscreteTrame(float *coul,float *c,float *p1,float *p2,float *p3,int yy) { glColor4fv(coul) ; glPushMatrix() ; int px1[30] ; int px2[30] ; int px3[30] ; int pz1[30] ; int pz2[30] ; int pz3[30] ; for ( int i = 0 ; i < 30 ; i++ ) { px1[i] = px2[i] = px3[i] = -100 ; pz1[i] = pz2[i] = pz3[i] = 0 ; } ligneCote((int) (p1[0]+30)/2,(int) (p1[1]+30)/2,(int) (p1[2])/2,(int) (p2[0]+30)/2,(int) (p2[1]+30)/2,(int) (p2[2])/2,px1,pz1) ; ligneCote((int) (p1[0]+30)/2,(int) (p1[1]+30)/2,(int) (p1[2])/2,(int) (p3[0]+30)/2,(int) (p3[1]+30)/2,(int) (p3[2])/2,px2,pz2) ; ligneCote((int) (p2[0]+30)/2,(int) (p2[1]+30)/2,(int) (p2[2])/2,(int) (p3[0]+30)/2,(int) (p3[1]+30)/2,(int) (p3[2])/2,px3,pz3) ; int x1[30] ; int x2[30] ; int z1[30] ; int z2[30] ; for ( i = 0 ; i < 30 ; i++ ) { x1[i] = x2[i] = -100 ; z1[i] = z2[i] = 0 ; } for ( i = 0 ; i < 30 ; i++ ) { if ( px1[i] > x1[i] ) { x1[i] = px1[i] ; z1[i] = pz1[i] ; } if ( px2[i] > x1[i] ) { x1[i] = px2[i] ; z1[i] = pz2[i] ; } if ( px3[i] > x1[i] ) { x1[i] = px3[i] ; z1[i] = pz3[i] ; } } for ( i = 0 ; i < 30 ; i++ ) x2[i] = x1[i] ; for ( i = 0 ; i < 30 ; i++ ) { if ( ( px1[i] <= x2[i] ) && ( px1[i] != -100 ) ) { x2[i] = px1[i] ; z2[i] = pz1[i] ; } if ( ( px2[i] <= x2[i] ) && ( px2[i] != -100 ) ) { x2[i] = px2[i] ; z2[i] = pz2[i] ; } if ( ( px3[i] <= x2[i] ) && ( px3[i] != -100 ) ) { x2[i] = px3[i] ; z2[i] = pz3[i] ; } } for ( int y = 0 ; y <= yy-1 ; y++ ) LigneDiscrete(y,x2[y],z2[y],x1[y],z1[y]) ; glColor4fv(c) ; LigneDiscrete(yy,x2[y],z2[y],x1[y],z1[y]) ; glPopMatrix() ; } void CotesFacette(float *coul1,float *p1,float *coul2,float *p2,float *coul3,float *p3) { CoteFacette(coul1,p1,p2) ; CoteFacette(coul2,p1,p3) ; CoteFacette(coul3,p2,p3) ; } void echange(float *p1,float *p2) { float aux = *p1 ; *p1 = *p2 ; *p2 = aux ; } void echangeSommet(float *p1,float *p2) { if ( p1[1] > p2[1] ) { echange(&p1[0],&p2[0]) ; echange(&p1[1],&p2[1]) ; echange(&p1[2],&p2[2]) ; } } void CALLBACK display() { float rouge[] = { 1.0F,0.0F,0.0F,1.0F }; float vert[] = { 0.0F,1.0F,0.0F,1.0F }; float bleu[] = { 0.0F,0.0F,1.0F,1.0F }; float f11[] = { -25.0F,-25.0F,-4.0F } ; float f12[] = { -20.0F,20.0F,-7.0F } ; float f13[] = { 25.0F,5.0F,13.0F } ; echangeSommet(f11,f12) ; echangeSommet(f12,f13) ; echangeSommet(f11,f12) ; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(anglex,1.0F,0.0F,0.0F) ; glRotatef(angley,0.0F,1.0F,0.0F) ; glRotatef(anglez,0.0F,0.0F,1.0F) ; glPushMatrix(); switch (aff) { case 0 : Facette(rouge,f11,f12,f13) ; break ; case 1 : CoteFacette(rouge,f11,f12) ; break ; case 2 : CoteFacette(vert,f11,f13) ; break ; case 3 : CoteFacette(bleu,f12,f13) ; break ; case 4 : CotesFacette(rouge,f11,vert,f12,bleu,f13) ; break ; case 5 : FacetteDiscreteTrame(rouge,bleu,f11,f12,f13,yy) ; break ; case 6 : FacetteDiscrete(rouge,f11,f12,f13) ; break ; } glPopMatrix(); glPushMatrix(); axes() ; glPopMatrix(); glPopMatrix(); glFlush(); auxSwapBuffers() ; } void CALLBACK reshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if( w <= h) glOrtho(-30.0,30.0,-30.0*(double) h/w,30.0*(double) h/w,-40.0,40.0); else glOrtho(-30.0*(double) h/w,30.0*(double) h/w,-30.0,30.0,-40.0,40.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK auxKeyLeft() { angley-=2 ; } void CALLBACK auxKeyRight() { angley+=2 ; } void CALLBACK auxKeyUp() { anglex-=2 ; } void CALLBACK auxKeyDown() { anglex+=2 ; } void CALLBACK auxKeyz() { anglez+=2 ; } void CALLBACK auxKeyZ() { anglez-=2 ; } void CALLBACK auxKeyReturn() { yy = 0 ; aff++ ; if ( aff == 7 ) aff = 0 ; } void CALLBACK auxKeySpace() { yy++ ; if ( yy == 30 ) yy = 0 ; } void main(void) { auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA|AUX_DEPTH); auxInitPosition (0,0,300,300); auxInitWindow("Remplissage d'une facette 3D") ; init(); auxKeyFunc(AUX_RETURN,auxKeyReturn) ; auxKeyFunc(AUX_SPACE,auxKeySpace) ; auxKeyFunc(AUX_UP,auxKeyUp) ; auxKeyFunc(AUX_DOWN,auxKeyDown) ; auxKeyFunc(AUX_RIGHT,auxKeyRight) ; auxKeyFunc(AUX_LEFT,auxKeyLeft) ; auxKeyFunc(AUX_z,auxKeyz) ; auxKeyFunc(AUX_Z,auxKeyZ) ; auxReshapeFunc(reshape); auxMainLoop(display); }
RETOUR