00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "g-map-generic.hh"
00026 #include "dynamic-coverage-real-face.hh"
00027 using namespace GMap3d;
00028
00029 void CGMapGeneric::shiftOneFictiveFaceAlongDanglingEdge(CDart* ADart,
00030 int AFictiveFaceMark,
00031 int ADeleteMark)
00032 {
00033 assert( ADart!=NULL );
00034 assert( !isFree1(ADart) );
00035 assert( !isFree2(ADart) );
00036 assert( isFree3(ADart) );
00037 assert( !isFree3(alpha2(ADart)) );
00038 assert( isMarked(alpha2(ADart), AFictiveFaceMark) );
00039
00040 CDart* last = NULL;
00041 CDart* d1 = NULL;
00042 CDart* d2 = NULL;
00043
00044 CDynamicCoverage23 it(this,ADart);
00045 while ( it.cont() )
00046 {
00047 if ( isMarked(*it, AFictiveFaceMark) && !isMarked(*it, ADeleteMark) )
00048 {
00049 d1 = alpha1(*it);
00050 d2 = alpha01(*it);
00051
00052 if ( !isFree1(*it) )
00053 {
00054 unsew1(*it);
00055 assert( !isFree1(alpha0(*it)) );
00056 unsew1(alpha0(*it));
00057 sew1( d1, d2 );
00058 }
00059
00060 setMark( *it, ADeleteMark );
00061 setMark( alpha0(*it), ADeleteMark );
00062 }
00063 last = it++;
00064 }
00065
00066 assert( isFree3(last) && last!=ADart );
00067 unsew2( last );
00068 unsew2( ADart );
00069
00070 sew2( last, ADart );
00071 }
00072
00073 void CGMapGeneric::shiftOneFictiveFace(CDart* ADart, int AFictiveFaceMark,
00074 int ADeleteMark)
00075 {
00076 assert( ADart!=NULL );
00077 assert( !isFree1(ADart) );
00078 assert( !isFree2(ADart) );
00079 assert( isFree3(ADart) );
00080 assert( !isFree3(alpha2(ADart)) );
00081 assert( isMarked(alpha2(ADart), AFictiveFaceMark) );
00082
00083 unsigned int directInfo = getNewDirectInfo();
00084 unsigned int nextAlpha = 0;
00085
00086 CDart * d1 = alpha1(ADart);
00087 CDart * d2 = alpha232(ADart);
00088 CDart * n1 = NULL;
00089 CDart * n2 = NULL;
00090 CDart * toDelete = alpha2(ADart);
00091 CDart * prev = ADart;
00092
00093
00094 setDirectInfo( ADart, directInfo, alpha3(alpha21(ADart)) );
00095 setDirectInfo( alpha0(ADart), directInfo, alpha3(alpha201(ADart)) );
00096
00097 unsew1( toDelete );
00098 unsew1( alpha0(toDelete) );
00099
00100 unsew2( ADart );
00101 unsew2( d2 );
00102
00103 sew2( ADart, d2 );
00104
00105
00106 while ( d1!=alpha0(ADart) )
00107 {
00108 d2 = alpha2( d1 );
00109
00110 n1 = addMapDart(); n2 = addMapDart();
00111 setMark(n1, AFictiveFaceMark); setMark(n2, AFictiveFaceMark);
00112
00113 linkAlpha3( n1, n2 );
00114
00115 linkAlpha2( d1, n1 ); linkAlpha2( d2, n2 );
00116
00117 setDirectInfo( d1, directInfo, n1 );
00118
00119 if ( nextAlpha==0 )
00120 {
00121 linkAlpha1( n1, (CDart*)getDirectInfo(prev, directInfo) );
00122 linkAlpha1( n2, alpha3((CDart*)getDirectInfo(prev, directInfo)) );
00123 }
00124 else
00125 {
00126 assert ( nextAlpha==1 );
00127 linkAlpha0( n1, (CDart*)getDirectInfo(prev, directInfo) );
00128 linkAlpha0( n2, alpha3((CDart*)getDirectInfo(prev, directInfo)) );
00129 }
00130
00131
00132 prev = d1;
00133 d1 = alpha(d1, nextAlpha);
00134
00135
00136
00137
00138
00139
00140 nextAlpha = ( nextAlpha==0 ? 1 : 0 );
00141 }
00142
00143 assert ( nextAlpha==0 );
00144 linkAlpha1( n1, (CDart*)getDirectInfo(d1, directInfo) );
00145 linkAlpha1( n2, alpha3((CDart*)getDirectInfo(d1, directInfo)) );
00146
00147
00148 setMark(alpha03(toDelete), ADeleteMark);
00149 setMark(alpha3(toDelete), ADeleteMark);
00150 setMark(alpha0(toDelete), ADeleteMark);
00151 setMark(toDelete, ADeleteMark);
00152
00153
00154
00155 freeDirectInfo(directInfo);
00156 }
00157
00158 bool CGMapGeneric::canShiftOneFictiveFace(CDart* ADart, int AFictiveFaceMark)
00159 {
00160 assert( ADart!=NULL );
00161 assert( !isFree1(ADart) );
00162 assert( !isFree2(ADart) );
00163 assert( !isFree3(ADart) );
00164 assert( !isFree2(alpha3(ADart)) );
00165 assert( isMarked(ADart, AFictiveFaceMark) );
00166
00167 int currentFace = getNewMark();
00168 bool res = true;
00169 CDart * d1 = alpha1(ADart);
00170 bool edgeMarked, vertexMarked;
00171
00172
00173 markOrbit( ADart, ORBIT_FACE, currentFace);
00174
00175 while ( res && d1!=alpha0(ADart) )
00176 {
00177 edgeMarked = false;
00178 vertexMarked = false;
00179
00180 for (CDynamicCoverageEdge it(this, d1); !edgeMarked && it.cont(); ++it)
00181 edgeMarked = isMarked(*it, currentFace);
00182
00183 for (CDynamicCoverageEdge it(this, alpha1(d1));
00184 !edgeMarked && it.cont(); ++it)
00185 edgeMarked = isMarked(*it, currentFace);
00186
00187 if ( !edgeMarked )
00188 {
00189 for (CDynamicCoverageVertex it(this, d1); !vertexMarked && it.cont();
00190 ++it)
00191 vertexMarked = isMarked(*it, currentFace);
00192
00193 if ( vertexMarked ) res = false;
00194 }
00195
00196 d1 = alpha01(d1);
00197 }
00198
00199
00200 unmarkOrbit( ADart, ORBIT_FACE, currentFace);
00201 freeMark(currentFace);
00202
00203 return res;
00204 }
00205
00206 void CGMapGeneric::shiftAllFictiveFaces(CDart* ADart, int AFictiveFaceMark,
00207 int ADeleteMark)
00208 {
00209 assert( !isMarked(ADart, AFictiveFaceMark) );
00210 assert( !isFree2(ADart) && isFree3(ADart) );
00211
00212 while ( isMarked(alpha2(ADart), AFictiveFaceMark) )
00213 {
00214 shiftOneFictiveFace(ADart, AFictiveFaceMark, ADeleteMark);
00215 }
00216 }
00217
00218 bool CGMapGeneric::canShiftAllFictiveFaces(CDart* ADart, int AFictiveFaceMark)
00219 {
00220 assert( !isMarked(ADart, AFictiveFaceMark) );
00221 assert( !isFree2(ADart) && isFree3(ADart) );
00222
00223 bool res = true;
00224 CDart* current = alpha2(ADart);
00225
00226 while ( res && isMarked(current, AFictiveFaceMark) )
00227 {
00228 res = canShiftOneFictiveFace(current, AFictiveFaceMark);
00229 current = alpha32(current);
00230 }
00231 return res;
00232 }
00233
00234 int CGMapGeneric::findEdgeType( CDart* ADart, CDart** AFirstDart,
00235 int AFictiveFaceMark )
00236 {
00237 assert( ADart!=NULL );
00238
00239 int markEdge = getNewMark();
00240 int markFace = getNewMark();
00241 int res = 0;
00242 int nbReel = 0;
00243 bool reelDangling = false;
00244
00245 CDynamicCoverageEdge it(this, ADart);
00246 for ( ; it.cont(); ++it )
00247 setMark(*it, markEdge);
00248
00249
00250
00251 for ( it.reinit(); it.cont() && nbReel<=2 && (!reelDangling || nbReel==1);
00252 ++it )
00253 {
00254 if ( !isMarked(*it, markFace) )
00255 {
00256
00257 if ( !isMarked(*it, AFictiveFaceMark) )
00258 {
00259 if ( isMarked(alpha1(*it), markEdge) ||
00260 isMarked(alpha01(*it), markEdge) )
00261 {
00262 *AFirstDart = *it;
00263 reelDangling = true;
00264
00265 }
00266 else
00267 {
00268 if ( nbReel==0 )
00269 *AFirstDart = *it;
00270 }
00271 ++nbReel;
00272 markOrbit(*it, ORBIT_FACE, markFace);
00273 }
00274 }
00275 }
00276
00277 if ( reelDangling )
00278 {
00279 if ( nbReel==1 ) res = 1;
00280 else res = 3;
00281 }
00282 else
00283 {
00284 if ( nbReel==2 )
00285 res = 2;
00286 else if ( nbReel!=0 ) res = 3;
00287 }
00288
00289
00290 for ( it.reinit(); it.cont(); ++it )
00291 {
00292 if ( isMarked(*it, markFace) )
00293 unmarkOrbit(*it, ORBIT_FACE, markFace);
00294
00295 unsetMark(*it, markEdge);
00296 }
00297
00298
00299
00300
00301 freeMark(markEdge);
00302 freeMark(markFace);
00303
00304 return res;
00305 }
00306