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
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "gmap-ops.hh"
00035 #include "definition.hh"
00036 #include "int-att.hh"
00037 #include "attribute-vertex.hh"
00038 #include "color-table-att.hh"
00039 #include <iostream>
00040 #include <fstream>
00041
00042 namespace GMap3d
00043 {
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 CVertex Calculate_Center(CGMap * G)
00055 {
00056 CVertex result, min, max;
00057
00058 bool first = true;
00059
00060
00061 int markVertex = G->getNewMark();
00062
00063
00064 CDynamicCoverageAll Cgm(G);
00065 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00066 {
00067 CDart* dgm = *Cgm;
00068
00069
00070 if (!G->isMarked(dgm, markVertex))
00071 {
00072
00073 CAttribute *alpha = G->getAttribute(dgm,ORBIT_123,VERTEX_ATTRIBUTE_ID);
00074 CVertex *p = (CAttributeVertex*)alpha;
00075
00076 if (first)
00077 {
00078 min = max = *p;
00079 first = false;
00080 }
00081 else
00082 {
00083 if (p->getX() > max.getX())
00084 max.setX(p->getX());
00085 else if (p->getX() < min.getX())
00086 min.setX(p->getX());
00087
00088 if (p->getY() > max.getY())
00089 max.setY(p->getY());
00090 else if (p->getY() < min.getY())
00091 min.setY(p->getY());
00092
00093 if (p->getZ() > max.getZ())
00094 max.setZ(p->getZ());
00095 else if (p->getZ() < min.getZ())
00096 min.setZ(p->getZ());
00097 }
00098
00099
00100 CCoverage* DCv = G->getDynamicCoverage(dgm, ORBIT_123);
00101 for (DCv->reinit();
00102 DCv->cont();
00103 (*DCv)++)
00104 G->setMark(**DCv, markVertex);
00105 delete DCv;
00106 }
00107 }
00108
00109
00110 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00111 G->unsetMark(*Cgm, markVertex);
00112 G->freeMark(markVertex);
00113
00114
00115 result.setX((min.getX()+max.getX())/2.0);
00116 result.setY((min.getY()+max.getY())/2.0);
00117 result.setZ((min.getZ()+max.getZ())/2.0);
00118
00119 return result;
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 void Init_Gmap(CGMap * G)
00133 {
00134 CDart *dgm, *d01;
00135
00136 bool isFace;
00137 int nbDarts;
00138
00139
00140 int markFace = G->getNewMark();
00141
00142
00143 if (Find_Attribute(G, ORBIT_0123, COLOR_TABLE_ATTRIBUTE_ID) == NULL)
00144 {
00145 G->addAttribute(G->getFirstDart(), ORBIT_0123,
00146 new Color_Table_Att(Color(1.0, 1.0, 0.0),
00147 Color(0.0, 0.0, 1.0),
00148 Color(0.0, 1.0, 0.0),
00149 Color(0.8, 0.8, 0.8)));
00150 }
00151
00152
00153 CDynamicCoverageAll Cgm(G);
00154 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00155 {
00156 dgm = *Cgm;
00157
00158
00159 if (!G->isMarked(dgm, markFace))
00160 {
00161
00162 if (G->isFree0(dgm))
00163 G->setMark(dgm, markFace);
00164
00165
00166 else
00167 {
00168
00169 if (G->getAttribute(dgm, ORBIT_013, INT_ATTRIBUTE_ID))
00170 {
00171
00172 CCoverage* DCf = G->getDynamicCoverage(dgm, ORBIT_01);
00173 for (DCf->reinit();
00174 DCf->cont();
00175 (*DCf)++)
00176 G->setMark(**DCf, markFace);
00177
00178 delete DCf;
00179 }
00180 else
00181 {
00182 isFace = true;
00183 nbDarts = 0;
00184
00185
00186 CCoverage* DCf = G->getDynamicCoverage(dgm, ORBIT_01);
00187 for (DCf->reinit();
00188 DCf->cont();
00189 (*DCf)++)
00190 {
00191 d01 = **DCf;
00192
00193
00194 if (!G->isMarked(d01, markFace))
00195 {
00196 nbDarts++;
00197 if (G->isFree1(d01))
00198 isFace = false;
00199 G->setMark(d01, markFace);
00200 }
00201 }
00202 delete DCf;
00203
00204 if (isFace)
00205
00206
00207 G->addAttribute(dgm, ORBIT_013, new Int_Att(nbDarts/2));
00208 }
00209
00210 }
00211 }
00212 }
00213
00214
00215 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00216 G->unsetMark(*Cgm, markFace);
00217 G->freeMark(markFace);
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 CAttribute * Find_Attribute(CGMap * G, TOrbit o, TAttributeId typeAttr)
00230 {
00231 CAttribute * alpha = NULL;
00232 CDart * dgm;
00233
00234
00235 int mark = G->getNewMark();
00236
00237
00238 CDynamicCoverageAll Cgm(G);
00239 for (Cgm.reinit();
00240 Cgm.cont() && (alpha == NULL);
00241 Cgm++)
00242 {
00243 dgm = *Cgm;
00244
00245
00246 if (!G->isMarked(dgm, mark))
00247 {
00248
00249 alpha = G->getAttribute(dgm, o, typeAttr);
00250
00251
00252 if (alpha == NULL)
00253 {
00254
00255 CCoverage* DC = G->getDynamicCoverage(dgm, o);
00256 for (DC->reinit();
00257 DC->cont();
00258 (*DC)++)
00259 G->setMark(**DC, mark);
00260 delete DC;
00261 }
00262 }
00263 }
00264
00265
00266 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00267 G->unsetMark(*Cgm, mark);
00268 G->freeMark(mark);
00269
00270 return alpha;
00271 }
00272
00273 }
00274