Colorier des triangles...

xplot Messages postés 1 Date d'inscription vendredi 11 mai 2007 Statut Membre Dernière intervention 11 mai 2007 - 11 mai 2007 à 17:38
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 11 mai 2007 à 18:30
Bonjour,
je trace des iso. et entre chaque iso il y a une meme couleur. J'utilise un maillage de triangles.
Je doit colorier en fonction des triangles. Donc j'ai étudié tous les cas possible..mais il y a des triangles qui ne se colorie pas..
 un exemple http://zax469.free.fr/photo/Screenshot4.png
Je ne sais pas si vous comprenais ce que je veux dire...
 Je vous remercie d'avance
 
        xplot

#include <GL/glut.h>

#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <fstream>
#include
#include <cassert>
using namespace std;

#include <vector>
#include "RNM.hpp"

#include "Mesh2d.hpp"
#include "R3.hpp"

typedef double R;
const  double Pi =  3.14159265358979323846264338328;

using namespace std;

typedef  KN<R> Rn;
const int TheDrawList=1;  // numero de la list d'affichage

R ff(R2 P) { return 0.5*cos(P.x*Pi)*sin(P.y*Pi*1.5); }

class Global {    
// une petite classe pour stoker toutes les variables globales
  public:
 int Width , Height;              // taille de l'Žcran en pixel
 Mesh &Th;                        // maillage courant
 R rapz;
 Rn &f ;                          // solution P1 a affich\'e
 R theta,phi,coef_dist;           // coordonnŽe polaire de la camera
 R dtheta;                        // vitesse de rotation de la camera
 R xmin,xmax,ymin,ymax,zmin,zmax; // borne de la scne
  R xm,ym,zm; // point regarde
  R xmouseold,ymouseold;
  Global(Mesh & TTh,Rn &ff,int height,int width,R rpz) ;
  void SetView() const;           // define le point de vue
  void DefaultView() ;
  void MoveXView(R dx,R dy); // deplace le point regarde de dx,dy dans l'ecran
  void MakeListDraw() const  ;    // construit la list d'affichage
} *global ;  // la variable global

void   SetColor(R f);

static void Mouse( int button,int state,int x,int y )
{
  // pour suivre la sourie
  // ---------------------
  // state up or down
  if (state == GLUT_DOWN) { global->xmouseold=x,global->ymouseold=y;return;}
  // cout << "Mouse " << button<< " " << state << " " << x-xold << " " << y-yold << endl;
  //  x gauche -> droitre
  //  y  haut -> bas`
  global->phi += (y-global->ymouseold)/(2.*180.);
  global->theta -= (x-global->xmouseold)/(2*180.);
  global->SetView();  
  glutPostRedisplay();
 
}
static void MotionMouse(int x,int y )
{
  // pour suivre la sourie
 // cout << " MotionMouse " << " " << x << " " << y << endl;
  //  GLuint gtime = glutGet(GLUT_ELAPSED_TIME); //   
  global->phi += (y-global->ymouseold)/(2.*180.);
  global->theta -= (x-global->xmouseold)/(2*180.);
  global->xmouseold=x;
  global->ymouseold=y;
  global->SetView();  
  glutPostRedisplay();
}

void SpecialKey(int key, int x, int y)
{//    point les touche up down etc.
  // cout << " SpecialKey " << key << " " << x << " " << y << " : ";
  R dx(0),dy(0);
    switch (key) {
        case  GLUT_KEY_LEFT:   dx = -1; break;
        case  GLUT_KEY_RIGHT:  dx = +1; break;
        case  GLUT_KEY_DOWN:   dy = -1; break;
        case  GLUT_KEY_UP:     dy = +1; break;
}
   // calcul du deplacement de xm,ym,zm;
  // cout << " " << dx << " " << dy << endl;
    global->MoveXView(dx,dy);
    global->SetView();  
  glutPostRedisplay();

}

