Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
topologic-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 : Topologic_View.h *
26  * Auteur : DEXET Martine *
27  *----------------------------------------------------------------------------*
28  * Ce fichier contient l'implémentation des méthodes de la classe *
29  * Topologic_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 "user.hh"
44 #include "topologic-view.hh"
45 #include "vertex.hh"
46 #include "vector3d.hh"
47 #include "attribute-vertex.hh"
48 
49 using namespace GMap3d;
50 
51 /******************************************************************************
52  * Constructeur *
53  *****************************************************************************/
54 
56 {
57  G = GM;
58 }
59 
60 
61 
62 /******************************************************************************
63  * Fonction : void TopologicView::Create_Face_Darts_View(CDart * dgm, *
64  * int markDart) *
65  *----------------------------------------------------------------------------*
66  * Cette fonction calcule les coordonnées des points représentant les brins *
67  * de la G-carte afin que les liaisons alpha0, alpha1 et alpha2 soient *
68  * visibles. *
69  * *
70  *****************************************************************************/
71 
72 void Topologic_View::Create_Face_Darts_View(CDart * dgm, int markDart)
73 {
74  CAttribute * alpha;
75  CDart * de;
76  CVertex * p1, * p2, p3, p4;
77  Vector3D v;
78  int nbPoints = 0;
79  CVertex center(0.0,0.0,0.0);
80 
81  // Création d'une marque.
82  int markCenter = G->getNewMark();
83 
84 
85  // Parcourt des brins de l'arête ou de la face.
86  CCoverage* DCe = G->getDynamicCoverage(dgm, ORBIT_01);
87  for (DCe->reinit(); DCe->cont(); (*DCe)++)
88  {
89  de = **DCe;
90 
91  if (!G->isMarked(de, markCenter))
92  {
93  // Coordonnées du sommet.
94  alpha = G->getAttribute(de,ORBIT_123,VERTEX_ATTRIBUTE_ID);
95  p2 = (CAttributeVertex*)alpha;
96 
97  // Recherche du barycentre de l'arête ou de la face.
98  center.setX(center.getX() + p2->getX());
99  center.setY(center.getY() + p2->getY());
100  center.setZ(center.getZ() + p2->getZ());
101 
102  nbPoints++;
103 
104  // Marquage des brins appartenants au même sommet avec
105  // la marque markCenter.
106  G->setMark(de, markCenter);
107  if (!G->isFree1(de))
108  G->setMark(G->alpha1(de), markCenter);
109  }
110  }
111 
112  // Calcul des coordonées du barycentre de l'arête ou de la face.
113  center.setX(center.getX()/(float)nbPoints);
114  center.setY(center.getY()/(float)nbPoints);
115  center.setZ(center.getZ()/(float)nbPoints);
116 
117 
118  // Parcourt des brins de l'arête ou de la face.
119  for (DCe->reinit();
120  DCe->cont();
121  (*DCe)++)
122  {
123  de = **DCe;
124 
125  // Démarquage du brin pour la marque markCenter.
126  G->unsetMark(de, markCenter);
127 
128  if (!G->isMarked(de, markDart))
129  {
130  // Coordonnées du sommet correspondant au brin "de".
131  alpha = G->getAttribute(de, ORBIT_123, VERTEX_ATTRIBUTE_ID);
132  p1 = (CAttributeVertex*)alpha;
133 
134  // Coordonnées du sommet correspondant à l'image du
135  // brin "de" par la relation alpha0.
136  alpha = G->getAttribute(G->alpha0(de),ORBIT_123,VERTEX_ATTRIBUTE_ID);
137  p2 = (CAttributeVertex*)alpha;
138 
139  // Calcul des coordonnées des sommets qui seront
140  // utilisés pour l'affichage.
141  v.setXYZ(p2->getX()-p1->getX(),
142  p2->getY()-p1->getY(),
143  p2->getZ()-p1->getZ());
144 
145  // Cas où le brin n'est pas relié à autre brin par
146  // alpha1.
147  if (G->isFree1(de))
148  p3 = *p1;
149 
150  // Cas où le brin est relié à un autre brin par alpha1.
151  else
152  {
153  p3.setXYZ(p1->getX() + v.getX()/10.0,
154  p1->getY() + v.getY()/10.0,
155  p1->getZ() + v.getZ()/10.0);
156  }
157 
158  // Cas où l'image du brin par alpha0 n'est pas reliée
159  // à autre brin par alpha1.
160  if (G->isFree1(G->alpha0(de)))
161  p4 = *p2;
162 
163  // Cas où l'image du brin par alpha0 est reliée à un
164  // autre brin par alpha1.
165  else
166  {
167  p4.setXYZ(p2->getX() - v.getX()/10.0,
168  p2->getY() - v.getY()/10.0,
169  p2->getZ() - v.getZ()/10.0);
170  }
171 
172  // Cas où le brin est relié à un autre brin par la
173  // relation alpha2.
174  if (!G->isFree2(de))
175  {
176  // Calcul des coordonnées des sommets qui seront
177  // utilisés pour l'affichage.
178  v.setXYZ(center.getX()-p3.getX(),
179  center.getY()-p3.getY(),
180  center.getZ()-p3.getZ());
181  p3.setXYZ(p3.getX() + v.getX()/5.0,
182  p3.getY() + v.getY()/5.0,
183  p3.getZ() + v.getZ()/5.0);
184 
185  v.setXYZ(center.getX()-p4.getX(),
186  center.getY()-p4.getY(),
187  center.getZ()-p4.getZ());
188  p4.setXYZ(p4.getX() + v.getX()/5.0,
189  p4.getY() + v.getY()/5.0,
190  p4.getZ() + v.getZ()/5.0);
191  }
192 
193  // Affectation de l'attribut à l'orbite Orbit_SELF.
194  G->addAttribute(de,ORBIT_SELF,new CAttributeVertex(p3));
195 
196  // Marquage du brin "de" avec la marque markDart.
197  G->setMark(de, markDart);
198 
199 
200  // Affectation de l'attribut à l'orbite Orbit_SELF.
201  G->addAttribute(G->alpha0(de),ORBIT_SELF,
202  new CAttributeVertex(p4));
203 
204  // Marquage de l'image du brin "de" par la relation
205  // alpha0 avec la marque markDart.
206  G->setMark(G->alpha0(de), markDart);
207  }
208  }
209  delete DCe;
210 
211  // Libération de la marque.
212  G->freeMark(markCenter);
213 }
214 
215 
216 
217 /******************************************************************************
218  * Fonction : void TopologicView::Create_Volume_Darts_View(CDart * dgm, *
219  * int markVolume) *
220  *----------------------------------------------------------------------------*
221  * Cette fonction calcule les coordonnées des points représentant les brins *
222  * de la G-carte afin que les liaisons alpha3 soient visibles. *
223  * *
224  *****************************************************************************/
225 
226 void Topologic_View::Create_Volume_Darts_View(CDart * dgm, int markVolume)
227 {
228  CAttribute * alpha;
229  CDart * de;
230  CVertex * p1;
231  Vector3D v;
232  int nbPoints = 0;
233  CVertex center(0.0,0.0,0.0);
234 
235  // Création d'une marque.
236  int markCenter = G->getNewMark();
237 
238 
239  // Parcourt des brins de la G-carte.
240  CDynamicCoverageAll Cgm(G);
241  for (Cgm.reinit(); Cgm.cont(); Cgm++)
242  {
243  dgm = *Cgm;
244 
245  if (!G->isMarked(dgm, markVolume))
246  {
247  // Cas où le brin est relié par alpha3 à un autre brin.
248  if (!G->isFree3(dgm))
249  {
250  // Parcourt des brins du volume.
251  CCoverage* DCe = G->getDynamicCoverage(dgm, ORBIT_012);
252  for (DCe->reinit();
253  DCe->cont();
254  (*DCe)++)
255  {
256  de = **DCe;
257 
258  if (!G->isMarked(de, markCenter))
259  {
260  // Coordonnées du sommet.
261  alpha = G->getAttribute(de,ORBIT_123,VERTEX_ATTRIBUTE_ID);
262  p1 = (CAttributeVertex*)alpha;
263 
264  // Recherche du barycentre du volume.
265  center.setX(center.getX() + p1->getX());
266  center.setY(center.getY() + p1->getY());
267  center.setZ(center.getZ() + p1->getZ());
268 
269  nbPoints++;
270 
271  // Marquage des brins appartenants au même sommet avec
272  // la marque markCenter.
273  G->setMark(de, markCenter);
274  if (!G->isFree1(de))
275  G->setMark(G->alpha1(de), markCenter);
276  }
277  }
278 
279  // Calcul du barycentre du volume.
280  center.setX(center.getX()/(float)nbPoints);
281  center.setY(center.getY()/(float)nbPoints);
282  center.setZ(center.getZ()/(float)nbPoints);
283 
284 
285  // Parcourt des brins du volume.
286  for (DCe->reinit();
287  DCe->cont();
288  (*DCe)++)
289  {
290  de = **DCe;
291 
292  // Démarquage du brin pour la marque markCenter.
293  G->unsetMark(G->alpha0(de), markCenter);
294 
295  if (!G->isMarked(de, markVolume))
296  {
297  // cas où le brin est relié à un autre brin par la
298  // liaison alpha3.
299  if (!G->isFree3(de))
300  {
301  // Coordonnées du sommet.
302  alpha = G->getAttribute(de, ORBIT_SELF,
304  p1 = (CAttributeVertex*)alpha;
305 
306  // Calcul des coordonnées des sommets qui seront
307  // utilisé pour l'affichage.
308  v.setXYZ(center.getX()-p1->getX(),
309  center.getY()-p1->getY(),
310  center.getZ()-p1->getZ());
311 
312  p1->setXYZ(p1->getX() + v.getX()/5.0,
313  p1->getY() + v.getY()/5.0,
314  p1->getZ() + v.getZ()/5.0);
315  }
316 
317  // Marquage du brin avec la marque markVolume.
318  G->setMark(de, markVolume);
319  }
320  }
321  delete DCe;
322  }
323 
324  // Cas où le brin n'est pas relié par alpha3 à un autre brin.
325  else
326  G->setMark(dgm, markVolume);
327  }
328  }
329 
330  // Libération de la marque.
331  G->freeMark(markCenter);
332 }
333 
334 
335 
336 /******************************************************************************
337  * Fonction : void TopologicView::Create_Darts_View() *
338  *----------------------------------------------------------------------------*
339  * Cette fonction parcourt la G-carte en calculant et en stockant, pour *
340  * chaque brin, les coordonnées du sommet qui sera utilisé pour l'affichage *
341  * topologique. *
342  * *
343  *****************************************************************************/
344 
346 {
347  CDart * dgm = NULL;
348  CAttribute * alpha;
349  CVertex * p1;
350 
351  // Création de 2 marques.
352  int markDart = G->getNewMark();
353  int markVolume = G->getNewMark();
354 
355 
356  // Parcourt des brins de la G-carte.
357  CDynamicCoverageAll Cgm(G);
358  for (Cgm.reinit(); Cgm.cont(); Cgm++)
359  {
360  dgm = *Cgm;
361 
362  if (!G->isMarked(dgm, markDart))
363  {
364  // Cas où le brin est seul.
365  if (G->isFree0(dgm))
366  {
367  // Coordonnées du sommet.
368  alpha = G->getAttribute(dgm, ORBIT_123, VERTEX_ATTRIBUTE_ID);
369  p1 = (CAttributeVertex*)alpha;
370 
371  // Affectation de l'attribut à l'orbite Orbit_SELF.
372  G->addAttribute(dgm, ORBIT_SELF, new CAttributeVertex(*p1));
373 
374 
375  // Marquage du brin avec la marque markDart.
376  G->setMark(dgm, markDart);
377  }
378 
379  // Cas où le brin appartient à une arête ou à une face (ouverte ou
380  // fermée).
381  else
382  // Calcul des coordonnées des points appartenants à une arête ou
383  // une face.
384  Create_Face_Darts_View(dgm, markDart);
385  }
386  }
387 
388  // Calcul des coordonnées des points appartenants à un volume.
389  Create_Volume_Darts_View(dgm, markVolume);
390 
391 
392  // Démarquage des brins et libération des 2 marques.
393  for (Cgm.reinit(); Cgm.cont(); Cgm++)
394  {
395  G->unsetMark(*Cgm, markDart);
396  G->unsetMark(*Cgm, markVolume);
397  }
398  G->freeMark(markDart);
399  G->freeMark(markVolume);
400 
401 
402 }
403 
404 
405 
406 /******************************************************************************
407  * Fonction : void TopologicView::Darts_Draw() *
408  *----------------------------------------------------------------------------*
409  * Cette fonction parcourt la G-carte en affichant les sommets correspondants*
410  * aux différents brins. *
411  * *
412  *****************************************************************************/
413 
415 {
416  CDart * dgm;
417  CAttribute * alpha;
418  CVertex * p;
419 
420  // Parcourt des brins de la G-carte.
421  CDynamicCoverageAll Cgm(G);
422  for (Cgm.reinit(); Cgm.cont(); Cgm++)
423  {
424  dgm = *Cgm;
425 
426  // Coordonnées du sommet à visualiser.
427  alpha = G->getAttribute(dgm, ORBIT_SELF, VERTEX_ATTRIBUTE_ID);
428  p =(CAttributeVertex*)alpha;
429 
430  // Affichage du sommet.
431  glBegin(GL_POINTS);
432  //glColor3f(1.0, 1.0, 0.0);
433  glVertex3f(p->getX(), p->getY(), p->getZ());
434  glEnd();
435  }
436 
437 }
438 
439 
440 
441 /******************************************************************************
442  * Fonction : void TopologicView::Alpha_Draw(int i) *
443  *----------------------------------------------------------------------------*
444  * Cette fonction parcourt la G-carte en affichant les liaisons alpha i *
445  * existantes entre les différents brins. *
446  * *
447  *****************************************************************************/
448 
450 {
451  CDart * dgm;
452  CAttribute * alpha;
453  CVertex * p,* p1;
454 
455  // Création d'une marque.
456  int markDart = G->getNewMark();
457 
458  // Parcourt des brins de la G-carte.
459  CDynamicCoverageAll Cgm(G);
460  for (Cgm.reinit(); Cgm.cont(); Cgm++)
461  {
462  dgm = *Cgm;
463 
464  if (!G->isMarked(dgm, markDart))
465  {
466  // Cas où le brin est relié à un autre brin par la relation alpha0
467  // et où cet autre brin n'alpha pas déjà été traité.
468  if (!G->isFree(dgm,i) &&
469  !G->isMarked(G->alpha(dgm,i), markDart))
470  {
471  // Coordonnées du sommet correspondant au brin "dgm".
472  alpha = G->getAttribute(dgm, ORBIT_SELF, VERTEX_ATTRIBUTE_ID);
473  p =(CAttributeVertex*)alpha;
474 
475  // Coordonnées du sommet correspondant à l'autre brin.
476  alpha = G->getAttribute(G->alpha(dgm,i), ORBIT_SELF,
478  p1 = (CAttributeVertex*)alpha;
479 
480  // Affichage de la liaison alpha0.
481  //glColor3f(1.0, 0.0, 0.0);
482  glBegin(GL_LINES);
483  glVertex3f(p->getX(), p->getY(), p->getZ());
484  glVertex3f(p1->getX(), p1->getY(), p1->getZ());
485  glEnd();
486 
487  // Marquage du brin avec la marque markDart.
488  G->setMark(G->alpha(dgm,i), markDart);
489  }
490 
491  // Marquage du brin avec la marque markDart.
492  G->setMark(dgm, markDart);
493  }
494  }
495 
496  // Démarquage des brins et libération de la marque.
497  for (Cgm.reinit(); Cgm.cont(); Cgm++)
498  G->unsetMark(*Cgm, markDart);
499  G->freeMark(markDart);
500 
501 }