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 DUP1(D) (getDirectInfoAsDart(D, directInfoIndex1))
00029 #define DUP2(D) (getDirectInfoAsDart(D, directInfoIndex2))
00030
00031 int CGMapVertex::thickenMarkedDarts(int AMarkNumber, TCoordinate AExtrusionCoef)
00032 {
00033 int directInfoIndex1 = getNewDirectInfo();
00034 int directInfoIndex2 = getNewDirectInfo();
00035
00036
00037 int nbThickened =
00038 CGMapGeneric::thickenMarkedDarts(AMarkNumber,
00039 directInfoIndex1, directInfoIndex2);
00040
00041 if (nbThickened>0)
00042 {
00043
00044 CDynamicCoverageAll it(this);
00045 int treated = getNewMark();
00046 int exterior = getNewMark();
00047
00048
00049
00050 for (; it.cont(); ++it)
00051 if (!isMarked(*it, treated) && isMarked(*it, AMarkNumber))
00052 {
00053 if (!isMarked(DUP1(*it), treated))
00054 {
00055 halfMarkOrbit(DUP1(*it), ORBIT_CC, exterior);
00056 markOrbit(DUP1(*it), ORBIT_CC, treated);
00057 markCopy(exterior, 2);
00058 }
00059
00060 markOrbit(DUP2(*it), ORBIT_CC, treated);
00061 markOrbit( *it , ORBIT_CC, treated);
00062 setMark(*it, treated);
00063 }
00064
00065 negateMaskMark(treated);
00066
00067
00068 for (it.reinit(); it.cont(); ++it)
00069 if (isMarked(*it, AMarkNumber) && isMarked(DUP1(*it), exterior) &&
00070 !isMarked(DUP1(*it), treated))
00071 {
00072 * findVertex(DUP1(*it)) +=
00073 AExtrusionCoef * regionNormalVector(*it, 0);
00074
00075 markOrbit(DUP1(*it), ORBIT_VERTEX, treated);
00076 }
00077
00078
00079 for (it.reinit(); it.cont(); ++it)
00080 if (isMarked(*it, AMarkNumber) && isMarked(DUP1(*it), exterior) &&
00081 !isMarked(DUP2(*it), treated))
00082 {
00083 * findVertex(DUP2(*it)) -=
00084 AExtrusionCoef * regionNormalVector(*it, 0);
00085
00086 markOrbit(DUP2(*it), ORBIT_VERTEX, treated);
00087 }
00088
00089
00090 for (it.reinit(); it.cont(); ++it)
00091 if (isMarked(*it, AMarkNumber) && !isMarked(DUP1(*it), exterior) &&
00092 !isMarked(DUP1(*it), treated))
00093 {
00094 * findVertex(DUP1(*it)) +=
00095 AExtrusionCoef * regionNormalVector(*it, 0);
00096
00097 markOrbit(DUP1(*it), ORBIT_VERTEX, treated);
00098 }
00099
00100 for (it.reinit(); it.cont(); ++it)
00101 if (isMarked(*it, AMarkNumber) && !isMarked(DUP2(*it), exterior) &&
00102 !isMarked(DUP2(*it), treated))
00103 {
00104 * findVertex(DUP2(*it)) -=
00105 AExtrusionCoef * regionNormalVector(*it, 0);
00106
00107 markOrbit(DUP2(*it), ORBIT_VERTEX, treated);
00108 }
00109
00110 unmarkAll(exterior); freeMark(exterior);
00111 unmarkAll(treated ); freeMark(treated );
00112 }
00113
00114 freeDirectInfo(directInfoIndex1);
00115 freeDirectInfo(directInfoIndex2);
00116
00117 return nbThickened;
00118 }
00119
00120 #undef DUP1
00121 #undef DUP2
00122