Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
gmap-ops.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 : Gmap_Ops.cpp *
26  * Auteur : DEXET Martine *
27  *----------------------------------------------------------------------------*
28  * Ce fichier contient des routines permettant d'effectuer quelques *
29  * opérations sur les G-cartes. *
30  * *
31  *****************************************************************************/
32 
33 
34 #include "gmap-ops.hh"
35 #include "definition.hh"
36 #include "int-att.hh"
37 #include "attribute-vertex.hh"
38 #include "color-table-att.hh"
39 #include <iostream>
40 #include <fstream>
41 //******************************************************************************
42 namespace GMap3d
43 {
44 
45 /******************************************************************************
46  * Fonction : Point3D Calculate_Center(Gmap * G) *
47  *----------------------------------------------------------------------------*
48  * Cette fonction parcourt la G-carte en récupérant les coordonnées des *
49  * points contenus dans les sommets de la G-carte. Ensuite, elle calcule le *
50  * centre de ces coordonnées. *
51  * *
52  *****************************************************************************/
53 
54 CVertex Calculate_Center(CGMap * G)
55 {
56  CVertex result, min, max;
57 
58  bool first = true;
59 
60  // Création d'une marque.
61  int markVertex = G->getNewMark();
62 
63  // Parcours des brins de la GCarte.
64  CDynamicCoverageAll Cgm(G);
65  for (Cgm.reinit(); Cgm.cont(); Cgm++)
66  {
67  CDart* dgm = *Cgm;
68 
69  // Si le brin n'est pas marqué.
70  if (!G->isMarked(dgm, markVertex))
71  {
72  // Récupération du point associé au sommet contenant dgm.
73  CAttribute *alpha = G->getAttribute(dgm,ORBIT_123,VERTEX_ATTRIBUTE_ID);
74  CVertex *p = (CAttributeVertex*)alpha;
75 
76  if (first)
77  {
78  min = max = *p;
79  first = false;
80  }
81  else
82  {
83  if (p->getX() > max.getX())
84  max.setX(p->getX());
85  else if (p->getX() < min.getX())
86  min.setX(p->getX());
87 
88  if (p->getY() > max.getY())
89  max.setY(p->getY());
90  else if (p->getY() < min.getY())
91  min.setY(p->getY());
92 
93  if (p->getZ() > max.getZ())
94  max.setZ(p->getZ());
95  else if (p->getZ() < min.getZ())
96  min.setZ(p->getZ());
97  }
98 
99  // Marquage des brins du sommet.
100  CCoverage* DCv = G->getDynamicCoverage(dgm, ORBIT_123);
101  for (DCv->reinit();
102  DCv->cont();
103  (*DCv)++)
104  G->setMark(**DCv, markVertex);
105  delete DCv;
106  }
107  }
108 
109  // Démarquage et libération de la marque.
110  for (Cgm.reinit(); Cgm.cont(); Cgm++)
111  G->unsetMark(*Cgm, markVertex);
112  G->freeMark(markVertex);
113 
114  // Calcul du centre.
115  result.setX((min.getX()+max.getX())/2.0);
116  result.setY((min.getY()+max.getY())/2.0);
117  result.setZ((min.getZ()+max.getZ())/2.0);
118 
119  return result;
120 }
121 
122 
123 /******************************************************************************
124  * Fonction : void Init_Gmap(CGMap * G) *
125  *----------------------------------------------------------------------------*
126  * Cette fonction initialise la G-carte en ajoutant le nombre de points *
127  * des faces dans leur orbite et en ajoutant un tableau de couleur à la *
128  * G-carte. *
129  * *
130  *****************************************************************************/
131 
132 void Init_Gmap(CGMap * G)
133 {
134  CDart *dgm, *d01;
135 
136  bool isFace;
137  int nbDarts;
138 
139  // Création d'une marque.
140  int markFace = G->getNewMark();
141 
142  // Récupération du tableau de couleurs dans la G-carte.
143  if (Find_Attribute(G, ORBIT_0123, COLOR_TABLE_ATTRIBUTE_ID) == NULL)
144  {
145  G->addAttribute(G->getFirstDart(), ORBIT_0123,
146  new Color_Table_Att(Color(1.0, 1.0, 0.0),
147  Color(0.0, 0.0, 1.0),
148  Color(0.0, 1.0, 0.0),
149  Color(0.8, 0.8, 0.8)));
150  }
151 
152  // Parcours des brins de la G-carte.
153  CDynamicCoverageAll Cgm(G);
154  for (Cgm.reinit(); Cgm.cont(); Cgm++)
155  {
156  dgm = *Cgm;
157 
158  // Si le brin n'est pas marqué.
159  if (!G->isMarked(dgm, markFace))
160  {
161  // Le brin est seul.
162  if (G->isFree0(dgm))
163  G->setMark(dgm, markFace);
164 
165  // Le brin n'est pas seul.
166  else
167  {
168  // Le nombre de points de la face est déjà stoqué dans l'orbite.
169  if (G->getAttribute(dgm, ORBIT_013, INT_ATTRIBUTE_ID))
170  {
171  // Marquage des brins de la face.
172  CCoverage* DCf = G->getDynamicCoverage(dgm, ORBIT_01);
173  for (DCf->reinit();
174  DCf->cont();
175  (*DCf)++)
176  G->setMark(**DCf, markFace);
177 
178  delete DCf;
179  }
180  else
181  {
182  isFace = true;
183  nbDarts = 0;
184 
185  // Parcours de l'orbite ORBIT_01.
186  CCoverage* DCf = G->getDynamicCoverage(dgm, ORBIT_01);
187  for (DCf->reinit();
188  DCf->cont();
189  (*DCf)++)
190  {
191  d01 = **DCf;
192 
193  // Si le brin n'est pas marqué.
194  if (!G->isMarked(d01, markFace))
195  {
196  nbDarts++;
197  if (G->isFree1(d01))
198  isFace = false;
199  G->setMark(d01, markFace);
200  }
201  }
202  delete DCf;
203 
204  if (isFace)
205 
206  // Ajout du nombre de sommets de la face dans son orbite.
207  G->addAttribute(dgm, ORBIT_013, new Int_Att(nbDarts/2));
208  }
209 
210  }
211  }
212  }
213 
214  // Demarquage et liberation de la marque.
215  for (Cgm.reinit(); Cgm.cont(); Cgm++)
216  G->unsetMark(*Cgm, markFace);
217  G->freeMark(markFace);
218 }
219 
220 
221 /******************************************************************************
222  * Fonction : CAttribute * Find_Attribute(CGMap * G, TOrbit o, TAttributeId typeAttr) *
223  *----------------------------------------------------------------------------*
224  * Cette fonction parcourt la G-carte jusqu'à ce qu'elle trouve le type *
225  * d'attribut passé en paramètre. *
226  * *
227  *****************************************************************************/
228 
229 CAttribute * Find_Attribute(CGMap * G, TOrbit o, TAttributeId typeAttr)
230 {
231  CAttribute * alpha = NULL;
232  CDart * dgm;
233 
234  // Création d'une marque.
235  int mark = G->getNewMark();
236 
237  // Parcours des brins de la G-carte.
238  CDynamicCoverageAll Cgm(G);
239  for (Cgm.reinit();
240  Cgm.cont() && (alpha == NULL);
241  Cgm++)
242  {
243  dgm = *Cgm;
244 
245  // Si le brin n'est pas marqué.
246  if (!G->isMarked(dgm, mark))
247  {
248  // Récupèration de l'attribut s'il existe
249  alpha = G->getAttribute(dgm, o, typeAttr);
250 
251  // Si l'attribut n'alpha pas été trouvé.
252  if (alpha == NULL)
253  {
254  // Marquage des brins de l'orbite.
255  CCoverage* DC = G->getDynamicCoverage(dgm, o);
256  for (DC->reinit();
257  DC->cont();
258  (*DC)++)
259  G->setMark(**DC, mark);
260  delete DC;
261  }
262  }
263  }
264 
265  // Demarquage et liberation de la marque.
266  for (Cgm.reinit(); Cgm.cont(); Cgm++)
267  G->unsetMark(*Cgm, mark);
268  G->freeMark(mark);
269 
270  return alpha;
271 }
272 //******************************************************************************
273 } // namespace GMap3d
274 //******************************************************************************