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 <stack>
00027 using namespace GMap3d;
00028 using namespace std;
00029
00030 int CGMapGeneric::deleteFlatFaces()
00031 {
00032 int mark = getNewMark();
00033 negateMaskMark(mark);
00034 int nb = deleteMarkedFlatFaces(mark);
00035 negateMaskMark(mark);
00036 freeMark(mark);
00037 return nb;
00038 }
00039
00040 int CGMapGeneric::deleteMarkedFlatFaces(int AMarkNumber)
00041 {
00042 return contractMarkedCells(AMarkNumber, 2, true);
00043 }
00044
00045 int CGMapGeneric::deleteFlatVolumes()
00046 {
00047 int mark = getNewMark();
00048 negateMaskMark(mark);
00049 int nb = deleteMarkedFlatVolumes(mark);
00050 negateMaskMark(mark);
00051 freeMark(mark);
00052 return nb;
00053 }
00054
00055 int CGMapGeneric::deleteMarkedFlatVolumes(int AMarkNumber)
00056 {
00057 return contractMarkedCells(AMarkNumber, 3, true);
00058 }
00059
00060 int CGMapGeneric::removeMarkedDanglingEdges(int AMarkNumber)
00061 {
00062 int toDelete = getNewMark();
00063 int nb = 0;
00064 std::stack<CDart*> FToTreat;
00065 CDart* current = NULL;
00066
00067 markIncidentCells(ORBIT_EDGE, AMarkNumber);
00068
00069 CDynamicCoverageAll it(this);
00070 while (it.cont())
00071 {
00072 while (! FToTreat.empty())
00073 {
00074 current = FToTreat.top();
00075 FToTreat.pop();
00076
00077 if (isMarked(current, AMarkNumber) && !isMarked(current, toDelete))
00078 {
00079 if (alpha12(current) == alpha21(current))
00080 FToTreat.push(alpha1(current));
00081
00082 if (alpha012(current) == alpha021(current))
00083 FToTreat.push(alpha01(current));
00084
00085 remove(current, 1, false);
00086 markOrbit(current, ORBIT_EDGE, toDelete);
00087 ++nb;
00088 }
00089 }
00090
00091 if (isMarked(*it, AMarkNumber) && !isMarked(*it, toDelete) &&
00092 alpha1(*it) == alpha2(*it))
00093 {
00094 if (alpha12(*it) == alpha21(*it))
00095 FToTreat.push(alpha1(*it));
00096
00097 if (alpha012(*it) == alpha021(*it))
00098 FToTreat.push(alpha01(*it));
00099
00100 remove(*it, 1, false);
00101 markOrbit(*it, ORBIT_EDGE, toDelete);
00102 ++nb;
00103 }
00104
00105 ++it;
00106 }
00107
00108 for (it.reinit(); it.cont();)
00109 {
00110 if (isMarked(*it, toDelete))
00111 delMapDart(it++);
00112 else
00113 ++it;
00114 }
00115
00116 freeMark(toDelete);
00117 return nb;
00118 }
00119
00120 int CGMapGeneric::removeDanglingEdges()
00121 {
00122 int mark = getNewMark();
00123 negateMaskMark(mark);
00124 int nb = removeMarkedDanglingEdges(mark);
00125 negateMaskMark(mark);
00126 freeMark(mark);
00127 return nb;
00128 }
00129