L'exécutable

ZB12.gif (6293 octets)  ZB13.gif (8265 octets)

ZB14.gif (7231 octets)  ZB15.gif (6320 octets)

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);
}
WB01624_.gif (281 octets) RETOUR