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 #include "geometry.hh"
00027 using namespace GMap3d;
00028
00029 int CGMapVertex::mergeMarkedColinearEdges(int AMarkNumber, bool ADeleteDarts)
00030 {
00031 return mergeMarkedAlignedCells(1, AMarkNumber, ADeleteDarts);
00032 }
00033
00034 int CGMapVertex::mergeMarkedCoplanarFaces(int AMarkNumber, bool ADeleteDarts)
00035 {
00036 return mergeMarkedAlignedCells(2, AMarkNumber, ADeleteDarts);
00037 }
00038
00039 int CGMapVertex::mergeMarkedAlignedCells(int ADim,
00040 int AMarkNumber, bool ADeleteDarts)
00041 {
00042 assert(ADim==1 || ADim==2);
00043
00044 CDynamicCoverageAll it(this);
00045
00046 int selected = getNewMark();
00047 int treated = getNewMark();
00048
00049
00050
00051
00052 markIncidentCells(ORBIT_CELL[ADim-1], AMarkNumber, selected);
00053
00054
00055
00056
00057 for (it.reinit(); it.cont(); ++it)
00058 if (!isMarked(*it, treated))
00059 {
00060 if (isMarked(*it, selected))
00061 {
00062 bool possible =
00063 !isFree(*it, ADim) && canMerge(*it, alpha(*it,ADim), ADim);
00064
00065 if (possible)
00066 {
00067 CDart * side1 = *it;
00068 CDart * side2 = alpha(*it,ADim);
00069
00070 CVertex vector1 =
00071 ADim==1 ? edgeVector(side1) : faceNormalVector(side1);
00072
00073 CVertex vector2 =
00074 ADim==1 ? edgeVector(side2) : faceNormalVector(side2);
00075
00076 possible = CGeometry::areColinear(vector1, vector2);
00077 }
00078
00079 if (!possible)
00080 unmarkOrbit(*it, ORBIT_CELL[ADim-1], selected);
00081
00082 markOrbit(*it, ORBIT_CELL[ADim-1], treated);
00083 }
00084 else
00085 setMark(*it, treated);
00086 }
00087
00088 negateMaskMark(treated);
00089
00090
00091 int nbMerged = isolateMarkedCells(selected, ADim-1, ADeleteDarts, false);
00092
00093 freeMark(treated);
00094
00095 unmarkAll(selected);
00096 freeMark(selected);
00097
00098 return nbMerged;
00099 }
00100