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 void CGMapGeneric::stopUp(CDart * ADart, int ADim)
00029 {
00030 int treated= getNewMark();
00031
00032 CStaticBorderCoverage cov(this, ADart, ADim);
00033
00034 for (; cov.cont(); ++cov)
00035 {
00036 CDart * n = addMapDart();
00037 linkAlpha(*cov,n,ADim);
00038
00039 for (int i=0; i<=3; ++i)
00040 if ((i<ADim-1 || i>ADim+1) && isMarked(alpha(*cov,i), treated))
00041 linkAlpha(n, alpha(alpha(*cov,i),ADim), i);
00042
00043 if (ADim==0)
00044 linkAlpha0(n, *cov);
00045 else
00046 {
00047 CDart * tmp = alpha(*cov, ADim-1);
00048
00049 while (!isMarked(tmp,treated) &&
00050 !isFree(tmp,ADim) &&
00051 !isFree(alpha(tmp,ADim),ADim-1) &&
00052 tmp!=alpha(*cov,ADim))
00053 tmp = alpha(alpha(tmp,ADim),ADim-1);
00054
00055 if (isMarked(tmp,treated))
00056 linkAlpha(n,alpha(tmp,ADim),ADim-1);
00057 }
00058
00059 setMark(*cov,treated);
00060 }
00061
00062 for (cov.reinit(); cov.cont(); ++cov)
00063 unsetMark(*cov,treated);
00064
00065 freeMark(treated);
00066 }
00067
00068 int CGMapGeneric::stopUpMarkedBorders(int AMarkNumber, int ADim)
00069 {
00070 assert(ADim>=0 && ADim<=3);
00071 int nbStoppedUp = 0;
00072 CDynamicCoverageAll it(this);
00073
00074 for (; it.cont(); ++it)
00075 if (isMarked(*it,AMarkNumber) && getBorderDimension(*it)==ADim)
00076 {
00077 stopUp(*it,ADim);
00078 ++nbStoppedUp;
00079 }
00080
00081 return nbStoppedUp;
00082 }
00083
00084 int CGMapGeneric::intuitiveStopUpMarkedBorders(int AMarkNumber)
00085 {
00086 CDynamicCoverageAll it(this);
00087 int nbStoppedUp = 0;
00088 int treated = getNewMark();
00089 int memo = getNewMark();
00090
00091 for (int dim=0; dim<=3; ++dim)
00092 {
00093 for (it.reinit(); it.cont(); ++it)
00094 if (isMarked(*it,AMarkNumber) &&
00095 !isMarked(*it, treated) && isFree(*it, dim))
00096 {
00097 markOrbit(*it, ORBIT_INF [dim<3 ? dim+1 : 3], memo);
00098 markOrbit(*it, ORBIT_BORDER[dim], treated);
00099 stopUp(*it,dim);
00100 ++nbStoppedUp;
00101 }
00102
00103 markMove(memo, treated);
00104 }
00105
00106 freeMark(memo);
00107 unmarkAll(treated);
00108 freeMark(treated);
00109
00110 return nbStoppedUp;
00111 }
00112