xplot
Messages postés1Date d'inscriptionvendredi 11 mai 2007StatutMembreDernière intervention11 mai 2007
-
11 mai 2007 à 17:38
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 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
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 scne
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();
// 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);
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;
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;
};
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
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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.