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 "rounding-generic.hh"
00026 #include "g-map-generic.hh"
00027 #include <cstdlib>
00028 #include <cassert>
00029 using namespace GMap3d;
00030
00031 CRoundingGeneric::CRoundingGeneric(CGMapGeneric* AMap) :
00032 FMap(AMap)
00033 {
00034 assert(FMap != NULL);
00035 }
00036
00037 CRoundingGeneric::~CRoundingGeneric()
00038 {
00039 }
00040
00041 void CRoundingGeneric::chamferCell(CDart* ADart, int ACellDim, int AMaxDim)
00042 {
00043 assert(ADart != NULL);
00044 assert(0 <= ACellDim && ACellDim <= 2);
00045
00046 int treated = FMap->getNewMark();
00047
00048 CCoverage* cov = FMap->getStaticCoverage(ADart, ORBIT_CELL[ACellDim]);
00049
00050 for (; cov->cont(); ++(*cov))
00051 {
00052 CDart* current = **cov;
00053
00054 CDart* d0 = FMap->alpha0(current);
00055 CDart* d1 = FMap->alpha1(current);
00056 CDart* d2 = FMap->alpha2(current);
00057 CDart* d3 = FMap->alpha3(current);
00058
00059 addDartChain(current, 0, AMaxDim);
00060
00061 if (FMap->isMarked(d0, treated))
00062 chamfreinLink(current, d1, 0, ACellDim, AMaxDim);
00063
00064 if (FMap->isMarked(d1, treated))
00065 chamfreinLink(current, d1, 1, ACellDim, AMaxDim);
00066
00067 if (FMap->isMarked(d2, treated))
00068 chamfreinLink(current, d2, 2, ACellDim, AMaxDim);
00069
00070 if (FMap->isMarked(d3, treated))
00071 chamfreinLink(current, d3, 3, ACellDim, AMaxDim);
00072
00073 FMap->setMark(current, treated);
00074 }
00075
00076 for (cov->reinit(); cov->cont(); ++(*cov))
00077 FMap->unsetMark(**cov, treated);
00078
00079 FMap->freeMark(treated);
00080
00081 delete cov;
00082 }
00083
00084 void CRoundingGeneric::chamferVertex(CDart* ADart, int AMaxDim)
00085 {
00086 assert(ADart != NULL);
00087
00088 CStaticCoverageVertex cov(FMap, ADart);
00089
00090 int treated = FMap->getNewMark();
00091
00092 for (; cov.cont(); ++cov)
00093 {
00094 CDart* current = *cov;
00095
00096 CDart* d1 = FMap->alpha1(current);
00097 CDart* d2 = FMap->alpha2(current);
00098 CDart* d3 = FMap->alpha3(current);
00099
00100 addDartChain(current, 0, AMaxDim);
00101
00102 if (FMap->isMarked(d1, treated)) chamfreinLink(current, d1, 1,0, AMaxDim);
00103 if (FMap->isMarked(d2, treated)) chamfreinLink(current, d2, 2,0, AMaxDim);
00104 if (FMap->isMarked(d3, treated)) chamfreinLink(current, d3, 3,0, AMaxDim);
00105
00106 FMap->setMark(current, treated);
00107 }
00108
00109 for (cov.reinit(); cov.cont(); ++cov)
00110 FMap->unsetMark(*cov, treated);
00111
00112 FMap->freeMark(treated);
00113 }
00114
00115 void CRoundingGeneric::chamferEdge(CDart * ADart, int AMaxDim)
00116 {
00117 assert(ADart!=NULL);
00118
00119 CStaticCoverageEdge cov(FMap, ADart);
00120
00121 int treated = FMap->getNewMark();
00122
00123 for (; cov.cont(); ++cov)
00124 {
00125 CDart* current = *cov;
00126
00127 CDart* d0 = FMap->alpha0(current);
00128 CDart* d2 = FMap->alpha2(current);
00129 CDart* d3 = FMap->alpha3(current);
00130
00131 addDartChain(current, 1, AMaxDim);
00132
00133 if (FMap->isMarked(d0, treated)) chamfreinLink(current, d0, 0,1, AMaxDim);
00134 if (FMap->isMarked(d2, treated)) chamfreinLink(current, d2, 2,1, AMaxDim);
00135 if (FMap->isMarked(d3, treated)) chamfreinLink(current, d3, 3,1, AMaxDim);
00136
00137 FMap->setMark(current, treated);
00138 }
00139
00140 for (cov.reinit(); cov.cont(); ++cov)
00141 FMap->unsetMark(*cov, treated);
00142
00143 FMap->freeMark(treated);
00144 }
00145
00146 void CRoundingGeneric::addDartChain(CDart* ADart, int ADimMin, int ADimMax)
00147 {
00148 assert(ADart != NULL);
00149 assert(0 <= ADimMin);
00150 assert(ADimMin < ADimMax);
00151 assert(ADimMax <= 3);
00152
00153 CDart* d1 = ADart;
00154
00155 for (int dim = ADimMin+1; dim <= ADimMax; ++dim)
00156 {
00157 CDart* d2 = FMap->addMapDart();
00158 FMap->linkAlpha(d1, d2, dim);
00159 d1 = d2;
00160 }
00161 }
00162
00163 void CRoundingGeneric::chamfreinLink(CDart* ADart1, CDart* ADart2,
00164 int ADim, int ADimMin, int ADimMax)
00165 {
00166 assert(ADart1 != NULL);
00167 assert(ADart2 != NULL);
00168
00169 assert(ADim != ADimMin);
00170 assert(ADimMin < ADimMax);
00171
00172 for (int dim = ADimMin+1; dim <= ADimMax; ++dim)
00173 {
00174 ADart1 = FMap->alpha(ADart1, dim);
00175 ADart2 = FMap->alpha(ADart2, dim);
00176
00177 if (dim < ADim)
00178 {
00179 if (dim < ADim-1)
00180 FMap->linkAlpha(ADart1, ADart2, ADim);
00181 }
00182 else
00183 if (ADim != ADimMin)
00184 FMap->linkAlpha(ADart1, ADart2, ADim<ADimMin ? ADim : ADim-1);
00185 }
00186 }
00187
00188 int CRoundingGeneric::getVertexRoundingDimension(CDart* ADart, int ACellDim)
00189 {
00190 assert(ADart != NULL);
00191 assert(0<=ACellDim && ACellDim<=3);
00192
00193 int i = 0;
00194 bool cont = true;
00195
00196 while (cont && i<4)
00197 {
00198 if (i != ACellDim)
00199 cont = FMap->isIClosedOrbit(ADart, i, ORBIT_CELL[ACellDim]);
00200
00201 if (cont)
00202 ++i;
00203 }
00204
00205 return i-1;
00206 }
00207
00208 int CRoundingGeneric::getEdgeRoundingDimension(CDart* ADart, int ACellDim)
00209 {
00210 assert(ADart != NULL);
00211 assert(0<=ACellDim && ACellDim<=3);
00212
00213 int i = getVertexRoundingDimension(ADart, ACellDim);
00214
00215 if (i<3 && ! FMap->isIFreeOrbit(ADart, i, ORBIT_CELL[ACellDim]))
00216 return i+1;
00217
00218 return i;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250 void CRoundingGeneric::removeEdge(CDart* ADart)
00251 {
00252 assert(ADart != NULL);
00253
00254 for (CDynamicCoverage23 cov(FMap, ADart); cov.cont(); )
00255 {
00256 CDart* current = cov++;
00257
00258 if (! FMap->isFree1(current) &&
00259 ! FMap->isFree1(FMap->alpha0(current)))
00260 FMap->linkAlpha1(FMap->alpha1(current), FMap->alpha01(current));
00261 else
00262 {
00263 FMap->unlinkAlpha1( current );
00264 FMap->unlinkAlpha1(FMap->alpha0(current));
00265 }
00266
00267 if (! FMap->isFree0(current))
00268 FMap->delMapDart(FMap->alpha0(current));
00269
00270 FMap->delMapDart(current);
00271 }
00272 }
00273