Global::Global(Mesh & TTh,Rn &ff,int height,int width,R rpz)
   : Th(TTh), f(ff)
  {
   Width= width ;
   Height=height;
   theta=45*Pi/180.;
   dtheta=0;
   coef_dist=1;
   rapz=rpz;
   phi = 20*Pi/180.;
   
   // first compute the mesh bound
   const  Vertex & v0= Th(0);
   xmin=xmax=v0.x;
   ymin=ymax=v0.y;
   zmin = rapz*f[0], zmax=rapz*f[0];
   for (int i=0;i<Th.nv;i++)
     {
       const  Vertex & v=Th(i);
       xmin= Min(xmin,v.x);
       ymin= Min(ymin,v.y);
       xmax= Max(xmax,v.x);
       ymax= Max(ymax,v.y);
       zmin= Min(zmin,f[i]*rapz);
       zmax= Max(zmax,f[i]*rapz);                   
     }
   DefaultView();
   }
 
  void Global::MoveXView(R dx,R dy)
  {
  // cout << xm << " " << ym << " " << zm << " apres " ;
   zm -= dy*(zmax-zmin)*rapz/50.;
   xm += dx*(xmax-xmin)*sin(theta)/50;
   ym -= dx*(ymax-ymin)*cos(theta)/50;   
  // cout << xm << " " << ym << " " << zm << endl;
  }
void Global::DefaultView()
{
  coef_dist =1;
  theta=45*Pi/180.;
  dtheta=0;
  coef_dist=1;
  phi = 20*Pi/180.;
   xm = (xmin+xmax)*0.5;
   ym = (ymin+ymax)*0.5;
    zm = rapz*(zmin+zmax)*0.5;    
}
   
void Global::SetView() const
 {
     glViewport( 0, 0, Width, Height );

    // glMatrixMode(GL_PROJECTION);
    // glLoadIdentity();
     R ratio= (double) Width / (double)  Height;
     R dx =(xmax-xmin), dy= (ymax-ymin), dz=(zmax-zmin);
         
     //R hx= (  ratio*dy < dx  ) ? dx : dy*ratio ;
     //R hy= hx/ratio ;
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
     R focal=10;
     /*     R znear=0.1;
        R zfare=100;
        R aspect=ratio;
        gluPerspective(focal,aspect,znear,zfare);
        R dist = Max(dx,dy,dz)/atan(focal*Pi/180.)*coef_dist;
        R camx=xm+cos(phi)*cos(theta)*dist;
        R camy=ym+cos(phi)*sin(theta)*dist;
        R camz=zm+dist*sin(phi);     
        gluLookAt(camx,camy,camz,xm,ym,zm,0.,0.,1.);
     */
     R aspect=ratio;
     R r=sqrt(dx*dx+dy*dx+dz*dz)/2.; // rayon de sphere contenant la scene
     R dist = r/atan(focal*Pi/180./2.)*coef_dist;
     R camx=xm+cos(phi)*cos(theta)*dist;
     R camy=ym+cos(phi)*sin(theta)*dist;
     R camz=zm+dist*sin(phi);     
     //  apres le changer de repere isometrique
     //  0,0,0 est le point de vue
     //  0,0,-dist est le point regarde
     //  donc tout l'objet est ente dist-r et dist+r
     gluPerspective(focal,aspect,dist-r,dist+r);

     gluLookAt(camx,camy,camz,xm,ym,zm,0.,0.,1.);
     
     
 }

 
 void hsvToRgb (float h, float s, float v, float & r, float & g, float & b)
{
  int i;
  float aa, bb, cc, f;

  if (s == 0) /* Grayscale */    r g b = v;
  else {    if (h 1.0) h 0;
    h *= 6.0;
    i =  int(h);
    f = h - i;
    aa = v * (1 - s);
    bb = v * (1 - (s * f));
    cc = v * (1 - (s * (1 - f)));
    switch (i) {    case 0: r v;  g cc; b = aa; break;    case 1: r bb; g v;  b = aa; break;    case 2: r aa; g v;  b = cc; break;    case 3: r aa; g bb; b = v;  break;    case 4: r cc; g aa; b = v;  break;    case 5: r v;  g aa; b = bb; break;
    }
  }
}

 void   SetColor(R f)
{
  float r,g,b;
  assert(global);
  R fmin=global->zmin; // borne de la fonction
  R fmax=global->zmax;
 
  hsvToRgb(0.99*(f-fmin)/(fmax-fmin),1,1,r,g,b);
  glColor3f(r,g,b);
}

 void DrawVertex(const  R3 & v)
{  
  //SetColor(v.z);             // la couleur
  glVertex3f(v.x, v.y, v.z); // le sommet
}

