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
00041
00042
00043
00044
00045 int CGMapGeneric::contractAndRemoveMarkedCells( int AMarkNumberC1,
00046 int AMarkNumberC2,
00047 int AMarkNumberC3,
00048 int AMarkNumberS0,
00049 int AMarkNumberS1,
00050 int AMarkNumberS2,
00051 bool ADeleteDarts )
00052 {
00053
00054 int marks[6];
00055
00056
00057
00058 int nbCellMarked = 0;
00059
00060 marks[0] = AMarkNumberC1;
00061 marks[1] = AMarkNumberC2;
00062 marks[2] = AMarkNumberC3;
00063 marks[3] = AMarkNumberS0;
00064 marks[4] = AMarkNumberS1;
00065 marks[5] = AMarkNumberS2;
00066
00067
00068 for(int i=0 ; i<=5; i++)
00069 {
00070 if (marks[i]!=-1)
00071 {
00072 nbCellMarked += markIncidentCells(ORBIT_CELL[(i+1)%4], marks[i]);
00073 }
00074 }
00075
00076
00077
00078 CDynamicCoverageAll cov(this);
00079 for ( ; cov.cont(); ++cov )
00080 {
00081 for(int i=0; i<=2; i++)
00082 {
00083 if (marks[i]!=-1)
00084 {
00085 if ( isMarked(*cov, marks[i]) )
00086 {
00087 int cell = i+1;
00088 if ( !canContract(*cov, cell) )
00089 {
00090 unmarkOrbit( *cov, ORBIT_CELL[cell], marks[i]);
00091 nbCellMarked--;
00092 }
00093 }
00094 }
00095 }
00096 for(int i=3; i<=5; i++)
00097 {
00098 if (marks[i]!= -1)
00099 {
00100 if ( isMarked(*cov, marks[i]) )
00101 {
00102 int cell = (i+1)%4;
00103 if ( !canRemove(*cov, cell) )
00104 {
00105 unmarkOrbit( *cov, ORBIT_CELL[cell], marks[i]);
00106 nbCellMarked--;
00107 }
00108 }
00109 }
00110 }
00111 }
00112
00113 int firstMark;
00114 int nbMark;
00115 int cell;
00116
00117
00118 for ( cov.reinit(); cov.cont(); ++cov )
00119 {
00120 firstMark = -1;
00121 nbMark = 0;
00122
00123 for(int i=0; i<=5; i++)
00124 {
00125 if( marks[i] != -1 )
00126 if ( isMarked(*cov, marks[i]) )
00127 {
00128 ++nbMark;
00129
00130 if ( firstMark==-1 ) firstMark = i;
00131 else
00132 {
00133 cell = (i+1)%4;
00134 unmarkOrbit( *cov, ORBIT_CELL[cell], marks[i]);
00135 nbCellMarked--;
00136 }
00137 }
00138 }
00139
00140 if ( nbMark>1 )
00141 {
00142 cell = (firstMark+1)%4;
00143 unmarkOrbit( *cov, ORBIT_CELL[cell], marks[firstMark]);
00144 }
00145 }
00146
00147
00148 CDart* current = NULL;
00149 CDart* t2 = NULL;
00150
00151 for ( cov.reinit(); cov.cont(); ++cov )
00152 {
00153 for(int i=0; i<=1; i++)
00154 {
00155 int cell = (i+1)%4;
00156 if (marks[i] != -1)
00157 {
00158 if ( !(isMarked( *cov, marks[i]) ||
00159 isMarked( *cov, marks[i+4]) ) &&
00160 (isMarked( alpha(*cov, cell), marks[i]) ||
00161 isMarked( alpha(*cov, cell), marks[i+4])) )
00162 {
00163 current = *cov;
00164 t2 = alpha(current, cell);
00165
00166 while (isMarked(t2, marks[i]) || isMarked(t2, marks[i+4]) )
00167 {
00168 if (isMarked(t2, marks[i]))
00169 t2 = alpha(alpha(t2, cell-1), cell);
00170 else
00171 t2 = alpha(alpha(t2, cell+1), cell);
00172 }
00173
00174 if ( t2 != alpha(current, cell) )
00175 {
00176 unsew(current, cell);
00177 if ( !isFree(t2, cell) ) unsew(t2, cell);
00178 if ( t2!=current ) sew(current, t2, cell);
00179 }
00180 }
00181 }
00182 }
00183 if (AMarkNumberC3 != -1)
00184 {
00185 if ( !isMarked( *cov, AMarkNumberC3) &&
00186 isMarked( alpha(*cov, 3), AMarkNumberC3) )
00187 {
00188 current = *cov;
00189 t2 = alpha(current, 3);
00190
00191 while (isMarked(t2, AMarkNumberC3))
00192 {
00193 t2 = alpha(alpha(t2, 2), 3);
00194 }
00195
00196 if ( t2 != alpha(current, 3) )
00197 {
00198 unsew(current, 3);
00199 if ( !isFree(t2, 3) ) unsew(t2, 3);
00200 if ( t2!=current ) sew(current, t2, 3);
00201 }
00202 }
00203 }
00204 if (AMarkNumberS0 != -1)
00205 {
00206 if ( !isMarked( *cov, AMarkNumberS0) &&
00207 isMarked( alpha(*cov, 0), AMarkNumberS0) )
00208 {
00209 current = *cov;
00210 t2 = alpha(current, 0);
00211
00212 while (isMarked(t2, AMarkNumberS0))
00213 {
00214 t2 = alpha(alpha(t2, 1), 0);
00215 }
00216
00217 if ( t2 != alpha(current, 0) )
00218 {
00219 unsew(current, 0);
00220 if ( !isFree(t2, 0) ) unsew(t2, 0);
00221 if ( t2!=current ) sew(current, t2, 0);
00222 }
00223 }
00224 }
00225 }
00226
00227
00228 if (ADeleteDarts)
00229 {
00230 for (cov.reinit(); cov.cont(); )
00231 {
00232 for (int i=0; i<=5; i++)
00233 {
00234 if(marks[i] != -1)
00235 {
00236 if ( isMarked(*cov, marks[i]) )
00237 {
00238 delMapDart(*cov);
00239 i=5;
00240 }
00241 }
00242 if (i==5) ++cov;
00243 }
00244 }
00245 }
00246 return nbCellMarked;
00247 }