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::getBorderDimension(CDart * ADart)
00029 {
00030 assert(ADart!=NULL);
00031
00032 if (isFree0(ADart)) return 0;
00033 if (isFree1(ADart)) return 1;
00034 if (isFree2(ADart)) return 2;
00035 if (isFree3(ADart)) return 3;
00036 return 4;
00037 }
00038
00039 bool CGMapGeneric::markBorders(int AMarkNumber, int ADim)
00040 {
00041 bool marked = false;
00042
00043 int selected= getNewMark();
00044 int treated = getNewMark();
00045
00046
00047 markCopy(AMarkNumber, selected);
00048
00049
00050 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00051 if (!isMarked(*it, treated))
00052 {
00053 if (isMarked(*it, selected) && isFree(*it, ADim))
00054 {
00055 for (CDynamicBorderCoverage cov(this, *it, ADim);
00056 cov.cont(); ++cov)
00057 {
00058 setMark(*cov, AMarkNumber);
00059 setMark(*cov, treated);
00060 }
00061
00062 marked = true;
00063 }
00064 else
00065 setMark(*it, treated);
00066 }
00067
00068
00069 negateMaskMark(treated);
00070 freeMark(treated);
00071
00072 unmarkAll(selected);
00073 freeMark(selected);
00074
00075 return marked;
00076 }
00077
00078 bool CGMapGeneric::markBorders(int AMarkNumber)
00079 {
00080 bool marked = false;
00081
00082 int selected= getNewMark();
00083 int treated = getNewMark();
00084
00085
00086 markCopy(AMarkNumber, selected);
00087
00088
00089 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00090 if (!isMarked(*it, treated))
00091 {
00092 if (isMarked(*it, selected))
00093 {
00094 int dim = getBorderDimension(*it);
00095
00096 if (dim<4)
00097 {
00098 for (CDynamicBorderCoverage cov(this, *it, dim);
00099 cov.cont(); ++cov)
00100 {
00101 setMark(*cov, AMarkNumber);
00102 setMark(*cov, treated);
00103 }
00104
00105 marked = true;
00106 }
00107 }
00108 else
00109 setMark(*it, treated);
00110 }
00111
00112
00113 negateMaskMark(treated);
00114 freeMark(treated);
00115
00116 unmarkAll(selected);
00117 freeMark(selected);
00118
00119 return marked;
00120 }
00121
00122 bool CGMapGeneric::canSewBorders(CDart * ADart1, CDart * ADart2,
00123 int ADim, int An)
00124 {
00125 assert(ADart1!=NULL);
00126 assert(ADart2!=NULL);
00127
00128 if (!isFree(ADart1, ADim) || !isFree(ADart2, ADim))
00129 return false;
00130
00131 CDynamicBorderCoverage it1(this, ADart1, ADim);
00132 CDynamicBorderCoverage it2(this, ADart2, ADim);
00133
00134 if (An==0)
00135 An=-1;
00136
00137 for (; it1.cont() && it2.cont() && An!=0; ++it1, ++it2, --An)
00138 if (it1.prevOperationType()!=it2.prevOperationType())
00139 return false;
00140
00141 return An==0 || (!it1.cont() && !it2.cont());
00142 }
00143
00144 void CGMapGeneric::borderTopoSew(CDart * ADart1, CDart * ADart2,
00145 int ADim, int An)
00146 {
00147 assert(canSewBorders(ADart1, ADart2, ADim, An));
00148
00149 if (An==0)
00150 An=-1;
00151
00152 CStaticBorderCoverage it1(this, ADart1, ADim);
00153 CStaticBorderCoverage it2(this, ADart2, ADim);
00154
00155 for (; it1.cont() && An!=0; ++it1, ++it2, --An)
00156 if (isFree(*it1, ADim) && isFree(*it2, ADim))
00157 topoSew(*it1, *it2, ADim);
00158 }
00159
00160 void CGMapGeneric::borderSew(CDart * ADart1, CDart * ADart2, int ADim, int An)
00161 {
00162 assert(canSewBorders(ADart1, ADart2, ADim, An));
00163
00164 if (An==0)
00165 An=-1;
00166
00167 CStaticBorderCoverage it1(this, ADart1, ADim);
00168 CStaticBorderCoverage it2(this, ADart2, ADim);
00169
00170 for (; it1.cont() && An!=0; ++it1, ++it2, --An)
00171 if (isFree(*it1, ADim) && isFree(*it2, ADim))
00172 sew(*it1, *it2, ADim);
00173 }
00174
00175 bool CGMapGeneric::intuitiveBorderSew(CDart * ADart1, CDart * ADart2, int An)
00176 {
00177 assert(ADart1!=NULL && ADart2!=NULL);
00178
00179 int dim = getBorderDimension(ADart1);
00180
00181 if (dim==4 || !canSewBorders(ADart1, ADart2, dim))
00182 return false;
00183
00184 borderSew(ADart1, ADart2, dim, An);
00185 return true;
00186 }
00187
00188 void CGMapGeneric::border2TopoSew(CDart * ADart1, CDart * ADart2, int An)
00189 {
00190 borderTopoSew(ADart1, ADart2, 2, 2*An);
00191 }
00192
00193 void CGMapGeneric::border2Sew(CDart * ADart1, CDart * ADart2, int An)
00194 {
00195 borderSew(ADart1, ADart2, 2, 2*An);
00196 }
00197