langage : C++, OpenGL
environnement : cygwin
compilateur : g++
----------------------------

Bonjour,

Je m'arrache les cheveux depuis deux jours sur un bug fantôme. J'ai mis
presque toute mon équipe à contribution, en vain. Peut être que vous pourrez m'aider.

J'ai un vecteur de segments. Je voudrais afficher chacun avec une couleur qui l'identifie de façon unique. Voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Conversion  de mon identifiant en valeurs rgb :
void id2rgb(const unsigned int &id, unsigned char &r, unsigned char &g,
unsigned char &b){
  unsigned int rfilter = 0x000000FF;
  unsigned int gfilter = 0x0000FF00;
  unsigned int bfilter = 0x00FF0000;
  unsigned int rint = rfilter & id;
  unsigned int gint = gfilter & id; gint = gint>>8;
  unsigned int bint = bfilter & id; bint = bint>>16;
  r = (unsigned char)rint;
  g = (unsigned char)gint;
  b = (unsigned char)bint;};
 
//affichage de mon tampon :
unsigned char r, g, b;
glDrawBuffer(GL_BACK);
for(unsigned int i=0; i<_segments.size(); i++){ // parcours de tous les
                                                                     //segments, leur numéro                   
                                                                     // dans le vecteur est leur      
                                                                     //identifiant
   if(i<16777215) {// correspondant à l'identifiant maximal pouvant être
                           //contenue dans les valeurs (r,g,b)
      id2rgb(i, r, g, b);
      glLineWidth(1.);
      glShadeModel(GL_FLAT);
      glBegin(GL_LINES);
      glColor3ub(r,g,b);
      glVertex3f( _segments[i]._debut.get_x(),   
                      _segments[i]._debut.get_y(),
                      _segments[i]. _debut.get_z());
      glVertex3f( _segments[i]._fin.get_x(),    
                       _segments[i]._fin.get_y(),
                       _segments[i]._fin.get_z());
      glEnd();}}
 glutSwapBuffers();

Or, dans l'image que j'obtiens, il existe plusieurs segments avec le même identifiant !!! J'ai évidemment écrit la fonction inverse de id2rgb :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
void rgb2id(const unsigned char &r, const unsigned char &g, const unsigned
char &b, unsigned int &id){
  unsigned int rint = (int)r;
  unsigned int gint = (int)g;
  unsigned int bint = (int)b;
  gint= gint<<8;
  bint= bint<<16;
  id= rint+gint+bint;};
mais, les instructions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
int a, b;
cin >> a;
id2rgb(a,r,g,b);
rgb2id(r,g,b,b);
cout <<b; //me renvoie toujours un b identique à a.
Bref, je suis clouée.
Merci pour votre aide,

Audrey
legeaiau@etu.utc.fr