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 <deque>
00027 using namespace std;
00028 using namespace GMap3d;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 bool CGMapGeneric::canContract(CDart * ADart, int ADim)
00041 {
00042 assert(ADart!=NULL);
00043 assert(ADim>=1 && ADim<=3);
00044
00045 return isLocalDegreeTwoInf(ADart, ADim);
00046 }
00047
00048 void CGMapGeneric::contract(CDart * ADart, int ADim, bool ADeleteDarts)
00049 {
00050 assert(ADart!=NULL);
00051 assert(ADim>=1 && ADim<=3);
00052 assert(canContract(ADart, ADim));
00053
00054 int mark = getNewMark();
00055 markOrbit(ADart, ORBIT_CELL[ADim], mark);
00056
00057 CDart* current = NULL;
00058 CDart* t2 = NULL;
00059
00060 CCoverage * it = getStaticCoverage(ADart, ORBIT_CELL[ADim]);
00061 while ( it->cont() )
00062 {
00063 current = alpha((*it)++, ADim);
00064 if ( !isMarked(current, mark) )
00065 {
00066 t2 = alpha(current, ADim);
00067 while ( isMarked(t2, mark) )
00068 {
00069 t2 = alpha(alpha(t2, ADim-1), ADim);
00070 }
00071
00072 if ( t2 != alpha(current, ADim) )
00073 {
00074 unsew(current, ADim);
00075 if (!isFree(t2, ADim)) unsew(t2, ADim);
00076 if (current!=t2) sew(current, t2, ADim);
00077 }
00078 }
00079 }
00080
00081 if (ADeleteDarts)
00082 {
00083 for (it->reinit(); it->cont(); )
00084 delMapDart((*it)++);
00085 }
00086
00087 freeMark(mark);
00088
00089 delete it;
00090 }
00091
00092 int CGMapGeneric::contractMarkedCells( int AMarkNumber, int ADim,
00093 bool ADeleteDarts )
00094 {
00095 assert(ADim>=1 && ADim<=3);
00096
00097 int nbContract = markIncidentCells(ORBIT_CELL[ADim], AMarkNumber);
00098
00099 CDynamicCoverageAll cov(this);
00100 for ( ; cov.cont(); ++cov )
00101 {
00102 if ( isMarked(*cov, AMarkNumber) )
00103 {
00104 if ( !canContract(*cov, ADim) )
00105 {
00106 unmarkOrbit( *cov, ORBIT_CELL[ADim], AMarkNumber );
00107 --nbContract;
00108 }
00109 }
00110 }
00111
00112 CDart* current = NULL;
00113 CDart* t2 = NULL;
00114
00115 for ( cov.reinit(); cov.cont(); ++cov )
00116 {
00117 if ( !isMarked( *cov, AMarkNumber) &&
00118 isMarked( alpha(*cov, ADim), AMarkNumber) )
00119 {
00120 current = *cov;
00121 t2 = alpha(current, ADim);
00122
00123 while (isMarked(t2, AMarkNumber))
00124 {
00125 t2 = alpha(alpha(t2, ADim-1), ADim);
00126 }
00127
00128 if ( t2 != alpha(current, ADim) )
00129 {
00130 unsew(current, ADim);
00131 if ( !isFree(t2, ADim) ) unsew(t2, ADim);
00132 if ( t2!=current ) sew(current, t2, ADim);
00133 }
00134 }
00135 }
00136
00137 if (ADeleteDarts)
00138 {
00139 for (cov.reinit(); cov.cont(); )
00140 {
00141 if ( isMarked(*cov, AMarkNumber) )
00142 delMapDart(cov++);
00143 else
00144 ++cov;
00145 }
00146 }
00147
00148 return nbContract;
00149 }
00150