void permut4(KN<R3> & point){
 R3 i2=point[2]; R3 i3=point[3];
 point[2]=i3; point[3]=i2;
}

void permut5(KN<R3> & point,int & nb){
    R3 i2=point[2]; R3 i3=point[3]; R3 i4=point[4];
    if (nb==1) { point[2]=i2; point[3]=i3; point[4]=i4;}
    if (nb==2) { point[2]=i2; point[3]=i4; point[4]=i3;}
    if (nb==3) { point[2]=i3; point[3]=i2; point[4]=i4;}
    if (nb==4) { point[2]=i3; point[3]=i4; point[4]=i2;}
    if (nb==5) { point[2]=i4; point[3]=i3; point[4]=i2;}
    if (nb==6) { point[2]=i4; point[3]=i2; point[4]=i3;}
}
void permut51(KN<R3> & temp, KN<R3> & point){
    R3 i2=temp[2]; R3 i3=temp[3]; R3 i4=temp[4];
     point[2]=i2; point[3]=i3; point[4]=i4;
}
void permut52(KN<R3> & temp,KN<R3> & point){
    R3 i2=temp[2]; R3 i3=temp[3]; R3 i4=temp[4];
    point[2]=i2; point[3]=i4; point[4]=i3;
}
void permut53(KN<R3> & temp,KN<R3> & point){
    R3 i2=temp[2]; R3 i3=temp[3]; R3 i4=temp[4];
    point[2]=i3; point[3]=i2; point[4]=i4;
}
void permut54(KN<R3> & temp,KN<R3> & point){
    R3 i2=temp[2]; R3 i3=temp[3]; R3 i4=temp[4];
    point[2]=i3; point[3]=i4; point[4]=i2;
}
void permut55(KN<R3> & temp,KN<R3> & point){
    R3 i2=temp[2]; R3 i3=temp[3]; R3 i4=temp[4];
    point[2]=i4; point[3]=i3; point[4]=i2;
}
void permut56(KN<R3> & temp,KN<R3> & point){
    R3 i2=temp[2]; R3 i3=temp[3]; R3 i4=temp[4];
    point[2]=i4; point[3]=i2; point[4]=i3;
}

void SommetIn(Mesh & Th,int k,R muctemp,R muc,int & cptSommet,KN<R3> & sommet,KN<double> & f){
    for(int i1=0;i1<3;i1++){
        int i = Th(k,i1);//numero du sommet globale du somme local i1 du triangle k
      if (muctemp<f[i] && f[i]< muc){
            sommet[cptSommet]=R3 ((R2) Th.vertices[i],f[i]);
            cptSommet++;
        }    
    }
}

int intersections(Mesh & Th,int k,R iso, int i , int j, KN<R3> & interISO, int & cptInter, KN<double> & f){
    R a=2.;//Xmu coordonnés barycentriques

    if((f[i] - f[j])!=0) //f[i] different de  f[j]
        a = (iso - f[j]) / (f[i] - f[j]);
    else{
        if(iso == f[j]){
            interISO[cptInter]=R3 ((R2)Th.vertices[i],iso );;
            cptInter++;
            a=0.;
        }
    }
    if((a>=0)&&(a<=1)){
            interISO[cptInter]=R3 ((R2) Th.vertices[i]*a+(R2)Th.vertices[j]*(1.-a),iso);
            cptInter++;
    }
return cptInter;
}

