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 #define DUP1(D) (getDirectInfoAsDart(D, ADirectInfoIndex1))
00029 #define DUP2(D) (getDirectInfoAsDart(D, ADirectInfoIndex2))
00030
00031 int CGMapGeneric::thickenMarkedDarts(int AMarkNumber,
00032 int ADirectInfoIndex1,
00033 int ADirectInfoIndex2)
00034 {
00035 int nbThickened = 0;
00036 int dup = getNewMark();
00037
00038 CDynamicCoverageAll it(this);
00039
00040
00041 for (; it.cont(); ++it)
00042 if (isMarked(*it, AMarkNumber))
00043 {
00044 CDart * newDart;
00045
00046 newDart = addMapDart();
00047 setMark(newDart, dup);
00048 (*it)->setDirectInfo(ADirectInfoIndex1, newDart);
00049
00050 newDart->setDirectInfo(ADirectInfoIndex1, *it);
00051 newDart->setDirectInfo(ADirectInfoIndex2, NULL);
00052
00053 newDart = addMapDart();
00054 setMark(newDart, dup);
00055 (*it)->setDirectInfo(ADirectInfoIndex2, newDart);
00056
00057 newDart->setDirectInfo(ADirectInfoIndex1, NULL);
00058 newDart->setDirectInfo(ADirectInfoIndex2, *it);
00059
00060 ++nbThickened;
00061 }
00062
00063
00064 for (it.reinit(); it.cont(); ++it)
00065 if (isMarked(*it, AMarkNumber))
00066 {
00067 if (!isFree0(*it) && isMarked(alpha0(*it), AMarkNumber))
00068 linkAlpha0(DUP1(*it), DUP2(alpha0(*it)));
00069
00070 if (!isFree1(*it) && isMarked(alpha1(*it), AMarkNumber))
00071 linkAlpha1(DUP1(*it), DUP2(alpha1(*it)));
00072 }
00073
00074 for (it.reinit(); it.cont(); ++it)
00075 if (isMarked(*it, AMarkNumber))
00076 {
00077 if (!isFree2(*it) && isMarked(alpha2(*it), AMarkNumber) &&
00078 canSew2(DUP1(*it), DUP2(alpha2(*it))))
00079 topoSew2(DUP1(*it), DUP2(alpha2(*it)));
00080
00081 if (!isFree3(*it) && isMarked(alpha3(*it), AMarkNumber) &&
00082 canSew3(DUP1(*it), DUP2(alpha3(*it))))
00083 topoSew3(DUP1(*it), DUP2(alpha3(*it)));
00084 }
00085
00086
00087 int treated = getNewMark();
00088
00089 for (int i=ORBIT_0; i<=ORBIT_0123; ++i)
00090 if (isOrbitUsed(TOrbit(i)))
00091 {
00092
00093 for (it.reinit(); it.cont(); ++it)
00094 if (!isMarked(*it, treated))
00095 {
00096 if (isMarked(*it, AMarkNumber))
00097 {
00098 CDart * owner = getEmbeddingOwner(*it, TOrbit(i));
00099 assert(owner!=NULL);
00100
00101 CEmbedding * E = owner->getEmbedding(TOrbit(i));
00102 assert(E!=NULL);
00103
00104 CCoverage * cov = getDynamicCoverage(*it, TOrbit(i));
00105 assert(cov!=NULL);
00106
00107 for (; cov->cont(); setMark(**cov, treated), ++(*cov))
00108 if (isMarked(**cov, AMarkNumber))
00109 {
00110 if (!isMarked(DUP1(**cov), treated))
00111 {
00112 DUP1(**cov)->addEmbedding(E->copy());
00113 markOrbit(DUP1(**cov), TOrbit(i), treated);
00114 unmarkOrbit(DUP1(**cov), TOrbit(i), dup);
00115 }
00116
00117 if (!isMarked(DUP2(**cov), treated))
00118 {
00119 DUP2(**cov)->addEmbedding(E->copy());
00120 markOrbit(DUP2(**cov), TOrbit(i), treated);
00121 unmarkOrbit(DUP2(**cov), TOrbit(i), dup);
00122 }
00123 }
00124
00125 delete cov;
00126 }
00127 else
00128 if (!isMarked(*it, dup))
00129 setMark(*it, treated);
00130 }
00131
00132
00133 negateMaskMark(treated);
00134 }
00135
00136 freeMark(treated);
00137 freeMark(dup);
00138
00139 return nbThickened;
00140 }
00141
00142 #undef DUP1
00143 #undef DUP2
00144