Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
euclidian-view.cc
Go to the documentation of this file.
1 /*
2  * lib-spamod : Visualisation des objets en discret.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-spamod
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 /******************************************************************************
25  * Fichier : Euclidian_View.cpp *
26  * Auteur : DEXET Martine *
27  *----------------------------------------------------------------------------*
28  * Ce fichier contient l'implémentation des méthodes de la classe *
29  * Euclidian_View. *
30  * *
31  *****************************************************************************/
32 
33 #ifdef _WINDOWS
34 #include <windows.h>
35 #endif
36 
37 #ifdef __APPLE__
38 #include <GLUT/glut.h>
39 #else
40 #include <GL/glut.h>
41 #endif
42 
43 #include "euclidian-view.hh"
44 #include "vertex.hh"
45 #include "attribute-vertex.hh"
46 #include "vector3d.hh"
47 #include "color-table.hh"
48 #include "color-table-att.hh"
49 #include "gmap-ops.hh"
50 #include "user.hh"
51 
52 using namespace std;
53 using namespace GMap3d;
54 
55 /******************************************************************************
56  * Constructeur *
57  *****************************************************************************/
58 
59 Euclidian_View::Euclidian_View(CGMap * GM)
60 {
61  G = GM;
62 }
63 
64 
65 
66 /******************************************************************************
67  * Fonction : void EuclidianView::Wire_Draw() *
68  *----------------------------------------------------------------------------*
69  * Cette fonction parcourt la G-carte en affichant ses arêtes. Si la G-map *
70  * contient des brins seuls (i.e. non reliés à un autre brins), les sommets *
71  * correspondants seront représentés par un point. *
72  * *
73  *****************************************************************************/
74 
75 void Euclidian_View::Wire_Draw()
76 {
77  CAttribute * alpha;
78  CVertex * p1, * p2;
79  Color_Table * color;
80 
81  // Création d'une marque.
82  int markEdge = G->getNewMark();
83 
84 
85  // Couleurs des éléments de visualisation.
86  color = ((Color_Table_Att*)Find_Attribute(G, ORBIT_0123,
87  COLOR_TABLE_ATTRIBUTE_ID))->Get_Data();
88 
89 
90  // Parcourt des brins de la G-carte.
91  CDynamicCoverageAll C(G);
92  for (C.reinit(); C.cont(); C++)
93  {
94  CDart* dgm = *C;
95 
96  if (!G->isMarked(dgm, markEdge))
97  {
98  // Coordonnées du sommet.
99  alpha = G->getAttribute(dgm, ORBIT_123, VERTEX_ATTRIBUTE_ID);
100  p1 = (CAttributeVertex*)alpha;
101 
102  // Cas où le brin est seul.
103  if (G->isFree0(dgm))
104  {
105  // Affichage du sommet
106  glColor3f(color->Get_Color(0)->Get_R(),
107  color->Get_Color(0)->Get_G(),
108  color->Get_Color(0)->Get_B());
109  glPointSize(2.0);
110  glBegin(GL_POINTS);
111  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
112  glEnd();
113  glPointSize(1.0);
114 
115  // Marquage du brin.
116  G->setMark(dgm, markEdge);
117  }
118 
119  // Autres cas de G-carte.
120  else
121  {
122  // Coordonnées de l'extrémité de l'arête.
123  alpha = G->getAttribute(G->alpha0(dgm), ORBIT_123,
125  p2 = (CAttributeVertex*)alpha;
126 
127 
128  // Partie de code optionnel.
129  /*
130  // Affichage des extrémités.
131  glPointSize(2.0);
132  glColor3f(color->Get_Color(0)->Get_R(),
133  color->Get_Color(0)->Get_G(),
134  color->Get_Color(0)->Get_B());
135 
136  glBegin(GL_POINTS);
137  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
138 
139  if (!G->Is_Marked(dgm->Get_Alpha0(), markEdge))
140  glVertex3f(p2->getX(), p2->getY(), p2->getZ());
141 
142  glEnd();
143  glPointSize(1.0);
144  */
145 
146 
147  // Affichage de l'arête.
148  glLineWidth(2.0);
149  glBegin(GL_LINES);
150  glColor3f(color->Get_Color(1)->Get_R(),
151  color->Get_Color(1)->Get_G(),
152  color->Get_Color(1)->Get_B());
153  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
154  glVertex3f(p2->getX(), p2->getY(), p2->getZ());
155  glEnd();
156  glLineWidth(1.0);
157 
158 
159  // Marquage des brins de l'arête affichée.
160  CCoverage* DC = G->getDynamicCoverage(dgm, ORBIT_023);
161  for (DC->reinit();
162  DC->cont();
163  (*DC)++)
164  G->setMark(**DC, markEdge);
165  delete DC;
166  }
167  }
168  }
169 
170  // Démarquage des brins et libération de la marque.
171  for (C.reinit(); C.cont(); C++)
172  G->unsetMark(*C, markEdge);
173  G->freeMark(markEdge);
174 
175 }
176 
177 
178 
179 /******************************************************************************
180  * Fonction : void EuclidianView::Solid_Draw() *
181  *----------------------------------------------------------------------------*
182  * Cette fonction parcourt la G-carte en affichant ses faces. Si la G-carte *
183  * contient des chemins, les arêtes sont affichées. De même, les sommets *
184  * correspondants aux brins seuls (i.e. non reliés à un autre brin) seront *
185  * représentés par un point. *
186  * *
187  *****************************************************************************/
188 
189 void Euclidian_View::Solid_Draw()
190 {
191  int nbPoints;
192  CAttribute * alpha;
193  CVertex * p1, * p2;
194  Vector3D normal;
195 
196  // Création d'une marque.
197  int markFace = G->getNewMark();
198 
199 
200  // Activation des paramètres de visualisation.
201  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
202  glShadeModel(GL_SMOOTH);
203 
204 
205 
206  // Parcourt des brins de la G-carte.
207  CDynamicCoverageAll C(G);
208  for (C.reinit(); C.cont(); C++)
209  {
210  CDart* dgm = *C;
211 
212  if (!G->isMarked(dgm, markFace))
213  {
214  // Cas où le brin est seul.
215  if (G->isFree0(dgm))
216  {
217  // Coordonnées du sommet.
218  alpha = G->getAttribute(dgm, ORBIT_123, VERTEX_ATTRIBUTE_ID);
219  p1 = (CAttributeVertex*)alpha;
220 
221  // Affichage du sommet.
222  glPointSize(2.0);
223  glBegin(GL_POINTS);
224  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
225  glEnd();
226  glPointSize(1.0);
227 
228  // Marquage du brin.
229  G->setMark(dgm, markFace);
230  }
231 
232  // Cas où le brin appartient à une ligne polygonale.
233  else
234  if (!G->getAttribute(dgm, ORBIT_013, INT_ATTRIBUTE_ID))
235  {
236  // Affichage de la ligne polygonale.
237  glLineWidth(2.0);
238  glBegin(GL_LINES);
239 
240  // Parcourt des brins de la ligne polygonale.
241  CCoverage* DC01 = G->getDynamicCoverage(dgm, ORBIT_01);
242  for (DC01->reinit();
243  DC01->cont();
244  (*DC01)++)
245  {
246  CDart* d01 = **DC01;
247 
248  if (!G->isMarked(d01, markFace))
249  {
250  // Coordonnées des extrémités de l'arête.
251  alpha = G->getAttribute(d01, ORBIT_123,
253  p1 = (CAttributeVertex*)alpha;
254 
255  alpha = G->getAttribute(G->alpha0(d01), ORBIT_123,
257  p2 = (CAttributeVertex*)alpha;
258 
259  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
260  glVertex3f(p2->getX(), p2->getY(), p2->getZ());
261 
262  // Marquage des brins de l'arête élémentaire.
263  G->setMark(d01, markFace);
264  G->setMark(G->alpha0(d01), markFace);
265  }
266  }
267  glEnd();
268  glLineWidth(1.0);
269 
270  delete DC01;
271  }
272 
273  // Cas où le brin appartient à une face fermée.
274  else
275  {
276  list<CVertex*> ptList;
277  nbPoints = 0;
278 
279  // Parcourt des brins de la face élémentaire.
280  CCoverage* DC01 = G->getDynamicCoverage(dgm, ORBIT_01);
281  for (DC01->reinit();
282  DC01->cont();
283  (*DC01)++)
284  {
285  CDart* d01 = **DC01;
286 
287  if (!G->isMarked(d01, markFace))
288  {
289  // Coordonnées du sommet.
290  alpha = G->getAttribute(d01, ORBIT_123,
292 
293  // Ajout du sommet dans la liste.
294  ptList.push_front((CAttributeVertex*)alpha);
295  nbPoints++;
296 
297 
298  // Marquage des brins appartenant au même sommet.
299  G->setMark(d01, markFace);
300  G->setMark(G->alpha1(d01), markFace);
301 
302  // Cas où la face est reliée à une autre face par
303  // la liaison alpha3.
304  if (!G->isFree3(d01))
305  {
306  G->setMark(G->alpha3(d01), markFace);
307  G->setMark(G->alpha3(G->alpha1(d01)),markFace);
308  }
309  }
310  }
311 
312  // Le nombre de points est supérieur à 3.
313  if (nbPoints >= 3)
314  {
315  // Calcul du vecteur normal à la face.
316  CVertex* tab[3];
317  list<CVertex*>::iterator iter;
318  int i=0;
319  for(iter=ptList.begin();iter!=ptList.end() && i<3; iter++)
320  tab[i++]=*iter;
321 
322  Vector3D v1(*tab[1],*tab[0]);
323 
324  Vector3D v2(*tab[2],*tab[1]);
325 
326  normal = v1.Vect_Product(v2);
327 
328  normal.Normalize();
329 
330  //Activation de l'éclairage.
331  glEnable(GL_LIGHTING);
332 
333  // Affichage de la face.
334  glBegin(GL_POLYGON);
335  glNormal3f(normal.getX(),
336  normal.getY(),
337  normal.getZ());
338 
339  for (iter=ptList.begin();
340  iter!=ptList.end();
341  iter++)
342  {
343  CVertex *curPt = *iter;
344  glVertex3f(curPt->getX(),
345  curPt->getY(),
346  curPt->getZ());
347  }
348  glEnd();
349 
350  //Désactivation de l'éclairage.
351  glDisable(GL_LIGHTING);
352  }
353 
354  // Le nombre de points de la face est égal 2.
355  else
356  {
357  // Affichage de la face.
358  CVertex* tab[2];
359  list<CVertex*>::iterator iter;
360  int i=0;
361  for(iter=ptList.begin();iter!=ptList.end() && i<2; iter++)
362  tab[i++]=*iter;
363 
364  p1 = tab[0];
365  glLineWidth(2.0);
366  glBegin(GL_LINES);
367  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
368  p1 = tab[1];
369  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
370  glEnd();
371  glLineWidth(1.0);
372  }
373 
374  delete DC01;
375  }
376  }
377  }
378 
379 
380  // Démarquage des brins et libération de la marque.
381  for (C.reinit(); C.cont(); C++)
382  G->unsetMark(*C, markFace);
383  G->freeMark(markFace);
384 
385 
386  //Désactivation des paramètres de visualisation.
387  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
388  glShadeModel(GL_FLAT);
389 }