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 #ifndef DYNAMIC_COVERAGE_REAL_FACE_HH
00026 #define DYNAMIC_COVERAGE_REAL_FACE_HH
00027
00028 #include "coverage.hh"
00029 #include "inline-macro.hh"
00030
00031 #include <list>
00032 #include <queue>
00033 #include <stack>
00034
00035 namespace GMap3d
00036 {
00037 class CDart;
00038 class CGMapBasic;
00039
00040
00047 class CDynamicCoverageRealFace : public CCoverage
00048 {
00049 private:
00050
00051
00052
00054 CDart* FDart1;
00056 CDart* FDartCurrent;
00057
00059 int FFictiveMark;
00060
00070 bool FFirstDirection;
00071
00076 bool FNextTryA0;
00077
00079 bool FA3Exist;
00080
00082 bool FFirstBorder;
00083
00085 TOperationState FPrevOp;
00086
00087
00088
00089 public:
00090
00091
00092
00094 CDynamicCoverageRealFace(CGMapBasic* AGMap, const CDart* ADart, int AMark);
00096 virtual ~CDynamicCoverageRealFace();
00097
00098
00099
00100
00101
00102
00103 void reinit();
00104 void operator++();
00105 CDart* operator++(int);
00106 bool cont();
00107 CDart* operator*();
00108 TOperationState prevOperationType();
00109 int type() const;
00110
00111
00112 };
00113
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 #include "g-map-basic.hh"
00126 #include "dart.hh"
00127
00128 #include <cassert>
00129
00130 namespace GMap3d
00131 {
00132
00133
00134
00135 inline
00136 void CDynamicCoverageRealFace::reinit()
00137 {
00138 FDartCurrent = FDart1;
00139 FNextTryA0 = true;
00140 FFirstBorder = true;
00141 FFirstDirection = true;
00142 FPrevOp = OP_NONE;
00143 }
00144
00145 inline
00146 CDynamicCoverageRealFace::
00147 CDynamicCoverageRealFace(CGMapBasic* AGMap, const CDart* ADart1, int AMark) :
00148 CCoverage (AGMap),
00149 FDart1 ((CDart*) ADart1),
00150 FFictiveMark(AMark)
00151 {
00152 FA3Exist = !FMap->isFree3(ADart1);
00153 reinit();
00154 }
00155
00156 inline
00157 CDynamicCoverageRealFace::~CDynamicCoverageRealFace()
00158 {
00159 }
00160
00161 inline
00162 bool CDynamicCoverageRealFace::cont()
00163 {
00164 return FPrevOp != OP_END;
00165 }
00166
00167 inline
00168 void CDynamicCoverageRealFace::operator++()
00169 {
00170 assert(cont());
00171
00172 if ( FA3Exist && FPrevOp!=OP_ALPHA3 )
00173 {
00174 FDartCurrent = FMap->alpha3(FDartCurrent);
00175 FFirstBorder = !FFirstBorder;
00176 FPrevOp = OP_ALPHA3;
00177 }
00178 else
00179 {
00180 int nextAlpha = 0;
00181
00182 if ( !FNextTryA0 ) nextAlpha=1;
00183
00184 if ( FMap->isFree(FDartCurrent, nextAlpha) )
00185 {
00186 if ( !FFirstDirection || FMap->isFree1(FDart1) )
00187 FPrevOp = OP_END;
00188 else
00189 {
00190 FDartCurrent = FMap->alpha1(FDart1);
00191 FFirstDirection = false;
00192 FNextTryA0 = true;
00193 FPrevOp = OP_JUMP;
00194 }
00195 }
00196 else
00197 {
00198 FDartCurrent = FMap->alpha(FDartCurrent, nextAlpha);
00199 FNextTryA0 = !FNextTryA0;
00200 FPrevOp = (nextAlpha==0?OP_ALPHA0:OP_ALPHA1);
00201 }
00202
00203 if ( FPrevOp!=OP_END )
00204 {
00205
00206
00207 while ( FMap->isMarked(FDartCurrent, FFictiveMark) &&
00208 !FMap->isFree2(FDartCurrent) &&
00209 !FMap->isFree1(FMap->alpha2(FDartCurrent)) )
00210 {
00211 FDartCurrent = FMap->alpha1(FMap->alpha2(FDartCurrent));
00212 }
00213
00214
00215 if ( FMap->isMarked(FDartCurrent, FFictiveMark) )
00216 {
00217 if ( !FFirstDirection || FMap->isFree1(FDart1) )
00218 FPrevOp = OP_END;
00219 else
00220 {
00221 FDartCurrent = FMap->alpha1(FDart1);
00222 FFirstDirection = false;
00223 FNextTryA0 = true;
00224 FPrevOp = OP_JUMP;
00225 }
00226 }
00227 }
00228 }
00229
00230 if ( FDartCurrent==FDart1 )
00231 FPrevOp = OP_END;
00232 }
00233
00234 inline
00235 TOperationState CDynamicCoverageRealFace::prevOperationType()
00236 {
00237 return FPrevOp;
00238 }
00239
00240 inline
00241 CDart* CDynamicCoverageRealFace::operator*()
00242 {
00243 assert(cont());
00244 return FDartCurrent;
00245 }
00246
00247 inline
00248 CDart* CDynamicCoverageRealFace::operator++(int)
00249 {
00250 CDart* tmp = operator*();
00251
00252 operator++();
00253 return tmp;
00254 }
00255
00256 inline
00257 int CDynamicCoverageRealFace::type() const
00258 {
00259 return COVERAGE_REAL_FACE;
00260 }
00261
00262 }
00263
00264 #endif // DYNAMIC_COVERAGE_REAL_FACE_HH
00265