Moka kernel
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
gmg-fictive-edge.cc
Go to the documentation of this file.
1 /*
2  * lib-gmapkernel : Un noyau de 3-G-cartes et des opérations.
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-gmapkernel
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 #include "g-map-generic.hh"
27 using namespace GMap3d;
28 //******************************************************************************
30 {
31  assert( ADart!=NULL && ADart2!=NULL );
32  assert( !isFree1(ADart) );
33 
34  CDart * d1 = alpha1(ADart);
35  CDart * d2 = alpha21(ADart);
36  CDart * d3 = alpha1(ADart2);
37 
38  unsew1(d1); // rappel : unsew1 1-decoud en meme temps alpha3(d1)
39  if (!isFree1(d2))
40  unsew1(d2);
41 
42  if (!isFree1(ADart2))
43  unsew1(ADart2);
44 
45  sew1(d1,d2);
46 
47  sew1(ADart,ADart2);
48 
49  if ( isFree1(d3) )
50  sew1(alpha2(ADart),d3);
51 }
52 //******************************************************************************
54 {
55  CDart * toShift = alpha12(ADart);
56  CDart * next = NULL;
57  unsigned int nb = 0;
58 
59  while( toShift!=ADart )
60  {
61  next = alpha12(toShift);
62  shiftOneFictiveEdge( toShift, alpha0(ADart) );
63  ++nb;
64  toShift = next;
65  }
66 
67  return nb;
68 }
69 //******************************************************************************
71 {
72  CDart * d = alpha12(ADart);
73  CDart * tmp;
74 
75  while (isMarked(d,AMark) && // Tant qu'on est sur une arête fictive
76  d!=ADart ) // et qu'on n'est pas revenu sur l'arête de départ
77  {
78  tmp = alpha12(d);
79  shiftOneFictiveEdge(d,alpha0(ADart));
80  d=tmp;
81  }
82 }
83 //******************************************************************************
85 {
86  shiftAllAdjacentFictiveEdges(ADart, AMark);
87 
88  shiftAllAdjacentFictiveEdges(alpha2(ADart), AMark);
89 }
90 //******************************************************************************
92 {
93  assert( ADart!=NULL );
94  // assert( !isEdgeLoop(ADart) );
95 
96  CDart* actu = ADart;
97  CDart* toShift = NULL;
98  CDart* tmp = NULL;
99 
100  do
101  {
102  toShift = alpha12(actu);
103 
104  while( isMarked(toShift, AMark) && toShift!=actu )
105  {
106  tmp = alpha12(toShift);
107  shiftOneFictiveEdge( toShift, alpha0(actu) );
108  toShift = tmp;
109  }
110  actu = alpha23(actu); // Puis on passe a l'autre volume.
111  }
112  while ( actu!=ADart );
113 }
114 //******************************************************************************
116 {
117  CDynamicCoverage123 it(this,ADart);
118  while(it.cont())
119  {
120  if (isMarked(*it,AMark)) return true;
121  ++it;
122  }
123  return false;
124 }
125 //******************************************************************************
126 int CGMapGeneric::findVertexType( CDart* ADart, CDart** AFirstDart,
127  int AMark )
128 {
129  assert( ADart!=NULL );
130 
131  int markVertex = getNewMark();
132  int markEdge = getNewMark();
133  int res = 0;
134  int nbReel = 0; // Pour compter le nombre d'arête réelle non boucle
135  bool reelLoop = false;
136 
137  CDynamicCoverageVertex it(this, ADart);
138  for ( ; it.cont(); ++it )
139  setMark(*it, markVertex);
140 
141  // On parcours le sommet. On s'arrête si on a trouvé et une boucle réelle
142  // et une arête non boucle, ou plus de 2 arêtes réelles.
143  for ( it.reinit(); it.cont() && nbReel<=2 && (!reelLoop || nbReel==1); ++it )
144  {
145  if ( !isMarked(*it, markEdge) )
146  {
147  if ( !isMarked(*it, AMark) ) // On n'est pas sur une arête fictive
148  {
149  if ( isMarked(alpha0(*it), markVertex) )
150  {
151  reelLoop = true; // Ici l'arête réelle est une boucle
152  }
153  else
154  {
155  if ( nbReel==0 )
156  *AFirstDart = *it; // Cette arête est réelle et non boucle
157  }
158  ++nbReel; // On compte le nombre d'arête réelles
159  markOrbit(*it, ORBIT_EDGE, markEdge);
160  }
161  }
162  }
163 
164  if ( reelLoop ) // On a trouvé une boucle réelle
165  {
166  if ( nbReel==1 ) res = 1; // C'est la seule arête réelle
167  else res = 3; // Il y a d'autres arêtes réelle incidentes au sommet
168  }
169  else
170  {
171  if ( nbReel==2 )
172  res = 2; // On a exactement 2 arêtes réelles non boucle
173  else if ( nbReel!=0 ) res = 3; // cas ==1 ou >2
174  }
175 
176  // On refait le parcours du sommet pour enlever les marques
177  for ( it.reinit(); it.cont(); ++it )
178  {
179  if ( isMarked(*it, markEdge) )
180  unmarkOrbit(*it, ORBIT_EDGE, markEdge);
181 
182  unsetMark(*it, markVertex);
183  }
184 
185  assert(isWholeMapUnmarked(markVertex));
186  assert(isWholeMapUnmarked(markEdge));
187 
188  freeMark(markVertex);
189  freeMark(markEdge);
190 
191  return res;
192 }
193 //******************************************************************************
195 {
196  assert( ADart!=NULL );
197  assert( !isFree2(ADart) );
198 
199  CDart* res = NULL;
200  int markVertex = getNewMark();
201 
202  CDynamicCoverageVertex it(this, ADart);
203 
204  // Première boucle pour marquer le sommet
205  while( it.cont() ) { setMark(*it, markVertex); ++it; }
206 
207  for ( it.reinit(); it.cont() && res==NULL; ++it )
208  {
209  if ( !isMarked(alpha0(*it), markVertex) )
210  {
211  res = *it; // Cette arête n'est pas une boucle
212  }
213  }
214 
215  for ( it.reinit(); it.cont(); ++it ) // Pour démarquer le sommet
216  unsetMark(*it, markVertex);
217 
218  assert(isWholeMapUnmarked(markVertex));
219 
220  freeMark(markVertex);
221 
222  return res;
223 }
224 //******************************************************************************
225 int CGMapGeneric::markRealFace(CDart* ADart, int AMark, int AMark2)
226 {
227  assert( ADart!=NULL );
228  assert( !isMarked(ADart,AMark) );
229 
230  int res = 0;
231  CDynamicCoverageRealFace it(this, ADart, AMark);
232  while ( it.cont() )
233  {
234  setMark(it++, AMark2);
235  ++res;
236  }
237 
238  return res;
239 }
240 //******************************************************************************
241 int CGMapGeneric::unmarkRealFace(CDart* ADart, int AMark, int AMark2)
242 {
243  assert( ADart!=NULL );
244  assert( !isMarked(ADart,AMark) );
245 
246  int res = 0;
247  CDynamicCoverageRealFace it(this, ADart, AMark);
248  while ( it.cont() )
249  {
250  unsetMark(it++, AMark2);
251  ++res;
252  }
253 
254  return res;
255 }
256 //******************************************************************************