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 bool CGMapGeneric::canQuadrangulateFace(CDart * ADart,
00029 bool AInsertVertices )
00030 {
00031 int nb = getNbPolylineEdges(ADart);
00032 return (nb != 0) && (AInsertVertices || nb % 2 == 0);
00033 }
00034
00035 CDart * CGMapGeneric::quadrangulateFace(CDart * ADart, bool AInsertVertices)
00036 {
00037 assert(ADart!=NULL);
00038 assert(canQuadrangulateFace(ADart, AInsertVertices));
00039
00040 int treated = getNewMark();
00041
00042
00043 if (AInsertVertices)
00044 {
00045 for (CStaticCoverage01 cov(this, ADart); cov.cont(); ++cov)
00046 if (!isMarked(*cov, treated))
00047 {
00048 markOrbit(*cov, ORBIT_0, treated);
00049 negateMaskMark(treated);
00050 insertVertex(*cov);
00051 negateMaskMark(treated);
00052 }
00053
00054 unmarkOrbit(ADart, ORBIT_01, treated);
00055 }
00056
00057
00058 assert(canQuadrangulateFace(ADart, false));
00059
00060 CStaticCoverage01 cov(this, ADart);
00061 int toTreat = getNewMark();
00062
00063
00064 for (; cov.cont(); ++cov)
00065 {
00066 if (isMarked(*cov, toTreat))
00067 {
00068 if (!isFree1(*cov))
00069 setMark(alpha1(*cov), toTreat);
00070 }
00071 else
00072 {
00073 if (!isFree0(*cov))
00074 setMark(alpha0(*cov), toTreat);
00075 }
00076 }
00077
00078 for (cov.reinit(); cov.cont(); setMark(*cov, treated), ++cov)
00079 if (isMarked(*cov, toTreat))
00080 {
00081 CDart * n1 = addMapDart();
00082 CDart * n2 = addMapDart(); linkAlpha0(n1,n2);
00083
00084 CDart * nn1 = NULL, * nn2 = NULL, * d3;
00085
00086 if (isFree3(*cov))
00087 d3=NULL;
00088 else
00089 {
00090 d3=alpha3(*cov);
00091 nn1=addMapDart();
00092 nn2=addMapDart(); linkAlpha0(nn1,nn2);
00093 linkAlpha3(n1,nn1);
00094 linkAlpha3(n2,nn2);
00095 }
00096
00097 if (!isFree0(*cov) && !isFree1(alpha0(*cov)) &&
00098 !isFree0(alpha01(*cov)) && isMarked(alpha010(*cov), treated))
00099 {
00100 linkAlpha1(n2,alpha01010(*cov));
00101 if (d3!=NULL) linkAlpha1(nn2,alpha01010(d3));
00102 }
00103
00104 if (!isFree1(*cov) && isMarked(alpha1(*cov), treated))
00105 {
00106 topoSew2(n1,alpha1(alpha1(*cov)));
00107 if (d3!=NULL) topoSew2(nn1,alpha1(alpha1(d3)));
00108 }
00109
00110 linkAlpha1(*cov,n1);
00111 if (d3!=NULL) linkAlpha1(d3,nn1);
00112 }
00113
00114 for (cov.reinit(); cov.cont(); ++cov)
00115 {
00116 unsetMark(*cov, treated);
00117 unsetMark(*cov, toTreat);
00118 }
00119
00120 freeMark(treated);
00121 freeMark(toTreat);
00122
00123 if (isFree0(ADart))
00124 ADart = alpha1(ADart);
00125
00126 assert(checkTopology());
00127
00128 return alpha010(ADart);
00129 }
00130
00131 int CGMapGeneric::quadrangulateMarkedFaces(int AMarkNumber,
00132 bool AInsertVertices)
00133 {
00134 int nbQuadrangulated = 0;
00135
00136 int selected = getNewMark();
00137
00138
00139
00140 int treated = getNewMark();
00141 CDynamicCoverageAll it(this);
00142
00143 for (; it.cont(); ++it)
00144 if (!isMarked(*it, treated))
00145 {
00146 if (isMarked(*it, AMarkNumber))
00147 {
00148 if (canQuadrangulateFace(*it, AInsertVertices))
00149 setMark(*it, selected);
00150
00151 markOrbit(*it, ORBIT_FACE, treated);
00152 }
00153 else
00154 setMark(*it, treated);
00155 }
00156
00157 negateMaskMark(treated);
00158 freeMark(treated);
00159
00160
00161
00162 if (AInsertVertices)
00163 {
00164 int edges = getNewMark();
00165
00166 markIncidentCells(ORBIT_01, selected, edges);
00167
00168 insertVertexOnMarkedEdges(edges);
00169
00170 unmarkAll(edges);
00171 freeMark(edges);
00172 }
00173
00174
00175
00176 for (it.reinit(); it.cont(); ++it)
00177 if (isMarked(*it, selected))
00178 {
00179 quadrangulateFace(*it, false);
00180 ++nbQuadrangulated;
00181 unsetMark(*it, selected);
00182 }
00183
00184 freeMark(selected);
00185
00186 return nbQuadrangulated;
00187 }
00188