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 using namespace GMap3d;
00027
00028 int CGMapGeneric::duplicateMarkedDarts(int AMarkNumber, int ADirectInfoIndex,
00029 bool ADuplicateEmbeddings,
00030 bool A0Sew, bool A1Sew,
00031 bool A2Sew, bool A3Sew)
00032 {
00033 int nbDuplicated = 0;
00034
00035 int duplicated = getNewMark();
00036
00037 int directInfoIndex =
00038 ADirectInfoIndex<0 ? getNewDirectInfo() : ADirectInfoIndex;
00039
00040 CDynamicCoverageAll it(this);
00041
00042
00043 for (; it.cont(); ++it)
00044 if (isMarked(*it, AMarkNumber))
00045 {
00046 CDart * newDart = addMapDart();
00047
00048 if (ADuplicateEmbeddings)
00049 setMark(newDart, duplicated);
00050
00051 (*it)->setDirectInfo(directInfoIndex, newDart);
00052
00053 ++nbDuplicated;
00054 }
00055
00056
00057 sewDuplicatedDarts(&it, AMarkNumber, directInfoIndex,
00058 A0Sew, A1Sew, A2Sew, A3Sew);
00059
00060
00061 if (ADuplicateEmbeddings)
00062 duplicateEmbeddingsOfDuplicatedDarts(&it,
00063 AMarkNumber, duplicated,
00064 directInfoIndex);
00065
00066
00067 if (ADirectInfoIndex<0)
00068 freeDirectInfo(directInfoIndex);
00069
00070 freeMark(duplicated);
00071
00072 return nbDuplicated;
00073 }
00074
00075 CDart * CGMapGeneric::duplicateDarts(CDart * ADart, TOrbit AOrbit,
00076 int ADirectInfoIndex,
00077 bool ADuplicateEmbeddings)
00078 {
00079 assert(ADart!=NULL);
00080
00081 int selected = getNewMark();
00082 int duplicated = getNewMark();
00083
00084 int directInfoIndex =
00085 ADirectInfoIndex<0 ? getNewDirectInfo() : ADirectInfoIndex;
00086
00087 CCoverage * cov = getDynamicCoverage(ADart, AOrbit);
00088
00089
00090 for (; cov->cont(); ++(*cov))
00091 {
00092 CDart * newDart = addMapDart();
00093 setMark(newDart, duplicated);
00094 setMark(**cov, selected);
00095 (**cov)->setDirectInfo(directInfoIndex, newDart);
00096 }
00097
00098
00099 sewDuplicatedDarts(cov, selected, directInfoIndex,
00100 AND_ORBIT(AOrbit, ORBIT_0) != ORBIT_SELF,
00101 AND_ORBIT(AOrbit, ORBIT_1) != ORBIT_SELF,
00102 AND_ORBIT(AOrbit, ORBIT_2) != ORBIT_SELF,
00103 AND_ORBIT(AOrbit, ORBIT_3) != ORBIT_SELF);
00104
00105
00106 if (ADuplicateEmbeddings)
00107 duplicateEmbeddingsOfDuplicatedDarts(cov,
00108 selected, duplicated,
00109 directInfoIndex);
00110
00111
00112 CDart * result = getDirectInfoAsDart(ADart, directInfoIndex);
00113
00114 for (cov->reinit(); cov->cont(); ++(*cov))
00115 unsetMark(**cov, selected);
00116
00117 delete cov;
00118
00119 if (ADirectInfoIndex<0)
00120 freeDirectInfo(directInfoIndex);
00121
00122 freeMark(selected);
00123 freeMark(duplicated);
00124
00125 return result;
00126 }
00127
00128 #define DUP(D) (getDirectInfoAsDart(D, ADirectInfoIndex))
00129
00130 void CGMapGeneric::sewDuplicatedDarts(CCoverage * ACoverage,
00131 int AMarkNumber, int ADirectInfoIndex,
00132 bool A0Sew, bool A1Sew,
00133 bool A2Sew, bool A3Sew)
00134 {
00135 assert(ACoverage!=NULL);
00136 assert(AMarkNumber>=0);
00137 assert(ADirectInfoIndex>=0);
00138
00139
00140 for (ACoverage->reinit(); ACoverage->cont(); ++(*ACoverage))
00141 {
00142 CDart * d = **ACoverage;
00143
00144 if (AMarkNumber<0 || isMarked(d, AMarkNumber))
00145 {
00146 if (A0Sew)
00147 if (!isFree0(d) && isMarked(alpha0(d), AMarkNumber) &&
00148 isFree0(DUP(d)))
00149 linkAlpha0(DUP(d), DUP(alpha0(d)));
00150
00151 if (A1Sew)
00152 if (!isFree1(d) && isMarked(alpha1(d), AMarkNumber) &&
00153 isFree1(DUP(d)))
00154 linkAlpha1(DUP(d), DUP(alpha1(d)));
00155 }
00156 }
00157
00158
00159 for (ACoverage->reinit(); ACoverage->cont(); ++(*ACoverage))
00160 {
00161 CDart * d = **ACoverage;
00162
00163 if (isMarked(d, AMarkNumber))
00164 {
00165 if (A2Sew)
00166 if (!isFree2(d) && isMarked(alpha2(d), AMarkNumber) &&
00167 canSew2(DUP(d), DUP(alpha2(d))))
00168 topoSew2(DUP(d), DUP(alpha2(d)));
00169
00170 if (A3Sew)
00171 if (!isFree3(d) && isMarked(alpha3(d), AMarkNumber) &&
00172 canSew3(DUP(d), DUP(alpha3(d))))
00173 topoSew3(DUP(d), DUP(alpha3(d)));
00174 }
00175 }
00176 }
00177
00178 void CGMapGeneric::duplicateEmbeddingsOfDuplicatedDarts(CCoverage * ACoverage,
00179 int AMarkInitial,
00180 int AMarkDuplicated,
00181 int ADirectInfoIndex)
00182 {
00183 assert(ACoverage!=NULL);
00184 assert(AMarkInitial>=0);
00185 assert(AMarkDuplicated>=0);
00186 assert(ADirectInfoIndex>=0);
00187 assert(AMarkInitial!=AMarkDuplicated);
00188
00189 int treated = getNewMark();
00190
00191 for (int i=ORBIT_0; i<=ORBIT_0123; ++i)
00192 if (isOrbitUsed(TOrbit(i)))
00193 {
00194
00195 for (ACoverage->reinit(); ACoverage->cont(); ++(*ACoverage))
00196 {
00197 CDart * d = **ACoverage;
00198
00199 if (!isMarked(d, treated))
00200 {
00201 if (isMarked(d, AMarkInitial))
00202 {
00203 CDart * owner = getEmbeddingOwner(d, TOrbit(i));
00204
00205 if (owner!=NULL)
00206 {
00207 CEmbedding * E = owner->getEmbedding(TOrbit(i));
00208 assert(E!=NULL);
00209
00210 CCoverage * cov = getDynamicCoverage(d, TOrbit(i));
00211 assert(cov!=NULL);
00212
00213 for (; cov->cont(); setMark(**cov, treated), ++(*cov))
00214 if (isMarked(**cov, AMarkInitial) &&
00215 !isMarked(DUP(**cov), treated))
00216 {
00217 CEmbedding * dupE = E->copy();
00218 DUP(**cov)->addEmbedding(dupE);
00219
00220 markOrbit(DUP(**cov), TOrbit(i), treated);
00221 unmarkOrbit(DUP(**cov), TOrbit(i), AMarkDuplicated);
00222 }
00223
00224 delete cov;
00225 }
00226 }
00227 else
00228 if (!isMarked(d, AMarkDuplicated))
00229 setMark(d, treated);
00230 }
00231 }
00232
00233
00234 if (ACoverage->type() == COVERAGE_ALL)
00235 negateMaskMark(treated);
00236 else
00237 for (ACoverage->reinit(); ACoverage->cont(); ++(*ACoverage))
00238 {
00239 if (isMarked(**ACoverage, treated))
00240 unmarkOrbit(**ACoverage, TOrbit(i), treated);
00241
00242 if (isMarked(DUP(**ACoverage), treated))
00243 unmarkOrbit(DUP(**ACoverage), TOrbit(i), treated);
00244 }
00245 }
00246
00247 freeMark(treated);
00248 }
00249
00250 #undef DUP
00251