void colorier(Mesh & Th,R iso,int & cptinter,int & cptsommet,KN<R3> & interISO, KN<R3> & sommet ){
    glPolygonMode(GL_FRONT,GL_FILL);
    glBegin(GL_POLYGON);
    SetColor(iso);
    if (cptsommet==0){
        if (cptinter==4){//on colorie le quadrilatere
            for (int i=0;i<4;i++){DrawVertex((R3)interISO[i]);}glEnd();
            permut4(interISO);
            for (int i=0;i<4;i++){DrawVertex((R3)interISO[i]);}glEnd();
        }    
        if (cptinter==1){// on colorie le point
            DrawVertex((R3)interISO[0]);glEnd();
        }
        
        if (cptinter==2){ //on colorie la droite
            for (int i=0;i<2;i++)
                DrawVertex( (R3)interISO[i]);
            glEnd();
        }
        if (cptinter==3){//on colorie le triangle
            for (int i=0;i<3;i++)
                DrawVertex( (R3)interISO[i]);
            glEnd();
        }
    }//fin cptsommet ==0

     if (cptsommet==1){
        if (cptinter==2){
            for (int i=0;i<2;i++)
                {DrawVertex((R3)interISO[i]);}
                DrawVertex((R3)sommet[0]);
                glEnd();
        }
        if (cptinter==4){
            KN<R3>point(Th.nv);KN<R3>temp(Th.nv); point=interISO; point[4]=sommet[0];temp=point;
            permut51(temp,point); for (int j=0;j<5;j++){DrawVertex((R3) point[j]);}glEnd();for (int e=0;e<5;e++){cout

point(Th.nv);
            point=interISO; point[2]=sommet[0]; point[3]=sommet[1];    
            for (int i=0;i<4;i++){
                DrawVertex((R3)point[i]);
            }glEnd();
            permut4(point);
            for (int i=0;i<4;i++){
                DrawVertex((R3)point[i]);
            }glEnd();
        }
    }//fin cptsommet=2
    if (cptsommet==3){
        for (int i=0;i<3;i++)
            {DrawVertex( (R3)(sommet[i])); }
        glEnd();
    }//fin cptsommet==3  
glEnd();
}

void Global::MakeListDraw() const
{
      glNewList(TheDrawList,GL_COMPILE); // save  la list sans affichage
        glPolygonMode(GL_FRONT,GL_FILL);
        //glBegin(GL_POLYGON);
     
    KN<R3> sommet(Th.nv), interISO(Th.nv);
    int i,j,cptSommet,cptInter,nbiso=4;
     R umax=f.max(), umin=f.min();
     if((umax == umin))
      nbiso=1;
    R temp=(umax-umin)/nbiso;//premier iso nulle
    
    for(int imu=0;imu<nbiso;imu++){    
        R muctemp=umin+temp*imu;//isoligne
        R muc=muctemp+temp;
        
        for(int k=0;k<Th.nt;k++){//on parcourt ts les triangles
            cptInter=0; cptSommet=0;
            interISO=R3(); sommet=R3();
            SommetIn(Th,k,muctemp,muc,cptSommet,sommet,f);//nombre de sommet entre muc et muctemp
            for(int i1=0;i1<3;i1++){
                i = Th(k,i1);//numero du sommet globale du somme local i1 du triangle k
                j = Th(k,(i1+1)%3);// j=(i+1)% 3  [q0,q1] ;[q1,q2];[q2,q0]
                intersections(Th,k,muctemp,i,j,interISO,cptInter,f);//intersection avec muctemp
            }//fin du triangle
            for(int i1=0;i1<3;i1++){
                i = Th(k,i1);//numero du sommet globale du somme local i1 du triangle k
                j = Th(k,(i1+1)%3);// j=(i+1)% 3  [q0,q1] ;[q1,q2];[q2,q0]
                intersections(Th,k,muc,i,j,interISO,cptInter,f);//intersection avec muctemp
            }
            colorier(Th,muctemp,cptInter,cptSommet,interISO,sommet);
        }//fin des triangles
    }//fin des isos
    
    //dessine le maillage
    for(int k = 0; k<Th.nt; k++){    
        int count=0;
        R3 KeepSummet;
        R3 SummetTemp;
        for(int i1=0;i1<3;i1++){
            count+=1;
            int i = Th(k,i1);
            int j = Th(k,(i1+1)%3);
            R3 Summet(Th.vertices[j],f[j]);
            if (i1==0){
                KeepSummet=Summet;
            }
            if (i1==3){
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINES);
                glBegin(GL_LINES);
                SetColor(100.);
                DrawVertex(KeepSummet);
                DrawVertex(Summet);
                glEnd();
            }
            if (count>1){
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINES);
                glBegin(GL_LINES);
                SetColor(100.);
                DrawVertex(SummetTemp);
                DrawVertex(Summet);
                glEnd();
            }
            SummetTemp=Summet;
        };
 
    };
