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 <GL/glut.h>
00035 #include "user.hh"
00036 #include "topologic-view.hh"
00037 #include "vertex.hh"
00038 #include "vector3d.hh"
00039 #include "attribute-vertex.hh"
00040
00041 using namespace GMap3d;
00042
00043
00044
00045
00046
00047 Topologic_View::Topologic_View(CGMap * GM)
00048 {
00049 G = GM;
00050 }
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 void Topologic_View::Create_Face_Darts_View(CDart * dgm, int markDart)
00065 {
00066 CAttribute * alpha;
00067 CDart * de;
00068 CVertex * p1, * p2, p3, p4;
00069 Vector3D v;
00070 int nbPoints = 0;
00071 CVertex center(0.0,0.0,0.0);
00072
00073
00074 int markCenter = G->getNewMark();
00075
00076
00077
00078 CCoverage* DCe = G->getDynamicCoverage(dgm, ORBIT_01);
00079 for (DCe->reinit(); DCe->cont(); (*DCe)++)
00080 {
00081 de = **DCe;
00082
00083 if (!G->isMarked(de, markCenter))
00084 {
00085
00086 alpha = G->getAttribute(de,ORBIT_123,VERTEX_ATTRIBUTE_ID);
00087 p2 = (CAttributeVertex*)alpha;
00088
00089
00090 center.setX(center.getX() + p2->getX());
00091 center.setY(center.getY() + p2->getY());
00092 center.setZ(center.getZ() + p2->getZ());
00093
00094 nbPoints++;
00095
00096
00097
00098 G->setMark(de, markCenter);
00099 if (!G->isFree1(de))
00100 G->setMark(G->alpha1(de), markCenter);
00101 }
00102 }
00103
00104
00105 center.setX(center.getX()/(float)nbPoints);
00106 center.setY(center.getY()/(float)nbPoints);
00107 center.setZ(center.getZ()/(float)nbPoints);
00108
00109
00110
00111 for (DCe->reinit();
00112 DCe->cont();
00113 (*DCe)++)
00114 {
00115 de = **DCe;
00116
00117
00118 G->unsetMark(de, markCenter);
00119
00120 if (!G->isMarked(de, markDart))
00121 {
00122
00123 alpha = G->getAttribute(de, ORBIT_123, VERTEX_ATTRIBUTE_ID);
00124 p1 = (CAttributeVertex*)alpha;
00125
00126
00127
00128 alpha = G->getAttribute(G->alpha0(de),ORBIT_123,VERTEX_ATTRIBUTE_ID);
00129 p2 = (CAttributeVertex*)alpha;
00130
00131
00132
00133 v.setXYZ(p2->getX()-p1->getX(),
00134 p2->getY()-p1->getY(),
00135 p2->getZ()-p1->getZ());
00136
00137
00138
00139 if (G->isFree1(de))
00140 p3 = *p1;
00141
00142
00143 else
00144 {
00145 p3.setXYZ(p1->getX() + v.getX()/10.0,
00146 p1->getY() + v.getY()/10.0,
00147 p1->getZ() + v.getZ()/10.0);
00148 }
00149
00150
00151
00152 if (G->isFree1(G->alpha0(de)))
00153 p4 = *p2;
00154
00155
00156
00157 else
00158 {
00159 p4.setXYZ(p2->getX() - v.getX()/10.0,
00160 p2->getY() - v.getY()/10.0,
00161 p2->getZ() - v.getZ()/10.0);
00162 }
00163
00164
00165
00166 if (!G->isFree2(de))
00167 {
00168
00169
00170 v.setXYZ(center.getX()-p3.getX(),
00171 center.getY()-p3.getY(),
00172 center.getZ()-p3.getZ());
00173 p3.setXYZ(p3.getX() + v.getX()/5.0,
00174 p3.getY() + v.getY()/5.0,
00175 p3.getZ() + v.getZ()/5.0);
00176
00177 v.setXYZ(center.getX()-p4.getX(),
00178 center.getY()-p4.getY(),
00179 center.getZ()-p4.getZ());
00180 p4.setXYZ(p4.getX() + v.getX()/5.0,
00181 p4.getY() + v.getY()/5.0,
00182 p4.getZ() + v.getZ()/5.0);
00183 }
00184
00185
00186 G->addAttribute(de,ORBIT_SELF,new CAttributeVertex(p3));
00187
00188
00189 G->setMark(de, markDart);
00190
00191
00192
00193 G->addAttribute(G->alpha0(de),ORBIT_SELF,
00194 new CAttributeVertex(p4));
00195
00196
00197
00198 G->setMark(G->alpha0(de), markDart);
00199 }
00200 }
00201 delete DCe;
00202
00203
00204 G->freeMark(markCenter);
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 void Topologic_View::Create_Volume_Darts_View(CDart * dgm, int markVolume)
00219 {
00220 CAttribute * alpha;
00221 CDart * de;
00222 CVertex * p1;
00223 Vector3D v;
00224 int nbPoints = 0;
00225 CVertex center(0.0,0.0,0.0);
00226
00227
00228 int markCenter = G->getNewMark();
00229
00230
00231
00232 CDynamicCoverageAll Cgm(G);
00233 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00234 {
00235 dgm = *Cgm;
00236
00237 if (!G->isMarked(dgm, markVolume))
00238 {
00239
00240 if (!G->isFree3(dgm))
00241 {
00242
00243 CCoverage* DCe = G->getDynamicCoverage(dgm, ORBIT_012);
00244 for (DCe->reinit();
00245 DCe->cont();
00246 (*DCe)++)
00247 {
00248 de = **DCe;
00249
00250 if (!G->isMarked(de, markCenter))
00251 {
00252
00253 alpha = G->getAttribute(de,ORBIT_123,VERTEX_ATTRIBUTE_ID);
00254 p1 = (CAttributeVertex*)alpha;
00255
00256
00257 center.setX(center.getX() + p1->getX());
00258 center.setY(center.getY() + p1->getY());
00259 center.setZ(center.getZ() + p1->getZ());
00260
00261 nbPoints++;
00262
00263
00264
00265 G->setMark(de, markCenter);
00266 if (!G->isFree1(de))
00267 G->setMark(G->alpha1(de), markCenter);
00268 }
00269 }
00270
00271
00272 center.setX(center.getX()/(float)nbPoints);
00273 center.setY(center.getY()/(float)nbPoints);
00274 center.setZ(center.getZ()/(float)nbPoints);
00275
00276
00277
00278 for (DCe->reinit();
00279 DCe->cont();
00280 (*DCe)++)
00281 {
00282 de = **DCe;
00283
00284
00285 G->unsetMark(G->alpha0(de), markCenter);
00286
00287 if (!G->isMarked(de, markVolume))
00288 {
00289
00290
00291 if (!G->isFree3(de))
00292 {
00293
00294 alpha = G->getAttribute(de, ORBIT_SELF,
00295 VERTEX_ATTRIBUTE_ID);
00296 p1 = (CAttributeVertex*)alpha;
00297
00298
00299
00300 v.setXYZ(center.getX()-p1->getX(),
00301 center.getY()-p1->getY(),
00302 center.getZ()-p1->getZ());
00303
00304 p1->setXYZ(p1->getX() + v.getX()/5.0,
00305 p1->getY() + v.getY()/5.0,
00306 p1->getZ() + v.getZ()/5.0);
00307 }
00308
00309
00310 G->setMark(de, markVolume);
00311 }
00312 }
00313 delete DCe;
00314 }
00315
00316
00317 else
00318 G->setMark(dgm, markVolume);
00319 }
00320 }
00321
00322
00323 G->freeMark(markCenter);
00324 }
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 void Topologic_View::Create_Darts_View()
00338 {
00339 CDart * dgm = NULL;
00340 CAttribute * alpha;
00341 CVertex * p1;
00342
00343
00344 int markDart = G->getNewMark();
00345 int markVolume = G->getNewMark();
00346
00347
00348
00349 CDynamicCoverageAll Cgm(G);
00350 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00351 {
00352 dgm = *Cgm;
00353
00354 if (!G->isMarked(dgm, markDart))
00355 {
00356
00357 if (G->isFree0(dgm))
00358 {
00359
00360 alpha = G->getAttribute(dgm, ORBIT_123, VERTEX_ATTRIBUTE_ID);
00361 p1 = (CAttributeVertex*)alpha;
00362
00363
00364 G->addAttribute(dgm, ORBIT_SELF, new CAttributeVertex(*p1));
00365
00366
00367
00368 G->setMark(dgm, markDart);
00369 }
00370
00371
00372
00373 else
00374
00375
00376 Create_Face_Darts_View(dgm, markDart);
00377 }
00378 }
00379
00380
00381 Create_Volume_Darts_View(dgm, markVolume);
00382
00383
00384
00385 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00386 {
00387 G->unsetMark(*Cgm, markDart);
00388 G->unsetMark(*Cgm, markVolume);
00389 }
00390 G->freeMark(markDart);
00391 G->freeMark(markVolume);
00392
00393
00394 }
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406 void Topologic_View::Darts_Draw()
00407 {
00408 CDart * dgm;
00409 CAttribute * alpha;
00410 CVertex * p;
00411
00412
00413 CDynamicCoverageAll Cgm(G);
00414 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00415 {
00416 dgm = *Cgm;
00417
00418
00419 alpha = G->getAttribute(dgm, ORBIT_SELF, VERTEX_ATTRIBUTE_ID);
00420 p =(CAttributeVertex*)alpha;
00421
00422
00423 glBegin(GL_POINTS);
00424
00425 glVertex3f(p->getX(), p->getY(), p->getZ());
00426 glEnd();
00427 }
00428
00429 }
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441 void Topologic_View::Alpha_Draw(int i)
00442 {
00443 CDart * dgm;
00444 CAttribute * alpha;
00445 CVertex * p,* p1;
00446
00447
00448 int markDart = G->getNewMark();
00449
00450
00451 CDynamicCoverageAll Cgm(G);
00452 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00453 {
00454 dgm = *Cgm;
00455
00456 if (!G->isMarked(dgm, markDart))
00457 {
00458
00459
00460 if (!G->isFree(dgm,i) &&
00461 !G->isMarked(G->alpha(dgm,i), markDart))
00462 {
00463
00464 alpha = G->getAttribute(dgm, ORBIT_SELF, VERTEX_ATTRIBUTE_ID);
00465 p =(CAttributeVertex*)alpha;
00466
00467
00468 alpha = G->getAttribute(G->alpha(dgm,i), ORBIT_SELF,
00469 VERTEX_ATTRIBUTE_ID);
00470 p1 = (CAttributeVertex*)alpha;
00471
00472
00473
00474 glBegin(GL_LINES);
00475 glVertex3f(p->getX(), p->getY(), p->getZ());
00476 glVertex3f(p1->getX(), p1->getY(), p1->getZ());
00477 glEnd();
00478
00479
00480 G->setMark(G->alpha(dgm,i), markDart);
00481 }
00482
00483
00484 G->setMark(dgm, markDart);
00485 }
00486 }
00487
00488
00489 for (Cgm.reinit(); Cgm.cont(); Cgm++)
00490 G->unsetMark(*Cgm, markDart);
00491 G->freeMark(markDart);
00492
00493 }