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-vertex.hh"
00026 using namespace GMap3d;
00027
00028 #define DUP(D) (getDirectInfoAsDart(D, directInfoIndex))
00029
00030 int CGMapVertex::dualOfMarkedDarts(int ADim, int AMarkNumber)
00031 {
00032 assert((2 <= ADim) && (ADim <= 3));
00033
00034 int directInfoIndex = getNewDirectInfo();
00035 int treated = getNewMark();
00036
00037
00038 duplicateMarkedDarts(AMarkNumber, directInfoIndex, false,
00039 ADim>=0, ADim>=1, ADim>=2, ADim>=3);
00040
00041
00042 int nbDuplicated = 0;
00043 int middle = (ADim-1)/2;
00044
00045 CDynamicCoverageAll it(this);
00046
00047 for (; it.cont(); ++it)
00048 if (!isMarked(*it, treated))
00049 {
00050 setMark(*it, treated);
00051
00052 if (isMarked(*it, AMarkNumber))
00053 {
00054 CDart * dup = DUP(*it);
00055
00056 ++nbDuplicated;
00057
00058 setDirectInfo(dup, directInfoIndex, *it);
00059
00060 for (int dim = 0; dim <= middle; ++dim)
00061 {
00062
00063 CDart * tmp = alpha(dup, dim);
00064 dup->setAlpha(alpha(dup, ADim-dim), dim);
00065 dup->setAlpha(tmp, ADim-dim);
00066 }
00067 }
00068 }
00069
00070 negateMaskMark(treated);
00071
00072
00073 for (it.reinit(); it.cont(); ++it)
00074 if (!isMarked(*it, treated))
00075 {
00076 if (isMarked(*it, AMarkNumber))
00077 {
00078
00079 setVertex(DUP(*it), barycenter(*it, ORBIT_CELL[ADim]));
00080
00081 for (CDynamicCoverageVertex vertex(this, DUP(*it));
00082 vertex.cont(); ++vertex)
00083 setMark(DUP(*vertex), treated);
00084 }
00085 else
00086 setMark(*it, treated);
00087 }
00088
00089 negateMaskMark(treated);
00090
00091
00092 freeDirectInfo(directInfoIndex);
00093 freeMark (treated);
00094
00095 return nbDuplicated;
00096 }
00097
00098 #undef DUP
00099