glEnd();
glEndList();  // fin de la list
}

void Clean()
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
}

static void Reshape( int width, int height )
{   
    global->Width  = width;
    global->Height = height;  
    global->SetView();
    glutPostRedisplay();
}

static void Key( unsigned char key, int x, int y )
{
   switch (key) {
      case 27: // esc char
         exit(0);
         break;
      case '+':  
          global->coef_dist /= 1.2;
          break;
      case '-':  
          global->coef_dist *= 1.2;
          break;
      case 'g':  
          global->theta += Pi/180.;
          break;
      case 'd':  
          global->theta -= Pi/180.;
          break;
      case 'h':  
          global->phi += Pi/180.;
          break;
      case 'b':  
          global->phi -= Pi/180.;
          break;
      case 'a':
        global->dtheta = Pi/(5*1800.);
        break;    
      case 's':
        global->dtheta = 0;
        break;    
      case '=':
    global->DefaultView();
        break;
        
          
   }
   global->SetView();  
   glutPostRedisplay();
}

void Display(void)
{
    Clean();
    //* glEnable(GL_COLOR_MATERIAL);
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); // mode affichage des polygones  
    glCallList(TheDrawList);    
    glFlush();    
    glutSwapBuffers();
}

static void Idle( void )
{
  if (global->dtheta)
   {
     global->theta += Pi/1800.;
     global->SetView();
     glutPostRedisplay();
   }
    
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
    int Height = 512;
    int Width = 512;
    glutInitWindowSize(Width , Height);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Mesh");
    glutPushWindow();
    assert(argc>1);
    R rapz=1;
    if (argc>3) rapz=atof(argv[3]);
    cout << " Rap z " << rapz << endl;
    Mesh Th(argv[1]);
    Rn f(Th.nv);
    if(argc > 2)
    {
    ifstream fdat(argv[2]);
    assert(fdat.good());
    int n;      
    fdat >> n;
    assert(n = Th.nv);
    for(int i=0;i<n;i++)
        fdat >> f[i];
    } // pour ferme le fichier (la variable fdat est detruite)
    else
    for(int i=0;i<Th.nv;i++)
        f[i] = ff(Th(i));
    
    global=new Global(Th,f,Height,Width,rapz);
    global->MakeListDraw();    
    global->SetView();
    
    glEnable(GL_DEPTH_TEST);
    glutReshapeFunc( Reshape ); // pour changement de fenetre
    glutKeyboardFunc( Key );    // pour les evenements clavier
    glutSpecialFunc(SpecialKey);
    glutMouseFunc(Mouse);       // pour les evenements souris
    glutMotionFunc(MotionMouse); // les mouvements  de la souris
    glutDisplayFunc( Display ); // l'affichage
    glutIdleFunc( Idle );       // l'animation automatique
    
    glutMainLoop();
    return 0;
}

1 réponse

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 mai 2007 à 18:30
3 possibilités:
- 1) Tes triangles sont blancs (j'en doute la ^^)
- 2) Les triangles se sont pas tracés.
- 3) Le culling est activé, et le tracer de tes triangles se fait dans le mauvais sens. Donc désactive le avec: glDisable(GL_CULL_FACE); Le mieux étant quand meme de t'assurer que tes triangles sont dessinés dans le bon sens.
0
Rejoignez-nous