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 CDart * CGMapGeneric::triangulateEdge(CDart * ADart)
00029 {
00030 assert(ADart!=NULL);
00031 insertVertex(ADart);
00032 return alpha0(ADart);
00033 }
00034
00035 CDart * CGMapGeneric::triangulateFace(CDart * ADart)
00036 {
00037 assert(ADart!=NULL);
00038
00039 int treated = getNewMark();
00040
00041 CStaticCoverage01 it(this, ADart);
00042
00043 for (; it.cont(); setMark(*it, treated), ++it)
00044 {
00045 CDart * n1 = addMapDart();
00046 CDart * n2 = addMapDart(); linkAlpha0(n1,n2);
00047
00048 CDart * nn1 = NULL, * nn2 = NULL, * d3;
00049
00050 if (isFree3(*it))
00051 d3=NULL;
00052 else
00053 {
00054 d3=alpha3(*it);
00055 nn1=addMapDart();
00056 nn2=addMapDart(); linkAlpha0(nn1,nn2);
00057 linkAlpha3(n1,nn1);
00058 linkAlpha3(n2,nn2);
00059 }
00060
00061 if (!isFree0(*it) && isMarked(alpha0(*it), treated))
00062 {
00063 linkAlpha1(n2,alpha010(*it));
00064 if (d3!=NULL) linkAlpha1(nn2,alpha010(d3));
00065 }
00066
00067 if (!isFree1(*it) && isMarked(alpha1(*it), treated))
00068 {
00069 topoSew2(n1,alpha1(alpha1(*it)));
00070 if (d3!=NULL) topoSew2(nn1,alpha1(alpha1(d3)));
00071 }
00072
00073 linkAlpha1(*it,n1);
00074 if (d3!=NULL) linkAlpha1(d3,nn1);
00075 }
00076
00077 for (it.reinit(); it.cont(); ++it)
00078 unsetMark(*it, treated);
00079
00080 freeMark(treated);
00081
00082 return alpha10(ADart);
00083 }
00084
00085 CDart * CGMapGeneric::triangulateVolume(CDart * ADart)
00086 {
00087 assert(ADart!=NULL);
00088
00089 int treated = getNewMark();
00090
00091 CStaticCoverage012 it(this, ADart);
00092
00093 for (; it.cont(); setMark(*it, treated), ++it)
00094 {
00095 CDart * n1= addMapDart();
00096 CDart * n2= addMapDart();
00097 CDart * d2= addMapDart();
00098
00099 linkAlpha0(n1,n2);
00100 linkAlpha1(d2,n1);
00101
00102 if (!isFree0(*it) && isMarked(alpha0(*it),treated))
00103 {
00104 linkAlpha0(d2,alpha02 (*it));
00105 linkAlpha1(n2,alpha0210(*it));
00106 }
00107
00108 if (!isFree1(*it) && isMarked(alpha1(*it),treated))
00109 {
00110 linkAlpha2(n1,alpha121 (*it));
00111 linkAlpha2(n2,alpha1210(*it));
00112 }
00113
00114 if (!isFree2(*it) && isMarked(alpha2(*it),treated))
00115 {
00116 linkAlpha3(n1,alpha21 (alpha2(*it)));
00117 linkAlpha3(n2,alpha210(alpha2(*it)));
00118 linkAlpha3(d2,alpha2 (alpha2(*it)));
00119 }
00120
00121 linkAlpha2(*it,d2);
00122 }
00123
00124 for (it.reinit(); it.cont(); ++it)
00125 unsetMark(*it, treated);
00126
00127 freeMark(treated);
00128
00129 return alpha210(ADart);
00130 }
00131
00132 CDart * CGMapGeneric::triangulate(CDart * ADart, int ADim)
00133 {
00134 assert(ADart!=NULL);
00135 assert(ADim>0 && ADim<=3);
00136
00137 switch (ADim)
00138 {
00139 case 1: return triangulateEdge(ADart);
00140 case 2: return triangulateFace(ADart);
00141 case 3: return triangulateVolume(ADart);
00142 }
00143
00144 return NULL;
00145 }
00146
00147 int CGMapGeneric::triangulateMarkedCells(int AMarkNumber, int ADim)
00148 {
00149 assert(ADim>=1 && ADim<=3);
00150
00151 int nbTriangulated = 0;
00152 int treated = getNewMark();
00153
00154 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00155 if (isMarked(*it, AMarkNumber) && !isMarked(*it, treated))
00156 {
00157 markOrbit(*it, ORBIT_CELL[ADim], treated);
00158 triangulate(*it, ADim);
00159 ++nbTriangulated;
00160 }
00161
00162 unmarkAll(treated);
00163 freeMark(treated);
00164
00165 return nbTriangulated;
00166 }
00167