Changes in src/tesselation.cpp [e359a8:125b3c]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tesselation.cpp
re359a8 r125b3c 9 9 10 10 #include "helpers.hpp" 11 #include "info.hpp" 11 12 #include "linkedcell.hpp" 12 13 #include "log.hpp" … … 22 23 /** Constructor of BoundaryPointSet. 23 24 */ 24 BoundaryPointSet::BoundaryPointSet() 25 { 26 LinesCount = 0; 27 Nr = -1; 28 value = 0.; 25 BoundaryPointSet::BoundaryPointSet() : 26 LinesCount(0), 27 value(0.), 28 Nr(-1) 29 { 30 Info FunctionInfo(__func__); 31 Log() << Verbose(1) << "Adding noname." << endl; 29 32 }; 30 33 … … 32 35 * \param *Walker TesselPoint this boundary point represents 33 36 */ 34 BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker) 35 { 36 node = Walker; 37 LinesCount = 0; 38 Nr = Walker->nr; 39 value = 0.; 37 BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker) : 38 LinesCount(0), 39 node(Walker), 40 value(0.), 41 Nr(Walker->nr) 42 { 43 Info FunctionInfo(__func__); 44 Log() << Verbose(1) << "Adding Node " << *Walker << endl; 40 45 }; 41 46 … … 46 51 BoundaryPointSet::~BoundaryPointSet() 47 52 { 48 //Log() << Verbose(5) << "Erasing point nr. " << Nr << "." << endl; 53 Info FunctionInfo(__func__); 54 //Log() << Verbose(0) << "Erasing point nr. " << Nr << "." << endl; 49 55 if (!lines.empty()) 50 56 eLog() << Verbose(2) << "Memory Leak! I " << *this << " am still connected to some lines." << endl; … … 57 63 void BoundaryPointSet::AddLine(class BoundaryLineSet *line) 58 64 { 59 Log() << Verbose(6) << "Adding " << *this << " to line " << *line << "." 65 Info FunctionInfo(__func__); 66 Log() << Verbose(1) << "Adding " << *this << " to line " << *line << "." 60 67 << endl; 61 68 if (line->endpoints[0] == this) … … 85 92 /** Constructor of BoundaryLineSet. 86 93 */ 87 BoundaryLineSet::BoundaryLineSet() 88 { 94 BoundaryLineSet::BoundaryLineSet() : 95 Nr(-1) 96 { 97 Info FunctionInfo(__func__); 89 98 for (int i = 0; i < 2; i++) 90 99 endpoints[i] = NULL; 91 Nr = -1;92 100 }; 93 101 … … 99 107 BoundaryLineSet::BoundaryLineSet(class BoundaryPointSet *Point[2], const int number) 100 108 { 109 Info FunctionInfo(__func__); 101 110 // set number 102 111 Nr = number; … … 106 115 Point[0]->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 107 116 Point[1]->AddLine(this); // 117 // set skipped to false 118 skipped = false; 108 119 // clear triangles list 109 Log() << Verbose( 5) << "New Line with endpoints " << *this << "." << endl;120 Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl; 110 121 }; 111 122 … … 116 127 BoundaryLineSet::~BoundaryLineSet() 117 128 { 129 Info FunctionInfo(__func__); 118 130 int Numbers[2]; 119 131 … … 134 146 for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++) 135 147 if ((*Runner).second == this) { 136 //Log() << Verbose( 5) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;148 //Log() << Verbose(0) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl; 137 149 endpoints[i]->lines.erase(Runner); 138 150 break; … … 140 152 } else { // there's just a single line left 141 153 if (endpoints[i]->lines.erase(Nr)) { 142 //Log() << Verbose( 5) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl;154 //Log() << Verbose(0) << "Removing Line Nr. " << Nr << " in boundary point " << *endpoints[i] << "." << endl; 143 155 } 144 156 } 145 157 if (endpoints[i]->lines.empty()) { 146 //Log() << Verbose( 5) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl;158 //Log() << Verbose(0) << *endpoints[i] << " has no more lines it's attached to, erasing." << endl; 147 159 if (endpoints[i] != NULL) { 148 160 delete(endpoints[i]); … … 161 173 void BoundaryLineSet::AddTriangle(class BoundaryTriangleSet *triangle) 162 174 { 163 Log() << Verbose(6) << "Add " << triangle->Nr << " to line " << *this << "." << endl; 175 Info FunctionInfo(__func__); 176 Log() << Verbose(0) << "Add " << triangle->Nr << " to line " << *this << "." << endl; 164 177 triangles.insert(TrianglePair(triangle->Nr, triangle)); 165 178 }; … … 171 184 bool BoundaryLineSet::IsConnectedTo(class BoundaryLineSet *line) 172 185 { 186 Info FunctionInfo(__func__); 173 187 if ((endpoints[0] == line->endpoints[0]) || (endpoints[1] == line->endpoints[0]) || (endpoints[0] == line->endpoints[1]) || (endpoints[1] == line->endpoints[1])) 174 188 return true; … … 185 199 bool BoundaryLineSet::CheckConvexityCriterion() 186 200 { 201 Info FunctionInfo(__func__); 187 202 Vector BaseLineCenter, BaseLineNormal, BaseLine, helper[2], NormalCheck; 188 203 // get the two triangles 189 204 if (triangles.size() != 2) { 190 eLog() << Verbose( 1) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl;205 eLog() << Verbose(0) << "Baseline " << *this << " is connected to less than two triangles, Tesselation incomplete!" << endl; 191 206 return true; 192 207 } 193 208 // check normal vectors 194 209 // have a normal vector on the base line pointing outwards 195 //Log() << Verbose( 3) << "INFO: " << *this << " has vectors at " << *(endpoints[0]->node->node) << " and at " << *(endpoints[1]->node->node) << "." << endl;210 //Log() << Verbose(0) << "INFO: " << *this << " has vectors at " << *(endpoints[0]->node->node) << " and at " << *(endpoints[1]->node->node) << "." << endl; 196 211 BaseLineCenter.CopyVector(endpoints[0]->node->node); 197 212 BaseLineCenter.AddVector(endpoints[1]->node->node); … … 199 214 BaseLine.CopyVector(endpoints[0]->node->node); 200 215 BaseLine.SubtractVector(endpoints[1]->node->node); 201 //Log() << Verbose( 3) << "INFO: Baseline is " << BaseLine << " and its center is at " << BaseLineCenter << "." << endl;216 //Log() << Verbose(0) << "INFO: Baseline is " << BaseLine << " and its center is at " << BaseLineCenter << "." << endl; 202 217 203 218 BaseLineNormal.Zero(); … … 207 222 class BoundaryPointSet *node = NULL; 208 223 for(TriangleMap::iterator runner = triangles.begin(); runner != triangles.end(); runner++) { 209 //Log() << Verbose( 3) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl;224 //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl; 210 225 NormalCheck.AddVector(&runner->second->NormalVector); 211 226 NormalCheck.Scale(sign); … … 214 229 BaseLineNormal.CopyVector(&runner->second->NormalVector); // yes, copy second on top of first 215 230 else { 216 Log() << Verbose(1) << "CRITICAL: Triangle " << *runner->second << " has zero normal vector!" << endl; 217 exit(255); 231 eLog() << Verbose(0) << "Triangle " << *runner->second << " has zero normal vector!" << endl; 218 232 } 219 233 node = runner->second->GetThirdEndpoint(this); 220 234 if (node != NULL) { 221 //Log() << Verbose( 3) << "INFO: Third node for triangle " << *(runner->second) << " is " << *node << " at " << *(node->node->node) << "." << endl;235 //Log() << Verbose(0) << "INFO: Third node for triangle " << *(runner->second) << " is " << *node << " at " << *(node->node->node) << "." << endl; 222 236 helper[i].CopyVector(node->node->node); 223 237 helper[i].SubtractVector(&BaseLineCenter); 224 238 helper[i].MakeNormalVector(&BaseLine); // we want to compare the triangle's heights' angles! 225 //Log() << Verbose( 4) << "INFO: Height vector with respect to baseline is " << helper[i] << "." << endl;239 //Log() << Verbose(0) << "INFO: Height vector with respect to baseline is " << helper[i] << "." << endl; 226 240 i++; 227 241 } else { 228 //eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl;242 eLog() << Verbose(1) << "I cannot find third node in triangle, something's wrong." << endl; 229 243 return true; 230 244 } 231 245 } 232 //Log() << Verbose( 3) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl;246 //Log() << Verbose(0) << "INFO: BaselineNormal is " << BaseLineNormal << "." << endl; 233 247 if (NormalCheck.NormSquared() < MYEPSILON) { 234 Log() << Verbose( 3) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl;248 Log() << Verbose(0) << "ACCEPT: Normalvectors of both triangles are the same: convex." << endl; 235 249 return true; 236 250 } … … 238 252 double angle = GetAngle(helper[0], helper[1], BaseLineNormal); 239 253 if ((angle - M_PI) > -MYEPSILON) { 240 Log() << Verbose( 3) << "ACCEPT: Angle is greater than pi: convex." << endl;254 Log() << Verbose(0) << "ACCEPT: Angle is greater than pi: convex." << endl; 241 255 return true; 242 256 } else { 243 Log() << Verbose( 3) << "REJECT: Angle is less than pi: concave." << endl;257 Log() << Verbose(0) << "REJECT: Angle is less than pi: concave." << endl; 244 258 return false; 245 259 } … … 252 266 bool BoundaryLineSet::ContainsBoundaryPoint(class BoundaryPointSet *point) 253 267 { 268 Info FunctionInfo(__func__); 254 269 for(int i=0;i<2;i++) 255 270 if (point == endpoints[i]) … … 264 279 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(class BoundaryPointSet *point) 265 280 { 281 Info FunctionInfo(__func__); 266 282 if (endpoints[0] == point) 267 283 return endpoints[1]; … … 286 302 /** Constructor for BoundaryTriangleSet. 287 303 */ 288 BoundaryTriangleSet::BoundaryTriangleSet() 289 { 304 BoundaryTriangleSet::BoundaryTriangleSet() : 305 Nr(-1) 306 { 307 Info FunctionInfo(__func__); 290 308 for (int i = 0; i < 3; i++) 291 309 { … … 293 311 lines[i] = NULL; 294 312 } 295 Nr = -1;296 313 }; 297 314 … … 300 317 * \param number number of triangle 301 318 */ 302 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number) 303 { 319 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet *line[3], int number) : 320 Nr(number) 321 { 322 Info FunctionInfo(__func__); 304 323 // set number 305 Nr = number;306 324 // set lines 307 Log() << Verbose(5) << "New triangle " << Nr << ":" << endl; 308 for (int i = 0; i < 3; i++) 309 { 310 lines[i] = line[i]; 311 lines[i]->AddTriangle(this); 312 } 325 for (int i = 0; i < 3; i++) { 326 lines[i] = line[i]; 327 lines[i]->AddTriangle(this); 328 } 313 329 // get ascending order of endpoints 314 map<int, class BoundaryPointSet *>OrderMap;330 PointMap OrderMap; 315 331 for (int i = 0; i < 3; i++) 316 332 // for all three lines 317 for (int j = 0; j < 2; j++) 318 { // for both endpoints 319 OrderMap.insert(pair<int, class BoundaryPointSet *> ( 320 line[i]->endpoints[j]->Nr, line[i]->endpoints[j])); 321 // and we don't care whether insertion fails 322 } 333 for (int j = 0; j < 2; j++) { // for both endpoints 334 OrderMap.insert(pair<int, class BoundaryPointSet *> ( 335 line[i]->endpoints[j]->Nr, line[i]->endpoints[j])); 336 // and we don't care whether insertion fails 337 } 323 338 // set endpoints 324 339 int Counter = 0; 325 Log() << Verbose(6) << " with end points "; 326 for (map<int, class BoundaryPointSet *>::iterator runner = OrderMap.begin(); runner 327 != OrderMap.end(); runner++) 328 { 329 endpoints[Counter] = runner->second; 330 Log() << Verbose(0) << " " << *endpoints[Counter]; 331 Counter++; 332 } 333 if (Counter < 3) 334 { 335 eLog() << Verbose(0) << "ERROR! We have a triangle with only two distinct endpoints!" << endl; 336 performCriticalExit(); 337 } 338 Log() << Verbose(0) << "." << endl; 340 Log() << Verbose(0) << "New triangle " << Nr << " with end points: " << endl; 341 for (PointMap::iterator runner = OrderMap.begin(); runner != OrderMap.end(); runner++) { 342 endpoints[Counter] = runner->second; 343 Log() << Verbose(0) << " " << *endpoints[Counter] << endl; 344 Counter++; 345 } 346 if (Counter < 3) { 347 eLog() << Verbose(0) << "We have a triangle with only two distinct endpoints!" << endl; 348 performCriticalExit(); 349 } 339 350 }; 340 351 … … 345 356 BoundaryTriangleSet::~BoundaryTriangleSet() 346 357 { 358 Info FunctionInfo(__func__); 347 359 for (int i = 0; i < 3; i++) { 348 360 if (lines[i] != NULL) { 349 361 if (lines[i]->triangles.erase(Nr)) { 350 //Log() << Verbose( 5) << "Triangle Nr." << Nr << " erased in line " << *lines[i] << "." << endl;362 //Log() << Verbose(0) << "Triangle Nr." << Nr << " erased in line " << *lines[i] << "." << endl; 351 363 } 352 364 if (lines[i]->triangles.empty()) { 353 //Log() << Verbose( 5) << *lines[i] << " is no more attached to any triangle, erasing." << endl;365 //Log() << Verbose(0) << *lines[i] << " is no more attached to any triangle, erasing." << endl; 354 366 delete (lines[i]); 355 367 lines[i] = NULL; … … 357 369 } 358 370 } 359 //Log() << Verbose( 5) << "Erasing triangle Nr." << Nr << " itself." << endl;371 //Log() << Verbose(0) << "Erasing triangle Nr." << Nr << " itself." << endl; 360 372 }; 361 373 … … 366 378 void BoundaryTriangleSet::GetNormalVector(Vector &OtherVector) 367 379 { 380 Info FunctionInfo(__func__); 368 381 // get normal vector 369 382 NormalVector.MakeNormalVector(endpoints[0]->node->node, endpoints[1]->node->node, endpoints[2]->node->node); … … 372 385 if (NormalVector.ScalarProduct(&OtherVector) > 0.) 373 386 NormalVector.Scale(-1.); 387 Log() << Verbose(1) << "Normal Vector is " << NormalVector << "." << endl; 374 388 }; 375 389 … … 388 402 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection) 389 403 { 404 Info FunctionInfo(__func__); 390 405 Vector CrossPoint; 391 406 Vector helper; 392 407 393 408 if (!Intersection->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, MolCenter, x)) { 394 Log() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl;409 eLog() << Verbose(1) << "Alas! Intersection with plane failed - at least numerically - the intersection is not on the plane!" << endl; 395 410 return false; 396 411 } … … 408 423 } while (CrossPoint.NormSquared() < MYEPSILON); 409 424 if (i==3) { 410 eLog() << Verbose(1) << "Could not find any cross points, something's utterly wrong here!" << endl; 411 exit(255); 425 eLog() << Verbose(0) << "Could not find any cross points, something's utterly wrong here!" << endl; 412 426 } 413 427 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector … … 428 442 bool BoundaryTriangleSet::ContainsBoundaryLine(class BoundaryLineSet *line) 429 443 { 444 Info FunctionInfo(__func__); 430 445 for(int i=0;i<3;i++) 431 446 if (line == lines[i]) … … 440 455 bool BoundaryTriangleSet::ContainsBoundaryPoint(class BoundaryPointSet *point) 441 456 { 457 Info FunctionInfo(__func__); 442 458 for(int i=0;i<3;i++) 443 459 if (point == endpoints[i]) … … 452 468 bool BoundaryTriangleSet::ContainsBoundaryPoint(class TesselPoint *point) 453 469 { 470 Info FunctionInfo(__func__); 454 471 for(int i=0;i<3;i++) 455 472 if (point == endpoints[i]->node) … … 464 481 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3]) 465 482 { 483 Info FunctionInfo(__func__); 466 484 return (((endpoints[0] == Points[0]) 467 485 || (endpoints[0] == Points[1]) … … 485 503 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryTriangleSet *T) 486 504 { 505 Info FunctionInfo(__func__); 487 506 return (((endpoints[0] == T->endpoints[0]) 488 507 || (endpoints[0] == T->endpoints[1]) … … 506 525 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(class BoundaryLineSet *line) 507 526 { 527 Info FunctionInfo(__func__); 508 528 // sanity check 509 529 if (!ContainsBoundaryLine(line)) … … 522 542 void BoundaryTriangleSet::GetCenter(Vector *center) 523 543 { 544 Info FunctionInfo(__func__); 524 545 center->Zero(); 525 546 for(int i=0;i<3;i++) … … 534 555 ostream &operator <<(ostream &ost, const BoundaryTriangleSet &a) 535 556 { 536 ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << "," 537 << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]"; 557 ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << "," << a.endpoints[1]->node->Name << "," << a.endpoints[2]->node->Name << "]"; 558 // ost << "[" << a.Nr << "|" << a.endpoints[0]->node->Name << " at " << *a.endpoints[0]->node->node << "," 559 // << a.endpoints[1]->node->Name << " at " << *a.endpoints[1]->node->node << "," << a.endpoints[2]->node->Name << " at " << *a.endpoints[2]->node->node << "]"; 538 560 return ost; 539 561 }; 540 562 563 // ======================================== Polygons on Boundary ================================= 564 565 /** Constructor for BoundaryPolygonSet. 566 */ 567 BoundaryPolygonSet::BoundaryPolygonSet() : 568 Nr(-1) 569 { 570 Info FunctionInfo(__func__); 571 }; 572 573 /** Destructor of BoundaryPolygonSet. 574 * Just clears endpoints. 575 * \note When removing triangles from a class Tesselation, use RemoveTesselationTriangle() 576 */ 577 BoundaryPolygonSet::~BoundaryPolygonSet() 578 { 579 Info FunctionInfo(__func__); 580 endpoints.clear(); 581 Log() << Verbose(1) << "Erasing polygon Nr." << Nr << " itself." << endl; 582 }; 583 584 /** Calculates the normal vector for this triangle. 585 * Is made unique by comparison with \a OtherVector to point in the other direction. 586 * \param &OtherVector direction vector to make normal vector unique. 587 * \return allocated vector in normal direction 588 */ 589 Vector * BoundaryPolygonSet::GetNormalVector(const Vector &OtherVector) const 590 { 591 Info FunctionInfo(__func__); 592 // get normal vector 593 Vector TemporaryNormal; 594 Vector *TotalNormal = new Vector; 595 PointSet::const_iterator Runner[3]; 596 for (int i=0;i<3; i++) { 597 Runner[i] = endpoints.begin(); 598 for (int j = 0; j<i; j++) { // go as much further 599 Runner[i]++; 600 if (Runner[i] == endpoints.end()) { 601 eLog() << Verbose(0) << "There are less than three endpoints in the polygon!" << endl; 602 performCriticalExit(); 603 } 604 } 605 } 606 TotalNormal->Zero(); 607 int counter=0; 608 for (; Runner[2] != endpoints.end(); ) { 609 TemporaryNormal.MakeNormalVector((*Runner[0])->node->node, (*Runner[1])->node->node, (*Runner[2])->node->node); 610 for (int i=0;i<3;i++) // increase each of them 611 Runner[i]++; 612 TotalNormal->AddVector(&TemporaryNormal); 613 } 614 TotalNormal->Scale(1./(double)counter); 615 616 // make it always point inward (any offset vector onto plane projected onto normal vector suffices) 617 if (TotalNormal->ScalarProduct(&OtherVector) > 0.) 618 TotalNormal->Scale(-1.); 619 Log() << Verbose(1) << "Normal Vector is " << *TotalNormal << "." << endl; 620 621 return TotalNormal; 622 }; 623 624 /** Calculates the center point of the triangle. 625 * Is third of the sum of all endpoints. 626 * \param *center central point on return. 627 */ 628 void BoundaryPolygonSet::GetCenter(Vector * const center) const 629 { 630 Info FunctionInfo(__func__); 631 center->Zero(); 632 int counter = 0; 633 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) { 634 center->AddVector((*Runner)->node->node); 635 counter++; 636 } 637 center->Scale(1./(double)counter); 638 Log() << Verbose(1) << "Center is at " << *center << "." << endl; 639 } 640 641 /** Checks whether the polygons contains all three endpoints of the triangle. 642 * \param *triangle triangle to test 643 * \return true - triangle is contained polygon, false - is not 644 */ 645 bool BoundaryPolygonSet::ContainsBoundaryTriangle(const BoundaryTriangleSet * const triangle) const 646 { 647 Info FunctionInfo(__func__); 648 return ContainsPresentTupel(triangle->endpoints, 3); 649 }; 650 651 /** Checks whether the polygons contains both endpoints of the line. 652 * \param *line line to test 653 * \return true - line is of the triangle, false - is not 654 */ 655 bool BoundaryPolygonSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const 656 { 657 Info FunctionInfo(__func__); 658 return ContainsPresentTupel(line->endpoints, 2); 659 }; 660 661 /** Checks whether point is any of the three endpoints this triangle contains. 662 * \param *point point to test 663 * \return true - point is of the triangle, false - is not 664 */ 665 bool BoundaryPolygonSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 666 { 667 Info FunctionInfo(__func__); 668 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) { 669 Log() << Verbose(0) << "Checking against " << **Runner << endl; 670 if (point == (*Runner)) { 671 Log() << Verbose(0) << " Contained." << endl; 672 return true; 673 } 674 } 675 Log() << Verbose(0) << " Not contained." << endl; 676 return false; 677 }; 678 679 /** Checks whether point is any of the three endpoints this triangle contains. 680 * \param *point TesselPoint to test 681 * \return true - point is of the triangle, false - is not 682 */ 683 bool BoundaryPolygonSet::ContainsBoundaryPoint(const TesselPoint * const point) const 684 { 685 Info FunctionInfo(__func__); 686 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) 687 if (point == (*Runner)->node) { 688 Log() << Verbose(0) << " Contained." << endl; 689 return true; 690 } 691 Log() << Verbose(0) << " Not contained." << endl; 692 return false; 693 }; 694 695 /** Checks whether given array of \a *Points coincide with polygons's endpoints. 696 * \param **Points pointer to an array of BoundaryPointSet 697 * \param dim dimension of array 698 * \return true - set of points is contained in polygon, false - is not 699 */ 700 bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const 701 { 702 Info FunctionInfo(__func__); 703 int counter = 0; 704 Log() << Verbose(1) << "Polygon is " << *this << endl; 705 for(int i=0;i<dim;i++) { 706 Log() << Verbose(1) << " Testing endpoint " << *Points[i] << endl; 707 if (ContainsBoundaryPoint(Points[i])) { 708 counter++; 709 } 710 } 711 712 if (counter == dim) 713 return true; 714 else 715 return false; 716 }; 717 718 /** Checks whether given PointList coincide with polygons's endpoints. 719 * \param &endpoints PointList 720 * \return true - set of points is contained in polygon, false - is not 721 */ 722 bool BoundaryPolygonSet::ContainsPresentTupel(const PointSet &endpoints) const 723 { 724 Info FunctionInfo(__func__); 725 size_t counter = 0; 726 Log() << Verbose(1) << "Polygon is " << *this << endl; 727 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) { 728 Log() << Verbose(1) << " Testing endpoint " << **Runner << endl; 729 if (ContainsBoundaryPoint(*Runner)) 730 counter++; 731 } 732 733 if (counter == endpoints.size()) 734 return true; 735 else 736 return false; 737 }; 738 739 /** Checks whether given set of \a *Points coincide with polygons's endpoints. 740 * \param *P pointer to BoundaryPolygonSet 741 * \return true - is the very triangle, false - is not 742 */ 743 bool BoundaryPolygonSet::ContainsPresentTupel(const BoundaryPolygonSet * const P) const 744 { 745 return ContainsPresentTupel((const PointSet)P->endpoints); 746 }; 747 748 /** Gathers all the endpoints' triangles in a unique set. 749 * \return set of all triangles 750 */ 751 TriangleSet * BoundaryPolygonSet::GetAllContainedTrianglesFromEndpoints() const 752 { 753 Info FunctionInfo(__func__); 754 pair <TriangleSet::iterator, bool> Tester; 755 TriangleSet *triangles = new TriangleSet; 756 757 for(PointSet::const_iterator Runner = endpoints.begin(); Runner != endpoints.end(); Runner++) 758 for(LineMap::const_iterator Walker = (*Runner)->lines.begin(); Walker != (*Runner)->lines.end(); Walker++) 759 for(TriangleMap::const_iterator Sprinter = (Walker->second)->triangles.begin(); Sprinter != (Walker->second)->triangles.end(); Sprinter++) { 760 //Log() << Verbose(0) << " Testing triangle " << *(Sprinter->second) << endl; 761 if (ContainsBoundaryTriangle(Sprinter->second)) { 762 Tester = triangles->insert(Sprinter->second); 763 if (Tester.second) 764 Log() << Verbose(0) << "Adding triangle " << *(Sprinter->second) << endl; 765 } 766 } 767 768 Log() << Verbose(1) << "The Polygon of " << endpoints.size() << " endpoints has " << triangles->size() << " unique triangles in total." << endl; 769 return triangles; 770 }; 771 772 /** Fills the endpoints of this polygon from the triangles attached to \a *line. 773 * \param *line lines with triangles attached 774 * \return true - polygon contains endpoints, false - line was NULL 775 */ 776 bool BoundaryPolygonSet::FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line) 777 { 778 Info FunctionInfo(__func__); 779 pair <PointSet::iterator, bool> Tester; 780 if (line == NULL) 781 return false; 782 Log() << Verbose(1) << "Filling polygon from line " << *line << endl; 783 for(TriangleMap::const_iterator Runner = line->triangles.begin(); Runner != line->triangles.end(); Runner++) { 784 for (int i=0;i<3;i++) { 785 Tester = endpoints.insert((Runner->second)->endpoints[i]); 786 if (Tester.second) 787 Log() << Verbose(1) << " Inserting endpoint " << *((Runner->second)->endpoints[i]) << endl; 788 } 789 } 790 791 return true; 792 }; 793 794 /** output operator for BoundaryPolygonSet. 795 * \param &ost output stream 796 * \param &a boundary polygon 797 */ 798 ostream &operator <<(ostream &ost, const BoundaryPolygonSet &a) 799 { 800 ost << "[" << a.Nr << "|"; 801 for(PointSet::const_iterator Runner = a.endpoints.begin(); Runner != a.endpoints.end();) { 802 ost << (*Runner)->node->Name; 803 Runner++; 804 if (Runner != a.endpoints.end()) 805 ost << ","; 806 } 807 ost<< "]"; 808 return ost; 809 }; 810 541 811 // =========================================================== class TESSELPOINT =========================================== 542 812 … … 545 815 TesselPoint::TesselPoint() 546 816 { 817 Info FunctionInfo(__func__); 547 818 node = NULL; 548 819 nr = -1; … … 554 825 TesselPoint::~TesselPoint() 555 826 { 827 Info FunctionInfo(__func__); 556 828 }; 557 829 … … 568 840 ostream & TesselPoint::operator << (ostream &ost) 569 841 { 570 ost << "[" << (Name) << "|" << this << "]"; 842 Info FunctionInfo(__func__); 843 ost << "[" << (nr) << "|" << this << "]"; 571 844 return ost; 572 845 }; … … 579 852 PointCloud::PointCloud() 580 853 { 581 854 Info FunctionInfo(__func__); 582 855 }; 583 856 … … 586 859 PointCloud::~PointCloud() 587 860 { 588 861 Info FunctionInfo(__func__); 589 862 }; 590 863 … … 593 866 /** Constructor of class CandidateForTesselation. 594 867 */ 595 CandidateForTesselation::CandidateForTesselation(TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) { 596 point = candidate; 597 BaseLine = line; 868 CandidateForTesselation::CandidateForTesselation (BoundaryLineSet* line) : 869 BaseLine(line), 870 ShortestAngle(2.*M_PI), 871 OtherShortestAngle(2.*M_PI) 872 { 873 Info FunctionInfo(__func__); 874 }; 875 876 877 /** Constructor of class CandidateForTesselation. 878 */ 879 CandidateForTesselation::CandidateForTesselation (TesselPoint *candidate, BoundaryLineSet* line, Vector OptCandidateCenter, Vector OtherOptCandidateCenter) : 880 BaseLine(line), 881 ShortestAngle(2.*M_PI), 882 OtherShortestAngle(2.*M_PI) 883 { 884 Info FunctionInfo(__func__); 598 885 OptCenter.CopyVector(&OptCandidateCenter); 599 886 OtherOptCenter.CopyVector(&OtherOptCandidateCenter); … … 603 890 */ 604 891 CandidateForTesselation::~CandidateForTesselation() { 605 point = NULL;606 892 BaseLine = NULL; 607 893 }; 608 894 895 /** output operator for CandidateForTesselation. 896 * \param &ost output stream 897 * \param &a boundary line 898 */ 899 ostream & operator <<(ostream &ost, const CandidateForTesselation &a) 900 { 901 ost << "[" << a.BaseLine->Nr << "|" << a.BaseLine->endpoints[0]->node->Name << "," << a.BaseLine->endpoints[1]->node->Name << "] with "; 902 if (a.pointlist.empty()) 903 ost << "no candidate."; 904 else { 905 ost << "candidate"; 906 if (a.pointlist.size() != 1) 907 ost << "s "; 908 else 909 ost << " "; 910 for (TesselPointList::const_iterator Runner = a.pointlist.begin(); Runner != a.pointlist.end(); Runner++) 911 ost << *(*Runner) << " "; 912 ost << " at angle " << (a.ShortestAngle)<< "."; 913 } 914 915 return ost; 916 }; 917 918 609 919 // =========================================================== class TESSELATION =========================================== 610 920 611 921 /** Constructor of class Tesselation. 612 922 */ 613 Tesselation::Tesselation() 614 { 615 PointsOnBoundaryCount = 0; 616 LinesOnBoundaryCount = 0; 617 TrianglesOnBoundaryCount = 0; 618 InternalPointer = PointsOnBoundary.begin(); 619 LastTriangle = NULL; 620 TriangleFilesWritten = 0; 923 Tesselation::Tesselation() : 924 PointsOnBoundaryCount(0), 925 LinesOnBoundaryCount(0), 926 TrianglesOnBoundaryCount(0), 927 LastTriangle(NULL), 928 TriangleFilesWritten(0), 929 InternalPointer(PointsOnBoundary.begin()) 930 { 931 Info FunctionInfo(__func__); 621 932 } 622 933 ; … … 627 938 Tesselation::~Tesselation() 628 939 { 629 Log() << Verbose(1) << "Free'ing TesselStruct ... " << endl; 940 Info FunctionInfo(__func__); 941 Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl; 630 942 for (TriangleMap::iterator runner = TrianglesOnBoundary.begin(); runner != TrianglesOnBoundary.end(); runner++) { 631 943 if (runner->second != NULL) { … … 635 947 eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl; 636 948 } 637 Log() << Verbose( 1) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl;949 Log() << Verbose(0) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl; 638 950 } 639 951 ; … … 644 956 Vector * Tesselation::GetCenter(ofstream *out) const 645 957 { 958 Info FunctionInfo(__func__); 646 959 Vector *Center = new Vector(0.,0.,0.); 647 960 int num=0; … … 659 972 TesselPoint * Tesselation::GetPoint() const 660 973 { 974 Info FunctionInfo(__func__); 661 975 return (InternalPointer->second->node); 662 976 }; … … 667 981 TesselPoint * Tesselation::GetTerminalPoint() const 668 982 { 983 Info FunctionInfo(__func__); 669 984 PointMap::const_iterator Runner = PointsOnBoundary.end(); 670 985 Runner--; … … 677 992 void Tesselation::GoToNext() const 678 993 { 994 Info FunctionInfo(__func__); 679 995 if (InternalPointer != PointsOnBoundary.end()) 680 996 InternalPointer++; … … 686 1002 void Tesselation::GoToPrevious() const 687 1003 { 1004 Info FunctionInfo(__func__); 688 1005 if (InternalPointer != PointsOnBoundary.begin()) 689 1006 InternalPointer--; … … 695 1012 void Tesselation::GoToFirst() const 696 1013 { 1014 Info FunctionInfo(__func__); 697 1015 InternalPointer = PointsOnBoundary.begin(); 698 1016 }; … … 703 1021 void Tesselation::GoToLast() const 704 1022 { 1023 Info FunctionInfo(__func__); 705 1024 InternalPointer = PointsOnBoundary.end(); 706 1025 InternalPointer--; … … 712 1031 bool Tesselation::IsEmpty() const 713 1032 { 1033 Info FunctionInfo(__func__); 714 1034 return (PointsOnBoundary.empty()); 715 1035 }; … … 720 1040 bool Tesselation::IsEnd() const 721 1041 { 1042 Info FunctionInfo(__func__); 722 1043 return (InternalPointer == PointsOnBoundary.end()); 723 1044 }; … … 732 1053 Tesselation::GuessStartingTriangle() 733 1054 { 1055 Info FunctionInfo(__func__); 734 1056 // 4b. create a starting triangle 735 1057 // 4b1. create all distances … … 778 1100 baseline->second.first->second->node->node, 779 1101 baseline->second.second->second->node->node); 780 Log() << Verbose(2) << "Plane vector of candidate triangle is "; 781 PlaneVector.Output(); 782 Log() << Verbose(0) << endl; 1102 Log() << Verbose(2) << "Plane vector of candidate triangle is " << PlaneVector << endl; 783 1103 // 4. loop over all points 784 1104 double sign = 0.; … … 796 1116 if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok 797 1117 continue; 798 Log() << Verbose(3) << "Projection of " << checker->second->node->Name 799 << " yields distance of " << distance << "." << endl; 1118 Log() << Verbose(2) << "Projection of " << checker->second->node->Name << " yields distance of " << distance << "." << endl; 800 1119 tmp = distance / fabs(distance); 801 1120 // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle) … … 850 1169 if (checker == PointsOnBoundary.end()) 851 1170 { 852 Log() << Verbose( 0) << "Looks like we have a candidate!" << endl;1171 Log() << Verbose(2) << "Looks like we have a candidate!" << endl; 853 1172 break; 854 1173 } … … 880 1199 else 881 1200 { 882 Log() << Verbose(1) << "No starting triangle found." << endl; 883 exit(255); 1201 eLog() << Verbose(0) << "No starting triangle found." << endl; 884 1202 } 885 1203 } … … 901 1219 void Tesselation::TesselateOnBoundary(const PointCloud * const cloud) 902 1220 { 1221 Info FunctionInfo(__func__); 903 1222 bool flag; 904 1223 PointMap::iterator winner; … … 919 1238 // get peak point with respect to this base line's only triangle 920 1239 BTS = baseline->second->triangles.begin()->second; // there is only one triangle so far 921 Log() << Verbose( 2) << "Current baseline is between " << *(baseline->second) << "." << endl;1240 Log() << Verbose(0) << "Current baseline is between " << *(baseline->second) << "." << endl; 922 1241 for (int i = 0; i < 3; i++) 923 1242 if ((BTS->endpoints[i] != baseline->second->endpoints[0]) && (BTS->endpoints[i] != baseline->second->endpoints[1])) 924 1243 peak = BTS->endpoints[i]; 925 Log() << Verbose( 3) << " and has peak " << *peak << "." << endl;1244 Log() << Verbose(1) << " and has peak " << *peak << "." << endl; 926 1245 927 1246 // prepare some auxiliary vectors … … 938 1257 CenterVector.AddVector(BTS->endpoints[i]->node->node); 939 1258 CenterVector.Scale(1. / 3.); 940 Log() << Verbose( 4) << "CenterVector of base triangle is " << CenterVector << endl;1259 Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl; 941 1260 942 1261 // normal vector of triangle … … 945 1264 BTS->GetNormalVector(NormalVector); 946 1265 NormalVector.CopyVector(&BTS->NormalVector); 947 Log() << Verbose( 4) << "NormalVector of base triangle is " << NormalVector << endl;1266 Log() << Verbose(2) << "NormalVector of base triangle is " << NormalVector << endl; 948 1267 949 1268 // vector in propagation direction (out of triangle) … … 952 1271 TempVector.CopyVector(&CenterVector); 953 1272 TempVector.SubtractVector(baseline->second->endpoints[0]->node->node); // TempVector is vector on triangle plane pointing from one baseline egde towards center! 954 //Log() << Verbose( 2) << "Projection of propagation onto temp: " << PropagationVector.Projection(&TempVector) << "." << endl;1273 //Log() << Verbose(0) << "Projection of propagation onto temp: " << PropagationVector.Projection(&TempVector) << "." << endl; 955 1274 if (PropagationVector.ScalarProduct(&TempVector) > 0) // make sure normal propagation vector points outward from baseline 956 1275 PropagationVector.Scale(-1.); 957 Log() << Verbose( 4) << "PropagationVector of base triangle is " << PropagationVector << endl;1276 Log() << Verbose(2) << "PropagationVector of base triangle is " << PropagationVector << endl; 958 1277 winner = PointsOnBoundary.end(); 959 1278 … … 961 1280 for (PointMap::iterator target = PointsOnBoundary.begin(); target != PointsOnBoundary.end(); target++) { 962 1281 if ((target->second != baseline->second->endpoints[0]) && (target->second != baseline->second->endpoints[1])) { // don't take the same endpoints 963 Log() << Verbose( 3) << "Target point is " << *(target->second) << ":" << endl;1282 Log() << Verbose(1) << "Target point is " << *(target->second) << ":" << endl; 964 1283 965 1284 // first check direction, so that triangles don't intersect … … 968 1287 VirtualNormalVector.ProjectOntoPlane(&NormalVector); 969 1288 TempAngle = VirtualNormalVector.Angle(&PropagationVector); 970 Log() << Verbose( 4) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl;1289 Log() << Verbose(2) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl; 971 1290 if (TempAngle > (M_PI/2.)) { // no bends bigger than Pi/2 (90 degrees) 972 Log() << Verbose( 4) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl;1291 Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl; 973 1292 continue; 974 1293 } else 975 Log() << Verbose( 4) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl;1294 Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl; 976 1295 977 1296 // check first and second endpoint (if any connecting line goes to target has at least not more than 1 triangle) … … 979 1298 LineChecker[1] = baseline->second->endpoints[1]->lines.find(target->first); 980 1299 if (((LineChecker[0] != baseline->second->endpoints[0]->lines.end()) && (LineChecker[0]->second->triangles.size() == 2))) { 981 Log() << Verbose( 4) << *(baseline->second->endpoints[0]) << " has line " << *(LineChecker[0]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[0]->second->triangles.size() << " triangles." << endl;1300 Log() << Verbose(2) << *(baseline->second->endpoints[0]) << " has line " << *(LineChecker[0]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[0]->second->triangles.size() << " triangles." << endl; 982 1301 continue; 983 1302 } 984 1303 if (((LineChecker[1] != baseline->second->endpoints[1]->lines.end()) && (LineChecker[1]->second->triangles.size() == 2))) { 985 Log() << Verbose( 4) << *(baseline->second->endpoints[1]) << " has line " << *(LineChecker[1]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[1]->second->triangles.size() << " triangles." << endl;1304 Log() << Verbose(2) << *(baseline->second->endpoints[1]) << " has line " << *(LineChecker[1]->second) << " to " << *(target->second) << " as endpoint with " << LineChecker[1]->second->triangles.size() << " triangles." << endl; 986 1305 continue; 987 1306 } … … 1000 1319 helper.ProjectOntoPlane(&TempVector); 1001 1320 if (fabs(helper.NormSquared()) < MYEPSILON) { 1002 Log() << Verbose( 4) << "Chosen set of vectors is linear dependent." << endl;1321 Log() << Verbose(2) << "Chosen set of vectors is linear dependent." << endl; 1003 1322 continue; 1004 1323 } … … 1017 1336 // calculate angle 1018 1337 TempAngle = NormalVector.Angle(&VirtualNormalVector); 1019 Log() << Verbose( 4) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl;1338 Log() << Verbose(2) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl; 1020 1339 if ((SmallestAngle - TempAngle) > MYEPSILON) { // set to new possible winner 1021 1340 SmallestAngle = TempAngle; 1022 1341 winner = target; 1023 Log() << Verbose( 4) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;1342 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl; 1024 1343 } else if (fabs(SmallestAngle - TempAngle) < MYEPSILON) { // check the angle to propagation, both possible targets are in one plane! (their normals have same angle) 1025 1344 // hence, check the angles to some normal direction from our base line but in this common plane of both targets... … … 1039 1358 SmallestAngle = TempAngle; 1040 1359 winner = target; 1041 Log() << Verbose( 4) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl;1360 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl; 1042 1361 } else 1043 Log() << Verbose( 4) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl;1362 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl; 1044 1363 } else 1045 Log() << Verbose( 4) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;1364 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl; 1046 1365 } 1047 1366 } // end of loop over all boundary points … … 1049 1368 // 5b. The point of the above whose triangle has the greatest angle with the triangle the current line belongs to (it only belongs to one, remember!): New triangle 1050 1369 if (winner != PointsOnBoundary.end()) { 1051 Log() << Verbose( 2) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl;1370 Log() << Verbose(0) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl; 1052 1371 // create the lins of not yet present 1053 1372 BLS[0] = baseline->second; … … 1079 1398 TrianglesOnBoundaryCount++; 1080 1399 } else { 1081 Log() << Verbose(1) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl;1400 eLog() << Verbose(2) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl; 1082 1401 } 1083 1402 1084 1403 // 5d. If the set of lines is not yet empty, go to 5. and continue 1085 1404 } else 1086 Log() << Verbose( 2) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl;1405 Log() << Verbose(0) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl; 1087 1406 } while (flag); 1088 1407 … … 1099 1418 bool Tesselation::InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC) 1100 1419 { 1420 Info FunctionInfo(__func__); 1101 1421 Vector Intersection, Normal; 1102 1422 TesselPoint *Walker = NULL; … … 1105 1425 bool AddFlag = false; 1106 1426 LinkedCell *BoundaryPoints = NULL; 1107 1108 Log() << Verbose(1) << "Begin of InsertStraddlingPoints" << endl;1109 1427 1110 1428 cloud->GoToFirst(); … … 1117 1435 } 1118 1436 Walker = cloud->GetPoint(); 1119 Log() << Verbose( 2) << "Current point is " << *Walker << "." << endl;1437 Log() << Verbose(0) << "Current point is " << *Walker << "." << endl; 1120 1438 // get the next triangle 1121 1439 triangles = FindClosestTrianglesToPoint(Walker->node, BoundaryPoints); 1122 1440 BTS = triangles->front(); 1123 1441 if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) { 1124 Log() << Verbose( 2) << "No triangles found, probably a tesselation point itself." << endl;1442 Log() << Verbose(0) << "No triangles found, probably a tesselation point itself." << endl; 1125 1443 cloud->GoToNext(); 1126 1444 continue; 1127 1445 } else { 1128 1446 } 1129 Log() << Verbose( 2) << "Closest triangle is " << *BTS << "." << endl;1447 Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl; 1130 1448 // get the intersection point 1131 1449 if (BTS->GetIntersectionInsideTriangle(Center, Walker->node, &Intersection)) { 1132 Log() << Verbose( 2) << "We have an intersection at " << Intersection << "." << endl;1450 Log() << Verbose(0) << "We have an intersection at " << Intersection << "." << endl; 1133 1451 // we have the intersection, check whether in- or outside of boundary 1134 1452 if ((Center->DistanceSquared(Walker->node) - Center->DistanceSquared(&Intersection)) < -MYEPSILON) { 1135 1453 // inside, next! 1136 Log() << Verbose( 2) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;1454 Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl; 1137 1455 } else { 1138 1456 // outside! 1139 Log() << Verbose( 2) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;1457 Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl; 1140 1458 class BoundaryLineSet *OldLines[3], *NewLines[3]; 1141 1459 class BoundaryPointSet *OldPoints[3], *NewPoint; … … 1147 1465 Normal.CopyVector(&BTS->NormalVector); 1148 1466 // add Walker to boundary points 1149 Log() << Verbose( 2) << "Adding " << *Walker << " to BoundaryPoints." << endl;1467 Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl; 1150 1468 AddFlag = true; 1151 1469 if (AddBoundaryPoint(Walker,0)) … … 1154 1472 continue; 1155 1473 // remove triangle 1156 Log() << Verbose( 2) << "Erasing triangle " << *BTS << "." << endl;1474 Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl; 1157 1475 TrianglesOnBoundary.erase(BTS->Nr); 1158 1476 delete(BTS); … … 1162 1480 BPS[1] = OldPoints[i]; 1163 1481 NewLines[i] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount); 1164 Log() << Verbose( 3) << "Creating new line " << *NewLines[i] << "." << endl;1482 Log() << Verbose(1) << "Creating new line " << *NewLines[i] << "." << endl; 1165 1483 LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, NewLines[i])); // no need for check for unique insertion as BPS[0] is definitely a new one 1166 1484 LinesOnBoundaryCount++; … … 1173 1491 if (NewLines[j]->IsConnectedTo(BLS[0])) { 1174 1492 if (n>2) { 1175 Log() << Verbose(1) << BLS[0] << " connects to all of the new lines?!" << endl;1493 eLog() << Verbose(2) << BLS[0] << " connects to all of the new lines?!" << endl; 1176 1494 return false; 1177 1495 } else … … 1184 1502 BTS->GetNormalVector(Normal); 1185 1503 Normal.Scale(-1.); 1186 Log() << Verbose( 2) << "Created new triangle " << *BTS << "." << endl;1504 Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl; 1187 1505 TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS)); 1188 1506 TrianglesOnBoundaryCount++; … … 1198 1516 // exit 1199 1517 delete(Center); 1200 Log() << Verbose(1) << "End of InsertStraddlingPoints" << endl;1201 1518 return true; 1202 1519 }; … … 1209 1526 bool Tesselation::AddBoundaryPoint(TesselPoint * Walker, const int n) 1210 1527 { 1528 Info FunctionInfo(__func__); 1211 1529 PointTestPair InsertUnique; 1212 1530 BPS[n] = new class BoundaryPointSet(Walker); … … 1230 1548 void Tesselation::AddTesselationPoint(TesselPoint* Candidate, const int n) 1231 1549 { 1550 Info FunctionInfo(__func__); 1232 1551 PointTestPair InsertUnique; 1233 1552 TPS[n] = new class BoundaryPointSet(Candidate); … … 1237 1556 } else { 1238 1557 delete TPS[n]; 1239 Log() << Verbose( 4) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl;1558 Log() << Verbose(0) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl; 1240 1559 TPS[n] = (InsertUnique.first)->second; 1241 1560 } … … 1250 1569 void Tesselation::SetTesselationPoint(TesselPoint* Candidate, const int n) const 1251 1570 { 1571 Info FunctionInfo(__func__); 1252 1572 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Candidate->nr); 1253 1573 if (FindPoint != PointsOnBoundary.end()) … … 1267 1587 bool insertNewLine = true; 1268 1588 1269 if (a->lines.find(b->node->nr) != a->lines.end()) { 1270 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1589 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1590 if (FindLine != a->lines.end()) { 1591 Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl; 1592 1271 1593 pair<LineMap::iterator,LineMap::iterator> FindPair; 1272 1594 FindPair = a->lines.equal_range(b->node->nr); 1273 Log() << Verbose(5) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl;1274 1595 1275 1596 for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) { … … 1277 1598 if (FindLine->second->triangles.size() < 2) { 1278 1599 insertNewLine = false; 1279 Log() << Verbose( 4) << "Using existing line " << *FindLine->second << endl;1600 Log() << Verbose(0) << "Using existing line " << *FindLine->second << endl; 1280 1601 1281 1602 BPS[0] = FindLine->second->endpoints[0]; 1282 1603 BPS[1] = FindLine->second->endpoints[1]; 1283 1604 BLS[n] = FindLine->second; 1605 1606 // remove existing line from OpenLines 1607 CandidateMap::iterator CandidateLine = OpenLines.find(BLS[n]); 1608 if (CandidateLine != OpenLines.end()) { 1609 Log() << Verbose(1) << " Removing line from OpenLines." << endl; 1610 delete(CandidateLine->second); 1611 OpenLines.erase(CandidateLine); 1612 } else { 1613 eLog() << Verbose(1) << "Line exists and is attached to less than two triangles, but not in OpenLines!" << endl; 1614 } 1284 1615 1285 1616 break; … … 1304 1635 void Tesselation::AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n) 1305 1636 { 1306 Log() << Verbose(4) << "Adding line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl; 1637 Info FunctionInfo(__func__); 1638 Log() << Verbose(0) << "Adding open line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl; 1307 1639 BPS[0] = a; 1308 1640 BPS[1] = b; … … 1312 1644 // increase counter 1313 1645 LinesOnBoundaryCount++; 1646 // also add to open lines 1647 CandidateForTesselation *CFT = new CandidateForTesselation(BLS[n]); 1648 OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT)); 1314 1649 }; 1315 1650 … … 1319 1654 void Tesselation::AddTesselationTriangle() 1320 1655 { 1656 Info FunctionInfo(__func__); 1321 1657 Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1322 1658 … … 1337 1673 void Tesselation::AddTesselationTriangle(const int nr) 1338 1674 { 1339 Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1675 Info FunctionInfo(__func__); 1676 Log() << Verbose(0) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1340 1677 1341 1678 // add triangle to global map … … 1355 1692 void Tesselation::RemoveTesselationTriangle(class BoundaryTriangleSet *triangle) 1356 1693 { 1694 Info FunctionInfo(__func__); 1357 1695 if (triangle == NULL) 1358 1696 return; 1359 1697 for (int i = 0; i < 3; i++) { 1360 1698 if (triangle->lines[i] != NULL) { 1361 Log() << Verbose( 5) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl;1699 Log() << Verbose(0) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl; 1362 1700 triangle->lines[i]->triangles.erase(triangle->Nr); 1363 1701 if (triangle->lines[i]->triangles.empty()) { 1364 Log() << Verbose( 5) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl;1702 Log() << Verbose(0) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl; 1365 1703 RemoveTesselationLine(triangle->lines[i]); 1366 1704 } else { 1367 Log() << Verbose(5) << *triangle->lines[i] << " is still attached to another triangle: "; 1705 Log() << Verbose(0) << *triangle->lines[i] << " is still attached to another triangle: "; 1706 OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (triangle->lines[i], NULL)); 1368 1707 for(TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++) 1369 1708 Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t"; 1370 1709 Log() << Verbose(0) << endl; 1371 1710 // for (int j=0;j<2;j++) { 1372 // Log() << Verbose( 5) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";1711 // Log() << Verbose(0) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": "; 1373 1712 // for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++) 1374 1713 // Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t"; … … 1382 1721 1383 1722 if (TrianglesOnBoundary.erase(triangle->Nr)) 1384 Log() << Verbose( 5) << "Removing triangle Nr. " << triangle->Nr << "." << endl;1723 Log() << Verbose(0) << "Removing triangle Nr. " << triangle->Nr << "." << endl; 1385 1724 delete(triangle); 1386 1725 }; … … 1392 1731 void Tesselation::RemoveTesselationLine(class BoundaryLineSet *line) 1393 1732 { 1733 Info FunctionInfo(__func__); 1394 1734 int Numbers[2]; 1395 1735 … … 1412 1752 for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++) 1413 1753 if ((*Runner).second == line) { 1414 Log() << Verbose( 5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;1754 Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl; 1415 1755 line->endpoints[i]->lines.erase(Runner); 1416 1756 break; … … 1418 1758 } else { // there's just a single line left 1419 1759 if (line->endpoints[i]->lines.erase(line->Nr)) 1420 Log() << Verbose( 5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;1760 Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl; 1421 1761 } 1422 1762 if (line->endpoints[i]->lines.empty()) { 1423 Log() << Verbose( 5) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl;1763 Log() << Verbose(0) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl; 1424 1764 RemoveTesselationPoint(line->endpoints[i]); 1425 1765 } else { 1426 Log() << Verbose( 5) << *line->endpoints[i] << " has still lines it's attached to: ";1766 Log() << Verbose(0) << *line->endpoints[i] << " has still lines it's attached to: "; 1427 1767 for(LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++) 1428 1768 Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t"; … … 1437 1777 1438 1778 if (LinesOnBoundary.erase(line->Nr)) 1439 Log() << Verbose( 5) << "Removing line Nr. " << line->Nr << "." << endl;1779 Log() << Verbose(0) << "Removing line Nr. " << line->Nr << "." << endl; 1440 1780 delete(line); 1441 1781 }; … … 1448 1788 void Tesselation::RemoveTesselationPoint(class BoundaryPointSet *point) 1449 1789 { 1790 Info FunctionInfo(__func__); 1450 1791 if (point == NULL) 1451 1792 return; 1452 1793 if (PointsOnBoundary.erase(point->Nr)) 1453 Log() << Verbose( 5) << "Removing point Nr. " << point->Nr << "." << endl;1794 Log() << Verbose(0) << "Removing point Nr. " << point->Nr << "." << endl; 1454 1795 delete(point); 1455 1796 }; … … 1466 1807 int Tesselation::CheckPresenceOfTriangle(TesselPoint *Candidates[3]) const 1467 1808 { 1809 Info FunctionInfo(__func__); 1468 1810 int adjacentTriangleCount = 0; 1469 1811 class BoundaryPointSet *Points[3]; 1470 1812 1471 Log() << Verbose(2) << "Begin of CheckPresenceOfTriangle" << endl;1472 1813 // builds a triangle point set (Points) of the end points 1473 1814 for (int i = 0; i < 3; i++) { … … 1488 1829 for (; (FindLine != Points[i]->lines.end()) && (FindLine->first == Points[j]->node->nr); FindLine++) { 1489 1830 TriangleMap *triangles = &FindLine->second->triangles; 1490 Log() << Verbose( 3) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl;1831 Log() << Verbose(1) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl; 1491 1832 for (TriangleMap::const_iterator FindTriangle = triangles->begin(); FindTriangle != triangles->end(); FindTriangle++) { 1492 1833 if (FindTriangle->second->IsPresentTupel(Points)) { … … 1494 1835 } 1495 1836 } 1496 Log() << Verbose( 3) << "end." << endl;1837 Log() << Verbose(1) << "end." << endl; 1497 1838 } 1498 1839 // Only one of the triangle lines must be considered for the triangle count. 1499 //Log() << Verbose( 2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;1840 //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1500 1841 //return adjacentTriangleCount; 1501 1842 } … … 1504 1845 } 1505 1846 1506 Log() << Verbose(2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1507 Log() << Verbose(2) << "End of CheckPresenceOfTriangle" << endl; 1847 Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1508 1848 return adjacentTriangleCount; 1509 1849 }; … … 1519 1859 class BoundaryTriangleSet * Tesselation::GetPresentTriangle(TesselPoint *Candidates[3]) 1520 1860 { 1861 Info FunctionInfo(__func__); 1521 1862 class BoundaryTriangleSet *triangle = NULL; 1522 1863 class BoundaryPointSet *Points[3]; … … 1548 1889 } 1549 1890 // Only one of the triangle lines must be considered for the triangle count. 1550 //Log() << Verbose( 2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl;1891 //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1551 1892 //return adjacentTriangleCount; 1552 1893 } … … 1569 1910 void Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC) 1570 1911 { 1571 Log() << Verbose(1) << "Begin of FindStartingTriangle\n";1912 Info FunctionInfo(__func__); 1572 1913 int i = 0; 1573 TesselPoint* FirstPoint = NULL;1574 TesselPoint* SecondPoint = NULL;1575 1914 TesselPoint* MaxPoint[NDIM]; 1915 TesselPoint* Temporary; 1576 1916 double maxCoordinate[NDIM]; 1577 Vector Oben;1917 BoundaryLineSet BaseLine; 1578 1918 Vector helper; 1579 1919 Vector Chord; 1580 1920 Vector SearchDirection; 1581 1582 Oben.Zero(); 1921 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 1922 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in 1923 Vector SphereCenter; 1924 Vector NormalVector; 1925 1926 NormalVector.Zero(); 1583 1927 1584 1928 for (i = 0; i < 3; i++) { … … 1593 1937 for (LC->n[(i+2)%NDIM]=0;LC->n[(i+2)%NDIM]<LC->N[(i+2)%NDIM];LC->n[(i+2)%NDIM]++) { 1594 1938 const LinkedNodes *List = LC->GetCurrentCell(); 1595 //Log() << Verbose( 2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;1939 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 1596 1940 if (List != NULL) { 1597 1941 for (LinkedNodes::const_iterator Runner = List->begin();Runner != List->end();Runner++) { 1598 1942 if ((*Runner)->node->x[i] > maxCoordinate[i]) { 1599 Log() << Verbose( 2) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;1943 Log() << Verbose(1) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl; 1600 1944 maxCoordinate[i] = (*Runner)->node->x[i]; 1601 1945 MaxPoint[i] = (*Runner); … … 1608 1952 } 1609 1953 1610 Log() << Verbose( 2) << "Found maximum coordinates: ";1954 Log() << Verbose(1) << "Found maximum coordinates: "; 1611 1955 for (int i=0;i<NDIM;i++) 1612 1956 Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t"; … … 1614 1958 1615 1959 BTS = NULL; 1616 CandidateList *OptCandidates = new CandidateList();1617 1960 for (int k=0;k<NDIM;k++) { 1618 Oben.Zero();1619 Oben.x[k] = 1.;1620 FirstPoint = MaxPoint[k];1621 Log() << Verbose( 1) << "Coordinates of start node at " << *FirstPoint->node << "." << endl;1961 NormalVector.Zero(); 1962 NormalVector.x[k] = 1.; 1963 BaseLine.endpoints[0] = new BoundaryPointSet(MaxPoint[k]); 1964 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; 1622 1965 1623 1966 double ShortestAngle; 1624 TesselPoint* OptCandidate = NULL;1625 1967 ShortestAngle = 999999.; // This will contain the angle, which will be always positive (when looking for second point), when looking for third point this will be the quadrant. 1626 1968 1627 FindSecondPointForTesselation(FirstPoint, Oben, OptCandidate, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_... 1628 SecondPoint = OptCandidate; 1629 if (SecondPoint == NULL) // have we found a second point? 1969 FindSecondPointForTesselation(BaseLine.endpoints[0]->node, NormalVector, Temporary, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_... 1970 if (Temporary == NULL) // have we found a second point? 1630 1971 continue; 1631 1632 helper.CopyVector(FirstPoint->node); 1633 helper.SubtractVector(SecondPoint->node); 1634 helper.Normalize(); 1635 Oben.ProjectOntoPlane(&helper); 1636 Oben.Normalize(); 1637 helper.VectorProduct(&Oben); 1972 BaseLine.endpoints[1] = new BoundaryPointSet(Temporary); 1973 1974 // construct center of circle 1975 CircleCenter.CopyVector(BaseLine.endpoints[0]->node->node); 1976 CircleCenter.AddVector(BaseLine.endpoints[1]->node->node); 1977 CircleCenter.Scale(0.5); 1978 1979 // construct normal vector of circle 1980 CirclePlaneNormal.CopyVector(BaseLine.endpoints[0]->node->node); 1981 CirclePlaneNormal.SubtractVector(BaseLine.endpoints[1]->node->node); 1982 1983 double radius = CirclePlaneNormal.NormSquared(); 1984 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 1985 1986 NormalVector.ProjectOntoPlane(&CirclePlaneNormal); 1987 NormalVector.Normalize(); 1638 1988 ShortestAngle = 2.*M_PI; // This will indicate the quadrant. 1639 1989 1640 Chord.CopyVector(FirstPoint->node); // bring into calling function 1641 Chord.SubtractVector(SecondPoint->node); 1642 double radius = Chord.ScalarProduct(&Chord); 1643 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 1644 helper.CopyVector(&Oben); 1645 helper.Scale(CircleRadius); 1646 // Now, oben and helper are two orthonormalized vectors in the plane defined by Chord (not normalized) 1990 SphereCenter.CopyVector(&NormalVector); 1991 SphereCenter.Scale(CircleRadius); 1992 SphereCenter.AddVector(&CircleCenter); 1993 // Now, NormalVector and SphereCenter are two orthonormalized vectors in the plane defined by CirclePlaneNormal (not normalized) 1647 1994 1648 1995 // look in one direction of baseline for initial candidate 1649 SearchDirection.MakeNormalVector(&C hord, &Oben); // whether we look "left" first or "right" first is not important ...1996 SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector); // whether we look "left" first or "right" first is not important ... 1650 1997 1651 1998 // adding point 1 and point 2 and add the line between them 1652 Log() << Verbose(1) << "Coordinates of start node at " << *FirstPoint->node << "." << endl; 1653 AddTesselationPoint(FirstPoint, 0); 1654 Log() << Verbose(1) << "Found second point is at " << *SecondPoint->node << ".\n"; 1655 AddTesselationPoint(SecondPoint, 1); 1656 AddTesselationLine(TPS[0], TPS[1], 0); 1657 1658 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << helper << ".\n"; 1659 FindThirdPointForTesselation(Oben, SearchDirection, helper, BLS[0], NULL, *&OptCandidates, &ShortestAngle, RADIUS, LC); 1660 Log() << Verbose(1) << "List of third Points is "; 1661 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1662 Log() << Verbose(0) << " " << *(*it)->point; 1663 } 1664 Log() << Verbose(0) << endl; 1665 1666 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1667 // add third triangle point 1668 AddTesselationPoint((*it)->point, 2); 1669 // add the second and third line 1670 AddTesselationLine(TPS[1], TPS[2], 1); 1671 AddTesselationLine(TPS[0], TPS[2], 2); 1672 // ... and triangles to the Maps of the Tesselation class 1673 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 1674 AddTesselationTriangle(); 1675 // ... and calculate its normal vector (with correct orientation) 1676 (*it)->OptCenter.Scale(-1.); 1677 Log() << Verbose(2) << "Anti-Oben is currently " << (*it)->OptCenter << "." << endl; 1678 BTS->GetNormalVector((*it)->OptCenter); // vector to compare with should point inwards 1679 Log() << Verbose(0) << "==> Found starting triangle consists of " << *FirstPoint << ", " << *SecondPoint << " and " 1680 << *(*it)->point << " with normal vector " << BTS->NormalVector << ".\n"; 1681 1682 // if we do not reach the end with the next step of iteration, we need to setup a new first line 1683 if (it != OptCandidates->end()--) { 1684 FirstPoint = (*it)->BaseLine->endpoints[0]->node; 1685 SecondPoint = (*it)->point; 1686 // adding point 1 and point 2 and the line between them 1687 AddTesselationPoint(FirstPoint, 0); 1688 AddTesselationPoint(SecondPoint, 1); 1689 AddTesselationLine(TPS[0], TPS[1], 0); 1690 } 1691 Log() << Verbose(2) << "Projection is " << BTS->NormalVector.ScalarProduct(&Oben) << "." << endl; 1692 } 1999 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; 2000 Log() << Verbose(0) << "Found second point is at " << *BaseLine.endpoints[1]->node << ".\n"; 2001 2002 //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << helper << ".\n"; 2003 CandidateForTesselation OptCandidates(&BaseLine); 2004 FindThirdPointForTesselation(NormalVector, SearchDirection, SphereCenter, OptCandidates, NULL, RADIUS, LC); 2005 Log() << Verbose(0) << "List of third Points is:" << endl; 2006 for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); it++) { 2007 Log() << Verbose(0) << " " << *(*it) << endl; 2008 } 2009 2010 BTS = NULL; 2011 AddCandidateTriangle(OptCandidates); 2012 // delete(BaseLine.endpoints[0]); 2013 // delete(BaseLine.endpoints[1]); 2014 1693 2015 if (BTS != NULL) // we have created one starting triangle 1694 2016 break; 1695 2017 else { 1696 2018 // remove all candidates from the list and then the list itself 1697 class CandidateForTesselation *remover = NULL; 1698 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1699 remover = *it; 1700 delete(remover); 1701 } 1702 OptCandidates->clear(); 1703 } 1704 } 1705 1706 // remove all candidates from the list and then the list itself 1707 class CandidateForTesselation *remover = NULL; 1708 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1709 remover = *it; 1710 delete(remover); 1711 } 1712 delete(OptCandidates); 1713 Log() << Verbose(1) << "End of FindStartingTriangle\n"; 2019 OptCandidates.pointlist.clear(); 2020 } 2021 } 1714 2022 }; 1715 2023 1716 2024 /** Checks for a given baseline and a third point candidate whether baselines of the found triangle don't have even better candidates. 1717 2025 * This is supposed to prevent early closing of the tesselation. 1718 * \param *BaseRay baseline, i.e. not \a *OptCandidate2026 * \param CandidateLine CandidateForTesselation with baseline and shortestangle , i.e. not \a *OptCandidate 1719 2027 * \param *ThirdNode third point in triangle, not in BoundaryLineSet::endpoints 1720 * \param ShortestAngle path length on this circle band for the current \a *ThirdNode1721 2028 * \param RADIUS radius of sphere 1722 2029 * \param *LC LinkedCell structure 1723 2030 * \return true - there is a better candidate (smaller angle than \a ShortestAngle), false - no better TesselPoint candidate found 1724 2031 */ 1725 bool Tesselation::HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const ThirdNode, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const 1726 { 1727 bool result = false; 1728 Vector CircleCenter; 1729 Vector CirclePlaneNormal; 1730 Vector OldSphereCenter; 1731 Vector SearchDirection; 1732 Vector helper; 1733 TesselPoint *OtherOptCandidate = NULL; 1734 double OtherShortestAngle = 2.*M_PI; // This will indicate the quadrant. 1735 double radius, CircleRadius; 1736 BoundaryLineSet *Line = NULL; 1737 BoundaryTriangleSet *T = NULL; 1738 1739 Log() << Verbose(1) << "Begin of HasOtherBaselineBetterCandidate" << endl; 1740 1741 // check both other lines 1742 PointMap::const_iterator FindPoint = PointsOnBoundary.find(ThirdNode->nr); 1743 if (FindPoint != PointsOnBoundary.end()) { 1744 for (int i=0;i<2;i++) { 1745 LineMap::const_iterator FindLine = (FindPoint->second)->lines.find(BaseRay->endpoints[0]->node->nr); 1746 if (FindLine != (FindPoint->second)->lines.end()) { 1747 Line = FindLine->second; 1748 Log() << Verbose(1) << "Found line " << *Line << "." << endl; 1749 if (Line->triangles.size() == 1) { 1750 T = Line->triangles.begin()->second; 1751 // construct center of circle 1752 CircleCenter.CopyVector(Line->endpoints[0]->node->node); 1753 CircleCenter.AddVector(Line->endpoints[1]->node->node); 1754 CircleCenter.Scale(0.5); 1755 1756 // construct normal vector of circle 1757 CirclePlaneNormal.CopyVector(Line->endpoints[0]->node->node); 1758 CirclePlaneNormal.SubtractVector(Line->endpoints[1]->node->node); 1759 1760 // calculate squared radius of circle 1761 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 1762 if (radius/4. < RADIUS*RADIUS) { 1763 CircleRadius = RADIUS*RADIUS - radius/4.; 1764 CirclePlaneNormal.Normalize(); 1765 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 1766 1767 // construct old center 1768 GetCenterofCircumcircle(&OldSphereCenter, *T->endpoints[0]->node->node, *T->endpoints[1]->node->node, *T->endpoints[2]->node->node); 1769 helper.CopyVector(&T->NormalVector); // normal vector ensures that this is correct center of the two possible ones 1770 radius = Line->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 1771 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 1772 OldSphereCenter.AddVector(&helper); 1773 OldSphereCenter.SubtractVector(&CircleCenter); 1774 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 1775 1776 // construct SearchDirection 1777 SearchDirection.MakeNormalVector(&T->NormalVector, &CirclePlaneNormal); 1778 helper.CopyVector(Line->endpoints[0]->node->node); 1779 helper.SubtractVector(ThirdNode->node); 1780 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 1781 SearchDirection.Scale(-1.); 1782 SearchDirection.ProjectOntoPlane(&OldSphereCenter); 1783 SearchDirection.Normalize(); 1784 Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 1785 if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 1786 // rotated the wrong way! 1787 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; 1788 } 1789 1790 // add third point 1791 CandidateList *OptCandidates = new CandidateList(); 1792 FindThirdPointForTesselation(T->NormalVector, SearchDirection, OldSphereCenter, Line, ThirdNode, OptCandidates, &OtherShortestAngle, RADIUS, LC); 1793 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1794 if (((*it)->point == BaseRay->endpoints[0]->node) || ((*it)->point == BaseRay->endpoints[1]->node)) // skip if it's the same triangle than suggested 1795 continue; 1796 Log() << Verbose(1) << " Third point candidate is " << *(*it)->point 1797 << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 1798 Log() << Verbose(1) << " Baseline is " << *BaseRay << endl; 1799 1800 // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 1801 TesselPoint *PointCandidates[3]; 1802 PointCandidates[0] = (*it)->point; 1803 PointCandidates[1] = BaseRay->endpoints[0]->node; 1804 PointCandidates[2] = BaseRay->endpoints[1]->node; 1805 bool check=false; 1806 int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 1807 // If there is no triangle, add it regularly. 1808 if (existentTrianglesCount == 0) { 1809 SetTesselationPoint((*it)->point, 0); 1810 SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 1811 SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 1812 1813 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 1814 OtherOptCandidate = (*it)->point; 1815 check = true; 1816 } 1817 } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 1818 SetTesselationPoint((*it)->point, 0); 1819 SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 1820 SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 1821 1822 // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 1823 // i.e. at least one of the three lines must be present with TriangleCount <= 1 1824 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 1825 OtherOptCandidate = (*it)->point; 1826 check = true; 1827 } 1828 } 1829 1830 if (check) { 1831 if (ShortestAngle > OtherShortestAngle) { 1832 Log() << Verbose(1) << "There is a better candidate than " << *ThirdNode << " with " << ShortestAngle << " from baseline " << *Line << ": " << *OtherOptCandidate << " with " << OtherShortestAngle << "." << endl; 1833 result = true; 1834 break; 1835 } 1836 } 1837 } 1838 delete(OptCandidates); 1839 if (result) 1840 break; 1841 } else { 1842 Log() << Verbose(1) << "Circumcircle for base line " << *Line << " and base triangle " << T << " is too big!" << endl; 1843 } 1844 } else { 1845 eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl; 1846 } 1847 } else { 1848 Log() << Verbose(2) << "No present baseline between " << BaseRay->endpoints[0] << " and candidate " << *ThirdNode << "." << endl; 1849 } 1850 } 1851 } else { 1852 eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl; 1853 } 1854 1855 Log() << Verbose(1) << "End of HasOtherBaselineBetterCandidate" << endl; 1856 1857 return result; 1858 }; 2032 //bool Tesselation::HasOtherBaselineBetterCandidate(CandidateForTesselation &CandidateLine, const TesselPoint * const ThirdNode, double RADIUS, const LinkedCell * const LC) const 2033 //{ 2034 // Info FunctionInfo(__func__); 2035 // bool result = false; 2036 // Vector CircleCenter; 2037 // Vector CirclePlaneNormal; 2038 // Vector OldSphereCenter; 2039 // Vector SearchDirection; 2040 // Vector helper; 2041 // TesselPoint *OtherOptCandidate = NULL; 2042 // double OtherShortestAngle = 2.*M_PI; // This will indicate the quadrant. 2043 // double radius, CircleRadius; 2044 // BoundaryLineSet *Line = NULL; 2045 // BoundaryTriangleSet *T = NULL; 2046 // 2047 // // check both other lines 2048 // PointMap::const_iterator FindPoint = PointsOnBoundary.find(ThirdNode->nr); 2049 // if (FindPoint != PointsOnBoundary.end()) { 2050 // for (int i=0;i<2;i++) { 2051 // LineMap::const_iterator FindLine = (FindPoint->second)->lines.find(BaseRay->endpoints[0]->node->nr); 2052 // if (FindLine != (FindPoint->second)->lines.end()) { 2053 // Line = FindLine->second; 2054 // Log() << Verbose(0) << "Found line " << *Line << "." << endl; 2055 // if (Line->triangles.size() == 1) { 2056 // T = Line->triangles.begin()->second; 2057 // // construct center of circle 2058 // CircleCenter.CopyVector(Line->endpoints[0]->node->node); 2059 // CircleCenter.AddVector(Line->endpoints[1]->node->node); 2060 // CircleCenter.Scale(0.5); 2061 // 2062 // // construct normal vector of circle 2063 // CirclePlaneNormal.CopyVector(Line->endpoints[0]->node->node); 2064 // CirclePlaneNormal.SubtractVector(Line->endpoints[1]->node->node); 2065 // 2066 // // calculate squared radius of circle 2067 // radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 2068 // if (radius/4. < RADIUS*RADIUS) { 2069 // CircleRadius = RADIUS*RADIUS - radius/4.; 2070 // CirclePlaneNormal.Normalize(); 2071 // //Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2072 // 2073 // // construct old center 2074 // GetCenterofCircumcircle(&OldSphereCenter, *T->endpoints[0]->node->node, *T->endpoints[1]->node->node, *T->endpoints[2]->node->node); 2075 // helper.CopyVector(&T->NormalVector); // normal vector ensures that this is correct center of the two possible ones 2076 // radius = Line->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 2077 // helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2078 // OldSphereCenter.AddVector(&helper); 2079 // OldSphereCenter.SubtractVector(&CircleCenter); 2080 // //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 2081 // 2082 // // construct SearchDirection 2083 // SearchDirection.MakeNormalVector(&T->NormalVector, &CirclePlaneNormal); 2084 // helper.CopyVector(Line->endpoints[0]->node->node); 2085 // helper.SubtractVector(ThirdNode->node); 2086 // if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 2087 // SearchDirection.Scale(-1.); 2088 // SearchDirection.ProjectOntoPlane(&OldSphereCenter); 2089 // SearchDirection.Normalize(); 2090 // Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2091 // if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 2092 // // rotated the wrong way! 2093 // eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; 2094 // } 2095 // 2096 // // add third point 2097 // FindThirdPointForTesselation(T->NormalVector, SearchDirection, OldSphereCenter, OptCandidates, ThirdNode, RADIUS, LC); 2098 // for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); ++it) { 2099 // if (((*it) == BaseRay->endpoints[0]->node) || ((*it) == BaseRay->endpoints[1]->node)) // skip if it's the same triangle than suggested 2100 // continue; 2101 // Log() << Verbose(0) << " Third point candidate is " << (*it) 2102 // << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 2103 // Log() << Verbose(0) << " Baseline is " << *BaseRay << endl; 2104 // 2105 // // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 2106 // TesselPoint *PointCandidates[3]; 2107 // PointCandidates[0] = (*it); 2108 // PointCandidates[1] = BaseRay->endpoints[0]->node; 2109 // PointCandidates[2] = BaseRay->endpoints[1]->node; 2110 // bool check=false; 2111 // int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 2112 // // If there is no triangle, add it regularly. 2113 // if (existentTrianglesCount == 0) { 2114 // SetTesselationPoint((*it), 0); 2115 // SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 2116 // SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 2117 // 2118 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 2119 // OtherOptCandidate = (*it); 2120 // check = true; 2121 // } 2122 // } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 2123 // SetTesselationPoint((*it), 0); 2124 // SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 2125 // SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 2126 // 2127 // // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 2128 // // i.e. at least one of the three lines must be present with TriangleCount <= 1 2129 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 2130 // OtherOptCandidate = (*it); 2131 // check = true; 2132 // } 2133 // } 2134 // 2135 // if (check) { 2136 // if (ShortestAngle > OtherShortestAngle) { 2137 // Log() << Verbose(0) << "There is a better candidate than " << *ThirdNode << " with " << ShortestAngle << " from baseline " << *Line << ": " << *OtherOptCandidate << " with " << OtherShortestAngle << "." << endl; 2138 // result = true; 2139 // break; 2140 // } 2141 // } 2142 // } 2143 // delete(OptCandidates); 2144 // if (result) 2145 // break; 2146 // } else { 2147 // Log() << Verbose(0) << "Circumcircle for base line " << *Line << " and base triangle " << T << " is too big!" << endl; 2148 // } 2149 // } else { 2150 // eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl; 2151 // } 2152 // } else { 2153 // Log() << Verbose(1) << "No present baseline between " << BaseRay->endpoints[0] << " and candidate " << *ThirdNode << "." << endl; 2154 // } 2155 // } 2156 // } else { 2157 // eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl; 2158 // } 2159 // 2160 // return result; 2161 //}; 1859 2162 1860 2163 /** This function finds a triangle to a line, adjacent to an existing one. 1861 2164 * @param out output stream for debugging 1862 * @param Line currentbaseline to search from2165 * @param CandidateLine current cadndiate baseline to search from 1863 2166 * @param T current triangle which \a Line is edge of 1864 2167 * @param RADIUS radius of the rolling ball … … 1866 2169 * @param *LC LinkedCell structure with neighbouring points 1867 2170 */ 1868 bool Tesselation::FindNextSuitableTriangle( BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)1869 { 1870 Log() << Verbose(0) << "Begin of FindNextSuitableTriangle\n";2171 bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC) 2172 { 2173 Info FunctionInfo(__func__); 1871 2174 bool result = true; 1872 CandidateList *OptCandidates = new CandidateList();1873 2175 1874 2176 Vector CircleCenter; 1875 2177 Vector CirclePlaneNormal; 1876 Vector OldSphereCenter;2178 Vector RelativeSphereCenter; 1877 2179 Vector SearchDirection; 1878 2180 Vector helper; 1879 2181 TesselPoint *ThirdNode = NULL; 1880 2182 LineMap::iterator testline; 1881 double ShortestAngle = 2.*M_PI; // This will indicate the quadrant.1882 2183 double radius, CircleRadius; 1883 2184 1884 Log() << Verbose(1) << "Current baseline is " << Line << " of triangle " << T << "." << endl;1885 2185 for (int i=0;i<3;i++) 1886 if ((T.endpoints[i]->node != Line.endpoints[0]->node) && (T.endpoints[i]->node != Line.endpoints[1]->node))2186 if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) { 1887 2187 ThirdNode = T.endpoints[i]->node; 2188 break; 2189 } 2190 Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl; 1888 2191 1889 2192 // construct center of circle 1890 CircleCenter.CopyVector( Line.endpoints[0]->node->node);1891 CircleCenter.AddVector( Line.endpoints[1]->node->node);2193 CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2194 CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node); 1892 2195 CircleCenter.Scale(0.5); 1893 2196 1894 2197 // construct normal vector of circle 1895 CirclePlaneNormal.CopyVector( Line.endpoints[0]->node->node);1896 CirclePlaneNormal.SubtractVector( Line.endpoints[1]->node->node);2198 CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2199 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 1897 2200 1898 2201 // calculate squared radius of circle 1899 2202 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 1900 2203 if (radius/4. < RADIUS*RADIUS) { 2204 // construct relative sphere center with now known CircleCenter 2205 RelativeSphereCenter.CopyVector(&T.SphereCenter); 2206 RelativeSphereCenter.SubtractVector(&CircleCenter); 2207 1901 2208 CircleRadius = RADIUS*RADIUS - radius/4.; 1902 2209 CirclePlaneNormal.Normalize(); 1903 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 1904 1905 // construct old center 1906 GetCenterofCircumcircle(&OldSphereCenter, *T.endpoints[0]->node->node, *T.endpoints[1]->node->node, *T.endpoints[2]->node->node); 1907 helper.CopyVector(&T.NormalVector); // normal vector ensures that this is correct center of the two possible ones 1908 radius = Line.endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 1909 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 1910 OldSphereCenter.AddVector(&helper); 1911 OldSphereCenter.SubtractVector(&CircleCenter); 1912 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 1913 1914 // construct SearchDirection 1915 SearchDirection.MakeNormalVector(&T.NormalVector, &CirclePlaneNormal); 1916 helper.CopyVector(Line.endpoints[0]->node->node); 2210 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2211 2212 Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl; 2213 2214 // construct SearchDirection and an "outward pointer" 2215 SearchDirection.MakeNormalVector(&RelativeSphereCenter, &CirclePlaneNormal); 2216 helper.CopyVector(&CircleCenter); 1917 2217 helper.SubtractVector(ThirdNode->node); 1918 2218 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 1919 2219 SearchDirection.Scale(-1.); 1920 SearchDirection.ProjectOntoPlane(&OldSphereCenter); 1921 SearchDirection.Normalize(); 1922 Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 1923 if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 2220 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2221 if (fabs(RelativeSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 1924 2222 // rotated the wrong way! 1925 2223 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; … … 1927 2225 1928 2226 // add third point 1929 FindThirdPointForTesselation(T.NormalVector, SearchDirection, OldSphereCenter, &Line, ThirdNode, OptCandidates, &ShortestAngle, RADIUS, LC);2227 FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdNode, RADIUS, LC); 1930 2228 1931 2229 } else { 1932 Log() << Verbose( 1) << "Circumcircle for base line " <<Line << " and base triangle " << T << " is too big!" << endl;1933 } 1934 1935 if ( OptCandidates->begin() == OptCandidates->end()) {2230 Log() << Verbose(0) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and base triangle " << T << " is too big!" << endl; 2231 } 2232 2233 if (CandidateLine.pointlist.empty()) { 1936 2234 eLog() << Verbose(2) << "Could not find a suitable candidate." << endl; 1937 2235 return false; 1938 2236 } 1939 Log() << Verbose(1) << "Third Points are "; 1940 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1941 Log() << Verbose(1) << " " << *(*it)->point << endl; 1942 } 1943 1944 BoundaryLineSet *BaseRay = &Line; 1945 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 1946 Log() << Verbose(1) << " Third point candidate is " << *(*it)->point 1947 << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 1948 Log() << Verbose(1) << " Baseline is " << *BaseRay << endl; 1949 1950 // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 1951 TesselPoint *PointCandidates[3]; 1952 PointCandidates[0] = (*it)->point; 1953 PointCandidates[1] = BaseRay->endpoints[0]->node; 1954 PointCandidates[2] = BaseRay->endpoints[1]->node; 1955 int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 1956 1957 BTS = NULL; 1958 // check for present edges and whether we reach better candidates from them 1959 if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) { 1960 result = false; 1961 break; 1962 } else { 1963 // If there is no triangle, add it regularly. 1964 if (existentTrianglesCount == 0) { 1965 AddTesselationPoint((*it)->point, 0); 1966 AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 1967 AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 1968 1969 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 1970 AddTesselationLine(TPS[0], TPS[1], 0); 1971 AddTesselationLine(TPS[0], TPS[2], 1); 1972 AddTesselationLine(TPS[1], TPS[2], 2); 1973 1974 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 1975 AddTesselationTriangle(); 1976 (*it)->OptCenter.Scale(-1.); 1977 BTS->GetNormalVector((*it)->OptCenter); 1978 (*it)->OptCenter.Scale(-1.); 1979 1980 Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector 1981 << " for this triangle ... " << endl; 1982 //Log() << Verbose(1) << "We have "<< TrianglesOnBoundaryCount << " for line " << *BaseRay << "." << endl; 1983 } else { 1984 eLog() << Verbose(2) << "This triangle consisting of "; 1985 Log() << Verbose(0) << *(*it)->point << ", "; 1986 Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 1987 Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 1988 Log() << Verbose(0) << "exists and is not added, as it does not seem helpful!" << endl; 1989 result = false; 1990 } 1991 } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 1992 AddTesselationPoint((*it)->point, 0); 1993 AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 1994 AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 1995 1996 // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 1997 // i.e. at least one of the three lines must be present with TriangleCount <= 1 1998 if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 1999 AddTesselationLine(TPS[0], TPS[1], 0); 2000 AddTesselationLine(TPS[0], TPS[2], 1); 2001 AddTesselationLine(TPS[1], TPS[2], 2); 2002 2003 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 2004 AddTesselationTriangle(); // add to global map 2005 2006 (*it)->OtherOptCenter.Scale(-1.); 2007 BTS->GetNormalVector((*it)->OtherOptCenter); 2008 (*it)->OtherOptCenter.Scale(-1.); 2009 2010 eLog() << Verbose(2) << "--> WARNING: Special new triangle with " << *BTS << " and normal vector " << BTS->NormalVector << " for this triangle ... " << endl; 2011 Log() << Verbose(1) << "We have "<< BaseRay->triangles.size() << " for line " << BaseRay << "." << endl; 2012 } else { 2013 eLog() << Verbose(2) << "This triangle consisting of " << *(*it)->point << ", " << *BaseRay->endpoints[0]->node << " and " << *BaseRay->endpoints[1]->node << " " << "exists and is not added, as it does not seem helpful!" << endl; 2014 result = false; 2015 } 2016 } else { 2017 Log() << Verbose(1) << "This triangle consisting of "; 2018 Log() << Verbose(0) << *(*it)->point << ", "; 2019 Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2020 Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2021 Log() << Verbose(0) << "is invalid!" << endl; 2022 result = false; 2023 } 2024 } 2025 2026 // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point)) 2027 BaseRay = BLS[0]; 2028 if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) { 2029 eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl; 2030 exit(255); 2031 } 2032 2033 } 2034 2035 // remove all candidates from the list and then the list itself 2036 class CandidateForTesselation *remover = NULL; 2037 for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2038 remover = *it; 2039 delete(remover); 2040 } 2041 delete(OptCandidates); 2042 Log() << Verbose(0) << "End of FindNextSuitableTriangle\n"; 2237 Log() << Verbose(0) << "Third Points are: " << endl; 2238 for (TesselPointList::iterator it = CandidateLine.pointlist.begin(); it != CandidateLine.pointlist.end(); ++it) { 2239 Log() << Verbose(0) << " " << *(*it) << endl; 2240 } 2241 2242 return true; 2243 2244 // BoundaryLineSet *BaseRay = CandidateLine.BaseLine; 2245 // for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2246 // Log() << Verbose(0) << "Third point candidate is " << *(*it)->point 2247 // << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 2248 // Log() << Verbose(0) << "Baseline is " << *BaseRay << endl; 2249 // 2250 // // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 2251 // TesselPoint *PointCandidates[3]; 2252 // PointCandidates[0] = (*it)->point; 2253 // PointCandidates[1] = BaseRay->endpoints[0]->node; 2254 // PointCandidates[2] = BaseRay->endpoints[1]->node; 2255 // int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 2256 // 2257 // BTS = NULL; 2258 // // check for present edges and whether we reach better candidates from them 2259 // //if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) { 2260 // if (0) { 2261 // result = false; 2262 // break; 2263 // } else { 2264 // // If there is no triangle, add it regularly. 2265 // if (existentTrianglesCount == 0) { 2266 // AddTesselationPoint((*it)->point, 0); 2267 // AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 2268 // AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 2269 // 2270 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 2271 // CandidateLine.point = (*it)->point; 2272 // CandidateLine.OptCenter.CopyVector(&((*it)->OptCenter)); 2273 // CandidateLine.OtherOptCenter.CopyVector(&((*it)->OtherOptCenter)); 2274 // CandidateLine.ShortestAngle = ShortestAngle; 2275 // } else { 2276 //// eLog() << Verbose(1) << "This triangle consisting of "; 2277 //// Log() << Verbose(0) << *(*it)->point << ", "; 2278 //// Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2279 //// Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2280 //// Log() << Verbose(0) << "exists and is not added, as it 0x80000000006fc150(does not seem helpful!" << endl; 2281 // result = false; 2282 // } 2283 // } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 2284 // AddTesselationPoint((*it)->point, 0); 2285 // AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 2286 // AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 2287 // 2288 // // We demand that at most one new degenerate line is created and that this line also already exists (which has to be the case due to existentTrianglesCount == 1) 2289 // // i.e. at least one of the three lines must be present with TriangleCount <= 1 2290 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS) || CandidateLine.BaseLine->skipped) { 2291 // CandidateLine.point = (*it)->point; 2292 // CandidateLine.OptCenter.CopyVector(&(*it)->OptCenter); 2293 // CandidateLine.OtherOptCenter.CopyVector(&(*it)->OtherOptCenter); 2294 // CandidateLine.ShortestAngle = ShortestAngle+2.*M_PI; 2295 // 2296 // } else { 2297 //// eLog() << Verbose(1) << "This triangle consisting of " << *(*it)->point << ", " << *BaseRay->endpoints[0]->node << " and " << *BaseRay->endpoints[1]->node << " " << "exists and is not added, as it does not seem helpful!" << endl; 2298 // result = false; 2299 // } 2300 // } else { 2301 //// Log() << Verbose(1) << "This triangle consisting of "; 2302 //// Log() << Verbose(0) << *(*it)->point << ", "; 2303 //// Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2304 //// Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2305 //// Log() << Verbose(0) << "is invalid!" << endl; 2306 // result = false; 2307 // } 2308 // } 2309 // 2310 // // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point)) 2311 // BaseRay = BLS[0]; 2312 // if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) { 2313 // eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl; 2314 // exit(255); 2315 // } 2316 // 2317 // } 2318 // 2319 // // remove all candidates from the list and then the list itself 2320 // class CandidateForTesselation *remover = NULL; 2321 // for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2322 // remover = *it; 2323 // delete(remover); 2324 // } 2325 // delete(OptCandidates); 2043 2326 return result; 2327 }; 2328 2329 /** Adds the present line and candidate point from \a &CandidateLine to the Tesselation. 2330 * \param CandidateLine triangle to add 2331 * \NOTE we need the copy operator here as the original CandidateForTesselation is removed in AddTesselationLine() 2332 */ 2333 void Tesselation::AddCandidateTriangle(CandidateForTesselation CandidateLine) 2334 { 2335 Info FunctionInfo(__func__); 2336 Vector Center; 2337 TesselPoint * const TurningPoint = CandidateLine.BaseLine->endpoints[0]->node; 2338 2339 // fill the set of neighbours 2340 Center.CopyVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2341 Center.SubtractVector(TurningPoint->node); 2342 set<TesselPoint*> SetOfNeighbours; 2343 SetOfNeighbours.insert(CandidateLine.BaseLine->endpoints[1]->node); 2344 for (TesselPointList::iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); Runner++) 2345 SetOfNeighbours.insert(*Runner); 2346 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, &Center); 2347 2348 // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles) 2349 TesselPointList::iterator Runner = connectedClosestPoints->begin(); 2350 TesselPointList::iterator Sprinter = Runner; 2351 Sprinter++; 2352 while(Sprinter != connectedClosestPoints->end()) { 2353 // add the points 2354 AddTesselationPoint(TurningPoint, 0); 2355 AddTesselationPoint((*Runner), 1); 2356 AddTesselationPoint((*Sprinter), 2); 2357 2358 2359 // add the lines 2360 AddTesselationLine(TPS[0], TPS[1], 0); 2361 AddTesselationLine(TPS[0], TPS[2], 1); 2362 AddTesselationLine(TPS[1], TPS[2], 2); 2363 2364 // add the triangles 2365 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 2366 AddTesselationTriangle(); 2367 BTS->GetCenter(&Center); 2368 Center.SubtractVector(&CandidateLine.OptCenter); 2369 BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter); 2370 BTS->GetNormalVector(Center); 2371 2372 Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector << "." << endl; 2373 Runner = Sprinter; 2374 Sprinter++; 2375 } 2376 delete(connectedClosestPoints); 2044 2377 }; 2045 2378 … … 2053 2386 class BoundaryPointSet *Tesselation::IsConvexRectangle(class BoundaryLineSet *Base) 2054 2387 { 2388 Info FunctionInfo(__func__); 2055 2389 class BoundaryPointSet *Spot = NULL; 2056 2390 class BoundaryLineSet *OtherBase; … … 2064 2398 OtherBase = new class BoundaryLineSet(BPS,-1); 2065 2399 2066 Log() << Verbose( 3) << "INFO: Current base line is " << *Base << "." << endl;2067 Log() << Verbose( 3) << "INFO: Other base line is " << *OtherBase << "." << endl;2400 Log() << Verbose(1) << "INFO: Current base line is " << *Base << "." << endl; 2401 Log() << Verbose(1) << "INFO: Other base line is " << *OtherBase << "." << endl; 2068 2402 2069 2403 // get the closest point on each line to the other line … … 2085 2419 delete(ClosestPoint); 2086 2420 if ((distance[0] * distance[1]) > 0) { // have same sign? 2087 Log() << Verbose( 3) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << "' rectangle is concave." << endl;2421 Log() << Verbose(1) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << "' rectangle is concave." << endl; 2088 2422 if (distance[0] < distance[1]) { 2089 2423 Spot = Base->endpoints[0]; … … 2093 2427 return Spot; 2094 2428 } else { // different sign, i.e. we are in between 2095 Log() << Verbose( 3) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl;2429 Log() << Verbose(0) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl; 2096 2430 return NULL; 2097 2431 } … … 2101 2435 void Tesselation::PrintAllBoundaryPoints(ofstream *out) const 2102 2436 { 2437 Info FunctionInfo(__func__); 2103 2438 // print all lines 2104 Log() << Verbose( 1) << "Printing all boundary points for debugging:" << endl;2439 Log() << Verbose(0) << "Printing all boundary points for debugging:" << endl; 2105 2440 for (PointMap::const_iterator PointRunner = PointsOnBoundary.begin();PointRunner != PointsOnBoundary.end(); PointRunner++) 2106 Log() << Verbose( 2) << *(PointRunner->second) << endl;2441 Log() << Verbose(0) << *(PointRunner->second) << endl; 2107 2442 }; 2108 2443 2109 2444 void Tesselation::PrintAllBoundaryLines(ofstream *out) const 2110 2445 { 2446 Info FunctionInfo(__func__); 2111 2447 // print all lines 2112 Log() << Verbose( 1) << "Printing all boundary lines for debugging:" << endl;2448 Log() << Verbose(0) << "Printing all boundary lines for debugging:" << endl; 2113 2449 for (LineMap::const_iterator LineRunner = LinesOnBoundary.begin(); LineRunner != LinesOnBoundary.end(); LineRunner++) 2114 Log() << Verbose( 2) << *(LineRunner->second) << endl;2450 Log() << Verbose(0) << *(LineRunner->second) << endl; 2115 2451 }; 2116 2452 2117 2453 void Tesselation::PrintAllBoundaryTriangles(ofstream *out) const 2118 2454 { 2455 Info FunctionInfo(__func__); 2119 2456 // print all triangles 2120 Log() << Verbose( 1) << "Printing all boundary triangles for debugging:" << endl;2457 Log() << Verbose(0) << "Printing all boundary triangles for debugging:" << endl; 2121 2458 for (TriangleMap::const_iterator TriangleRunner = TrianglesOnBoundary.begin(); TriangleRunner != TrianglesOnBoundary.end(); TriangleRunner++) 2122 Log() << Verbose( 2) << *(TriangleRunner->second) << endl;2459 Log() << Verbose(0) << *(TriangleRunner->second) << endl; 2123 2460 }; 2124 2461 … … 2130 2467 double Tesselation::PickFarthestofTwoBaselines(class BoundaryLineSet *Base) 2131 2468 { 2469 Info FunctionInfo(__func__); 2132 2470 class BoundaryLineSet *OtherBase; 2133 2471 Vector *ClosestPoint[2]; … … 2141 2479 OtherBase = new class BoundaryLineSet(BPS,-1); 2142 2480 2143 Log() << Verbose( 3) << "INFO: Current base line is " << *Base << "." << endl;2144 Log() << Verbose( 3) << "INFO: Other base line is " << *OtherBase << "." << endl;2481 Log() << Verbose(0) << "INFO: Current base line is " << *Base << "." << endl; 2482 Log() << Verbose(0) << "INFO: Other base line is " << *OtherBase << "." << endl; 2145 2483 2146 2484 // get the closest point on each line to the other line … … 2162 2500 2163 2501 if (Distance.NormSquared() < MYEPSILON) { // check for intersection 2164 Log() << Verbose( 3) << "REJECT: Both lines have an intersection: Nothing to do." << endl;2502 Log() << Verbose(0) << "REJECT: Both lines have an intersection: Nothing to do." << endl; 2165 2503 return false; 2166 2504 } else { // check for sign against BaseLineNormal … … 2172 2510 } 2173 2511 for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2174 Log() << Verbose( 4) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;2512 Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl; 2175 2513 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 2176 2514 } … … 2178 2516 2179 2517 if (Distance.ScalarProduct(&BaseLineNormal) > MYEPSILON) { // Distance points outwards, hence OtherBase higher than Base -> flip 2180 Log() << Verbose( 2) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl;2518 Log() << Verbose(0) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl; 2181 2519 // calculate volume summand as a general tetraeder 2182 2520 return volume; 2183 2521 } else { // Base higher than OtherBase -> do nothing 2184 Log() << Verbose( 2) << "REJECT: Base line is higher: Nothing to do." << endl;2522 Log() << Verbose(0) << "REJECT: Base line is higher: Nothing to do." << endl; 2185 2523 return 0.; 2186 2524 } … … 2197 2535 class BoundaryLineSet * Tesselation::FlipBaseline(class BoundaryLineSet *Base) 2198 2536 { 2537 Info FunctionInfo(__func__); 2199 2538 class BoundaryLineSet *OldLines[4], *NewLine; 2200 2539 class BoundaryPointSet *OldPoints[2]; … … 2203 2542 int i,m; 2204 2543 2205 Log() << Verbose(1) << "Begin of FlipBaseline" << endl;2206 2207 2544 // calculate NormalVector for later use 2208 2545 BaseLineNormal.Zero(); … … 2212 2549 } 2213 2550 for (TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2214 Log() << Verbose( 4) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl;2551 Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl; 2215 2552 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 2216 2553 } … … 2225 2562 i=0; 2226 2563 m=0; 2227 Log() << Verbose( 3) << "The four old lines are: ";2564 Log() << Verbose(0) << "The four old lines are: "; 2228 2565 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) 2229 2566 for (int j=0;j<3;j++) // all of their endpoints and baselines … … 2233 2570 } 2234 2571 Log() << Verbose(0) << endl; 2235 Log() << Verbose( 3) << "The two old points are: ";2572 Log() << Verbose(0) << "The two old points are: "; 2236 2573 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) 2237 2574 for (int j=0;j<3;j++) // all of their endpoints and baselines … … 2259 2596 2260 2597 // remove triangles and baseline removes itself 2261 Log() << Verbose( 3) << "INFO: Deleting baseline " << *Base << " from global list." << endl;2598 Log() << Verbose(0) << "INFO: Deleting baseline " << *Base << " from global list." << endl; 2262 2599 OldBaseLineNr = Base->Nr; 2263 2600 m=0; 2264 2601 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2265 Log() << Verbose( 3) << "INFO: Deleting triangle " << *(runner->second) << "." << endl;2602 Log() << Verbose(0) << "INFO: Deleting triangle " << *(runner->second) << "." << endl; 2266 2603 OldTriangleNrs[m++] = runner->second->Nr; 2267 2604 RemoveTesselationTriangle(runner->second); … … 2273 2610 NewLine = new class BoundaryLineSet(BPS, OldBaseLineNr); 2274 2611 LinesOnBoundary.insert(LinePair(OldBaseLineNr, NewLine)); // no need for check for unique insertion as NewLine is definitely a new one 2275 Log() << Verbose( 3) << "INFO: Created new baseline " << *NewLine << "." << endl;2612 Log() << Verbose(0) << "INFO: Created new baseline " << *NewLine << "." << endl; 2276 2613 2277 2614 // construct new triangles with flipped baseline … … 2288 2625 BTS->GetNormalVector(BaseLineNormal); 2289 2626 AddTesselationTriangle(OldTriangleNrs[0]); 2290 Log() << Verbose( 3) << "INFO: Created new triangle " << *BTS << "." << endl;2627 Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl; 2291 2628 2292 2629 BLS[0] = (i==2 ? OldLines[3] : OldLines[2]); … … 2296 2633 BTS->GetNormalVector(BaseLineNormal); 2297 2634 AddTesselationTriangle(OldTriangleNrs[1]); 2298 Log() << Verbose( 3) << "INFO: Created new triangle " << *BTS << "." << endl;2635 Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl; 2299 2636 } else { 2300 Log() << Verbose(1) << "The four old lines do not connect, something's utterly wrong here!" << endl;2637 eLog() << Verbose(0) << "The four old lines do not connect, something's utterly wrong here!" << endl; 2301 2638 return NULL; 2302 2639 } 2303 2640 2304 Log() << Verbose(1) << "End of FlipBaseline" << endl;2305 2641 return NewLine; 2306 2642 }; … … 2317 2653 void Tesselation::FindSecondPointForTesselation(TesselPoint* a, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC) 2318 2654 { 2319 Log() << Verbose(2) << "Begin of FindSecondPointForTesselation" << endl;2655 Info FunctionInfo(__func__); 2320 2656 Vector AngleCheck; 2321 2657 class TesselPoint* Candidate = NULL; … … 2338 2674 Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1; 2339 2675 } 2340 Log() << Verbose( 3) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :"2676 Log() << Verbose(0) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :" 2341 2677 << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl; 2342 2678 … … 2345 2681 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 2346 2682 const LinkedNodes *List = LC->GetCurrentCell(); 2347 //Log() << Verbose( 2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;2683 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 2348 2684 if (List != NULL) { 2349 2685 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 2376 2712 angle = AngleCheck.Angle(&Oben); 2377 2713 if (angle < Storage[0]) { 2378 //Log() << Verbose( 3) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]);2379 Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n";2714 //Log() << Verbose(1) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]); 2715 Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n"; 2380 2716 OptCandidate = Candidate; 2381 2717 Storage[0] = angle; 2382 //Log() << Verbose( 3) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]);2718 //Log() << Verbose(1) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]); 2383 2719 } else { 2384 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl;2720 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl; 2385 2721 } 2386 2722 } else { 2387 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl;2723 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl; 2388 2724 } 2389 2725 } else { 2390 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl;2726 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl; 2391 2727 } 2392 2728 } 2393 2729 } else { 2394 Log() << Verbose( 3) << "Linked cell list is empty." << endl;2730 Log() << Verbose(0) << "Linked cell list is empty." << endl; 2395 2731 } 2396 2732 } 2397 Log() << Verbose(2) << "End of FindSecondPointForTesselation" << endl;2398 2733 }; 2399 2734 … … 2424 2759 * @param SearchDirection general direction where to search for the next point, relative to center of BaseLine 2425 2760 * @param OldSphereCenter center of sphere for base triangle, relative to center of BaseLine, giving null angle for the parameter circle 2426 * @param BaseLine BoundaryLineSet with the current base line2761 * @param CandidateLine CandidateForTesselation with the current base line and list of candidates and ShortestAngle 2427 2762 * @param ThirdNode third point to avoid in search 2428 * @param candidates list of equally good candidates to return2429 * @param ShortestAngle the current path length on this circle band for the current OptCandidate2430 2763 * @param RADIUS radius of sphere 2431 2764 * @param *LC LinkedCell structure with neighbouring points 2432 2765 */ 2433 void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, class BoundaryLineSet *BaseLine, const class TesselPoint * const ThirdNode, CandidateList* &candidates, double *ShortestAngle, const double RADIUS, const LinkedCell *LC) const 2434 { 2766 void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint * const ThirdNode, const double RADIUS, const LinkedCell *LC) const 2767 { 2768 Info FunctionInfo(__func__); 2435 2769 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 2436 2770 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in … … 2440 2774 Vector NewNormalVector; // normal vector of the Candidate's triangle 2441 2775 Vector helper, OptCandidateCenter, OtherOptCandidateCenter; 2776 Vector RelativeOldSphereCenter; 2777 Vector NewPlaneCenter; 2442 2778 double CircleRadius; // radius of this circle 2443 2779 double radius; 2780 double otherradius; 2444 2781 double alpha, Otheralpha; // angles (i.e. parameter for the circle). 2445 2782 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; 2446 2783 TesselPoint *Candidate = NULL; 2447 CandidateForTesselation *optCandidate = NULL; 2448 2449 Log() << Verbose(1) << "Begin of FindThirdPointForTesselation" << endl; 2450 2451 Log() << Verbose(2) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl; 2784 2785 Log() << Verbose(1) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl; 2452 2786 2453 2787 // construct center of circle 2454 CircleCenter.CopyVector( BaseLine->endpoints[0]->node->node);2455 CircleCenter.AddVector( BaseLine->endpoints[1]->node->node);2788 CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2789 CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2456 2790 CircleCenter.Scale(0.5); 2457 2791 2458 2792 // construct normal vector of circle 2459 CirclePlaneNormal.CopyVector(BaseLine->endpoints[0]->node->node); 2460 CirclePlaneNormal.SubtractVector(BaseLine->endpoints[1]->node->node); 2793 CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2794 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2795 2796 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 2797 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 2461 2798 2462 2799 // calculate squared radius TesselPoint *ThirdNode,f circle 2463 radius = CirclePlaneNormal. ScalarProduct(&CirclePlaneNormal);2464 if (radius /4.< RADIUS*RADIUS) {2465 CircleRadius = RADIUS*RADIUS - radius /4.;2800 radius = CirclePlaneNormal.NormSquared()/4.; 2801 if (radius < RADIUS*RADIUS) { 2802 CircleRadius = RADIUS*RADIUS - radius; 2466 2803 CirclePlaneNormal.Normalize(); 2467 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;2804 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2468 2805 2469 2806 // test whether old center is on the band's plane 2470 if (fabs( OldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) {2471 eLog() << Verbose(1) << "Something's very wrong here: OldSphereCenter is not on the band's plane as desired by " << fabs(OldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl;2472 OldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal);2473 } 2474 radius = OldSphereCenter.ScalarProduct(&OldSphereCenter);2807 if (fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { 2808 eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl; 2809 RelativeOldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal); 2810 } 2811 radius = RelativeOldSphereCenter.NormSquared(); 2475 2812 if (fabs(radius - CircleRadius) < HULLEPSILON) { 2476 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " <<OldSphereCenter << "." << endl;2813 Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl; 2477 2814 2478 2815 // check SearchDirection 2479 //Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl;2480 if (fabs( OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way!2816 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2817 if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way! 2481 2818 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl; 2482 2819 } … … 2486 2823 for(int i=0;i<NDIM;i++) // store indices of this cell 2487 2824 N[i] = LC->n[i]; 2488 //Log() << Verbose( 2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;2825 //Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 2489 2826 } else { 2490 2827 eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl; … … 2492 2829 } 2493 2830 // then go through the current and all neighbouring cells and check the contained points for possible candidates 2494 //Log() << Verbose( 2) << "LC Intervals:";2831 //Log() << Verbose(1) << "LC Intervals:"; 2495 2832 for (int i=0;i<NDIM;i++) { 2496 2833 Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0; … … 2503 2840 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 2504 2841 const LinkedNodes *List = LC->GetCurrentCell(); 2505 //Log() << Verbose( 2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;2842 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 2506 2843 if (List != NULL) { 2507 2844 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 2509 2846 2510 2847 // check for three unique points 2511 //Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " at " << Candidate->node<< "." << endl;2512 if ((Candidate != BaseLine->endpoints[0]->node) && (Candidate !=BaseLine->endpoints[1]->node) ){2513 2514 // construct both new centers2515 GetCenterofCircumcircle(&New SphereCenter, *BaseLine->endpoints[0]->node->node, *BaseLine->endpoints[1]->node->node, *Candidate->node);2516 OtherNewSphereCenter.CopyVector(&NewSphereCenter);2517 2518 if ( (NewNormalVector.MakeNormalVector(BaseLine->endpoints[0]->node->node, BaseLine->endpoints[1]->node->node, Candidate->node))2519 && (fabs(NewNormalVector. ScalarProduct(&NewNormalVector)) > HULLEPSILON)2848 Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl; 2849 if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node) ){ 2850 2851 // find center on the plane 2852 GetCenterofCircumcircle(&NewPlaneCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node); 2853 Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl; 2854 2855 if (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node) 2856 && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON) 2520 2857 ) { 2521 helper.CopyVector(&NewNormalVector); 2522 //Log() << Verbose(2) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2523 radius = BaseLine->endpoints[0]->node->node->DistanceSquared(&NewSphereCenter); 2858 Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2859 radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewPlaneCenter); 2860 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2861 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2862 Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl; 2524 2863 if (radius < RADIUS*RADIUS) { 2864 otherradius = CandidateLine.BaseLine->endpoints[1]->node->node->DistanceSquared(&NewPlaneCenter); 2865 if (fabs(radius - otherradius) > HULLEPSILON) { 2866 eLog() << Verbose(1) << "Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius-otherradius) << endl; 2867 } 2868 // construct both new centers 2869 NewSphereCenter.CopyVector(&NewPlaneCenter); 2870 OtherNewSphereCenter.CopyVector(&NewPlaneCenter); 2871 helper.CopyVector(&NewNormalVector); 2525 2872 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2526 //Log() << Verbose(2) << "INFO: Distance of NewCircleCenter to NewSphereCenter is " << helper.Norm()<< " with sphere radius " << RADIUS << "." << endl;2873 Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl; 2527 2874 NewSphereCenter.AddVector(&helper); 2528 NewSphereCenter.SubtractVector(&CircleCenter); 2529 //Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2530 2875 Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2531 2876 // OtherNewSphereCenter is created by the same vector just in the other direction 2532 2877 helper.Scale(-1.); 2533 2878 OtherNewSphereCenter.AddVector(&helper); 2534 OtherNewSphereCenter.SubtractVector(&CircleCenter); 2535 //Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 2879 Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 2536 2880 2537 2881 alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2538 2882 Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2539 2883 alpha = min(alpha, Otheralpha); 2884 2540 2885 // if there is a better candidate, drop the current list and add the new candidate 2541 2886 // otherwise ignore the new candidate and keep the list 2542 if (*ShortestAngle > (alpha - HULLEPSILON)) { 2543 optCandidate = new CandidateForTesselation(Candidate, BaseLine, OptCandidateCenter, OtherOptCandidateCenter); 2887 if (CandidateLine.ShortestAngle > (alpha - HULLEPSILON)) { 2544 2888 if (fabs(alpha - Otheralpha) > MYEPSILON) { 2545 optCandidate->OptCenter.CopyVector(&NewSphereCenter);2546 optCandidate->OtherOptCenter.CopyVector(&OtherNewSphereCenter);2889 CandidateLine.OptCenter.CopyVector(&NewSphereCenter); 2890 CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter); 2547 2891 } else { 2548 optCandidate->OptCenter.CopyVector(&OtherNewSphereCenter);2549 optCandidate->OtherOptCenter.CopyVector(&NewSphereCenter);2892 CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter); 2893 CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter); 2550 2894 } 2551 2895 // if there is an equal candidate, add it to the list without clearing the list 2552 if (( *ShortestAngle - HULLEPSILON) < alpha) {2553 candidates->push_back(optCandidate);2554 Log() << Verbose( 2) << "ACCEPT: We have found an equally good candidate: " << *(optCandidate->point) << " with "2555 << alpha << " and circumsphere's center at " << optCandidate->OptCenter << "." << endl;2896 if ((CandidateLine.ShortestAngle - HULLEPSILON) < alpha) { 2897 CandidateLine.pointlist.push_back(Candidate); 2898 Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with " 2899 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2556 2900 } else { 2557 2901 // remove all candidates from the list and then the list itself 2558 class CandidateForTesselation *remover = NULL; 2559 for (CandidateList::iterator it = candidates->begin(); it != candidates->end(); ++it) { 2560 remover = *it; 2561 delete(remover); 2562 } 2563 candidates->clear(); 2564 candidates->push_back(optCandidate); 2565 Log() << Verbose(2) << "ACCEPT: We have found a better candidate: " << *(optCandidate->point) << " with " 2566 << alpha << " and circumsphere's center at " << optCandidate->OptCenter << "." << endl; 2902 CandidateLine.pointlist.clear(); 2903 CandidateLine.pointlist.push_back(Candidate); 2904 Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with " 2905 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2567 2906 } 2568 *ShortestAngle = alpha;2569 //Log() << Verbose(2) << "INFO: There are " << candidates->size() << " candidates in the list now." << endl;2907 CandidateLine.ShortestAngle = alpha; 2908 Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl; 2570 2909 } else { 2571 if (( optCandidate != NULL) && (optCandidate->point != NULL)) {2572 //Log() << Verbose(2) << "REJECT: Old candidate " << *(optCandidate->point) << " with " << *ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl;2910 if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) { 2911 Log() << Verbose(1) << "REJECT: Old candidate " << *(Candidate) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl; 2573 2912 } else { 2574 //Log() << Verbose(2) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl;2913 Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl; 2575 2914 } 2576 2915 } 2577 2578 2916 } else { 2579 //Log() << Verbose(2) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl;2917 Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl; 2580 2918 } 2581 2919 } else { 2582 //Log() << Verbose(2) << "REJECT: Three points from " << *BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl;2920 Log() << Verbose(1) << "REJECT: Three points from " << *CandidateLine.BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl; 2583 2921 } 2584 2922 } else { 2585 2923 if (ThirdNode != NULL) { 2586 //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl;2924 Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl; 2587 2925 } else { 2588 //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " contains Candidate " << *Candidate << "." << endl;2926 Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " contains Candidate " << *Candidate << "." << endl; 2589 2927 } 2590 2928 } … … 2597 2935 } else { 2598 2936 if (ThirdNode != NULL) 2599 Log() << Verbose( 2) << "Circumcircle for base line " << *BaseLine << " and third node " << *ThirdNode << " is too big!" << endl;2937 Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and third node " << *ThirdNode << " is too big!" << endl; 2600 2938 else 2601 Log() << Verbose(2) << "Circumcircle for base line " << *BaseLine << " is too big!" << endl; 2602 } 2603 2604 //Log() << Verbose(2) << "INFO: Sorting candidate list ..." << endl; 2605 if (candidates->size() > 1) { 2606 candidates->unique(); 2607 candidates->sort(SortCandidates); 2608 } 2609 2610 Log() << Verbose(1) << "End of FindThirdPointForTesselation" << endl; 2939 Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " is too big!" << endl; 2940 } 2941 2942 Log() << Verbose(1) << "INFO: Sorting candidate list ..." << endl; 2943 if (CandidateLine.pointlist.size() > 1) { 2944 CandidateLine.pointlist.unique(); 2945 CandidateLine.pointlist.sort(); //SortCandidates); 2946 } 2611 2947 }; 2612 2948 … … 2618 2954 class BoundaryPointSet *Tesselation::GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const 2619 2955 { 2956 Info FunctionInfo(__func__); 2620 2957 const BoundaryLineSet * lines[2] = { line1, line2 }; 2621 2958 class BoundaryPointSet *node = NULL; … … 2631 2968 { // if insertion fails, we have common endpoint 2632 2969 node = OrderTest.first->second; 2633 Log() << Verbose( 5) << "Common endpoint of lines " << *line12970 Log() << Verbose(1) << "Common endpoint of lines " << *line1 2634 2971 << " and " << *line2 << " is: " << *node << "." << endl; 2635 2972 j = 2; … … 2648 2985 list<BoundaryTriangleSet*> * Tesselation::FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const 2649 2986 { 2987 Info FunctionInfo(__func__); 2650 2988 TesselPoint *trianglePoints[3]; 2651 2989 TesselPoint *SecondPoint = NULL; … … 2653 2991 2654 2992 if (LinesOnBoundary.empty()) { 2655 Log() << Verbose(0) << "Error: There is no tesselation structure to compare the point with, please create one first.";2993 eLog() << Verbose(1) << "Error: There is no tesselation structure to compare the point with, please create one first."; 2656 2994 return NULL; 2657 2995 } … … 2661 2999 // check whether closest point is "too close" :), then it's inside 2662 3000 if (trianglePoints[0] == NULL) { 2663 Log() << Verbose( 2) << "Is the only point, no one else is closeby." << endl;3001 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 2664 3002 return NULL; 2665 3003 } 2666 3004 if (trianglePoints[0]->node->DistanceSquared(x) < MYEPSILON) { 2667 Log() << Verbose( 3) << "Point is right on a tesselation point, no nearest triangle." << endl;3005 Log() << Verbose(1) << "Point is right on a tesselation point, no nearest triangle." << endl; 2668 3006 PointMap::const_iterator PointRunner = PointsOnBoundary.find(trianglePoints[0]->nr); 2669 3007 triangles = new list<BoundaryTriangleSet*>; … … 2689 3027 } 2690 3028 } else { 2691 list<TesselPoint*> *connectedClosestPoints = GetCircleOfConnectedPoints(trianglePoints[0], x); 3029 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(trianglePoints[0]); 3030 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(connectedPoints, trianglePoints[0], x); 3031 delete(connectedPoints); 2692 3032 if (connectedClosestPoints != NULL) { 2693 3033 trianglePoints[1] = connectedClosestPoints->front(); … … 2697 3037 eLog() << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl; 2698 3038 } 2699 //Log() << Verbose( 2) << "List of triangle points:" << endl;2700 //Log() << Verbose( 3) << *trianglePoints[i] << endl;3039 //Log() << Verbose(1) << "List of triangle points:" << endl; 3040 //Log() << Verbose(2) << *trianglePoints[i] << endl; 2701 3041 } 2702 3042 2703 3043 triangles = FindTriangles(trianglePoints); 2704 Log() << Verbose( 2) << "List of possible triangles:" << endl;3044 Log() << Verbose(1) << "List of possible triangles:" << endl; 2705 3045 for(list<BoundaryTriangleSet*>::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 2706 Log() << Verbose( 3) << **Runner << endl;3046 Log() << Verbose(2) << **Runner << endl; 2707 3047 2708 3048 delete(connectedClosestPoints); 2709 3049 } else { 2710 3050 triangles = NULL; 2711 Log() << Verbose(1) << "There is no circle of connected points!" << endl;3051 eLog() << Verbose(2) << "There is no circle of connected points!" << endl; 2712 3052 } 2713 3053 } … … 2729 3069 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const 2730 3070 { 3071 Info FunctionInfo(__func__); 2731 3072 class BoundaryTriangleSet *result = NULL; 2732 3073 list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC); … … 2738 3079 if (triangles->size() == 1) { // there is no degenerate case 2739 3080 result = triangles->front(); 2740 Log() << Verbose( 2) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl;3081 Log() << Verbose(1) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl; 2741 3082 } else { 2742 3083 result = triangles->front(); 2743 3084 result->GetCenter(&Center); 2744 3085 Center.SubtractVector(x); 2745 Log() << Verbose( 2) << "Normal Vector of this front side is " << result->NormalVector << "." << endl;3086 Log() << Verbose(1) << "Normal Vector of this front side is " << result->NormalVector << "." << endl; 2746 3087 if (Center.ScalarProduct(&result->NormalVector) < 0) { 2747 3088 result = triangles->back(); 2748 Log() << Verbose( 2) << "Normal Vector of this back side is " << result->NormalVector << "." << endl;3089 Log() << Verbose(1) << "Normal Vector of this back side is " << result->NormalVector << "." << endl; 2749 3090 if (Center.ScalarProduct(&result->NormalVector) < 0) { 2750 3091 eLog() << Verbose(1) << "Front and back side yield NormalVector in wrong direction!" << endl; … … 2765 3106 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const 2766 3107 { 3108 Info FunctionInfo(__func__); 2767 3109 class BoundaryTriangleSet *result = FindClosestTriangleToPoint(&Point, LC); 2768 3110 Vector Center; … … 2774 3116 2775 3117 result->GetCenter(&Center); 2776 Log() << Verbose( 3) << "INFO: Central point of the triangle is " << Center << "." << endl;3118 Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl; 2777 3119 Center.SubtractVector(&Point); 2778 Log() << Verbose( 3) << "INFO: Vector from center to point to test is " << Center << "." << endl;3120 Log() << Verbose(2) << "INFO: Vector from center to point to test is " << Center << "." << endl; 2779 3121 if (Center.ScalarProduct(&result->NormalVector) > -MYEPSILON) { 2780 3122 Log() << Verbose(1) << Point << " is an inner point." << endl; … … 2795 3137 bool Tesselation::IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const 2796 3138 { 3139 Info FunctionInfo(__func__); 2797 3140 return IsInnerPoint(*(Point->node), LC); 2798 3141 } … … 2806 3149 set<TesselPoint*> * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const 2807 3150 { 3151 Info FunctionInfo(__func__); 2808 3152 set<TesselPoint*> *connectedPoints = new set<TesselPoint*>; 2809 3153 class BoundaryPointSet *ReferencePoint = NULL; 2810 3154 TesselPoint* current; 2811 3155 bool takePoint = false; 2812 2813 Log() << Verbose(3) << "Begin of GetAllConnectedPoints" << endl;2814 3156 2815 3157 // find the respective boundary point … … 2818 3160 ReferencePoint = PointRunner->second; 2819 3161 } else { 2820 Log() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;3162 eLog() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl; 2821 3163 ReferencePoint = NULL; 2822 3164 } … … 2842 3184 2843 3185 if (takePoint) { 2844 Log() << Verbose( 5) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl;3186 Log() << Verbose(1) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl; 2845 3187 connectedPoints->insert(current); 2846 3188 } … … 2854 3196 } 2855 3197 2856 Log() << Verbose(3) << "End of GetAllConnectedPoints" << endl;2857 3198 return connectedPoints; 2858 3199 }; … … 2866 3207 * 2867 3208 * @param *out output stream for debugging 3209 * @param *SetOfNeighbours all points for which the angle should be calculated 2868 3210 * @param *Point of which get all connected points 2869 3211 * @param *Reference Reference vector for zero angle or NULL for no preference 2870 3212 * @return list of the all points linked to the provided one 2871 3213 */ 2872 list<TesselPoint*> * Tesselation::GetCircleOfConnectedPoints(const TesselPoint* const Point, const Vector * const Reference) const 2873 { 3214 list<TesselPoint*> * Tesselation::GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3215 { 3216 Info FunctionInfo(__func__); 2874 3217 map<double, TesselPoint*> anglesOfPoints; 2875 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(Point);2876 3218 list<TesselPoint*> *connectedCircle = new list<TesselPoint*>; 2877 3219 Vector center; … … 2881 3223 Vector helper; 2882 3224 2883 if ( connectedPoints == NULL) {2884 Log() << Verbose(2) << "Could not find any connected points!" << endl;3225 if (SetOfNeighbours == NULL) { 3226 eLog() << Verbose(2) << "Could not find any connected points!" << endl; 2885 3227 delete(connectedCircle); 2886 3228 return NULL; 2887 3229 } 2888 Log() << Verbose(2) << "Begin of GetCircleOfConnectedPoints" << endl;2889 3230 2890 3231 // calculate central point 2891 for (set<TesselPoint*>::const_iterator TesselRunner = connectedPoints->begin(); TesselRunner != connectedPoints->end(); TesselRunner++)3232 for (set<TesselPoint*>::const_iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++) 2892 3233 center.AddVector((*TesselRunner)->node); 2893 3234 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size() 2894 3235 // << "; scale factor " << 1.0/connectedPoints.size(); 2895 center.Scale(1.0/ connectedPoints->size());2896 Log() << Verbose( 4) << "INFO: Calculated center of all circle points is " << center << "." << endl;3236 center.Scale(1.0/SetOfNeighbours->size()); 3237 Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl; 2897 3238 2898 3239 // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points … … 2900 3241 PlaneNormal.SubtractVector(¢er); 2901 3242 PlaneNormal.Normalize(); 2902 Log() << Verbose( 4) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;3243 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl; 2903 3244 2904 3245 // construct one orthogonal vector … … 2909 3250 } 2910 3251 if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) { 2911 Log() << Verbose( 4) << "Using alternatively " << *(*connectedPoints->begin())->node << " as angle 0 referencer." << endl;2912 AngleZero.CopyVector((* connectedPoints->begin())->node);3252 Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl; 3253 AngleZero.CopyVector((*SetOfNeighbours->begin())->node); 2913 3254 AngleZero.SubtractVector(Point->node); 2914 3255 AngleZero.ProjectOntoPlane(&PlaneNormal); … … 2918 3259 } 2919 3260 } 2920 Log() << Verbose( 4) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;3261 Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl; 2921 3262 if (AngleZero.NormSquared() > MYEPSILON) 2922 3263 OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero); 2923 3264 else 2924 3265 OrthogonalVector.MakeNormalVector(&PlaneNormal); 2925 Log() << Verbose( 4) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;3266 Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl; 2926 3267 2927 3268 // go through all connected points and calculate angle 2928 for (set<TesselPoint*>::iterator listRunner = connectedPoints->begin(); listRunner != connectedPoints->end(); listRunner++) {3269 for (set<TesselPoint*>::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 2929 3270 helper.CopyVector((*listRunner)->node); 2930 3271 helper.SubtractVector(Point->node); 2931 3272 helper.ProjectOntoPlane(&PlaneNormal); 2932 3273 double angle = GetAngle(helper, AngleZero, OrthogonalVector); 2933 Log() << Verbose( 3) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl;3274 Log() << Verbose(0) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl; 2934 3275 anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 2935 3276 } … … 2938 3279 connectedCircle->push_back(AngleRunner->second); 2939 3280 } 2940 2941 delete(connectedPoints);2942 2943 Log() << Verbose(2) << "End of GetCircleOfConnectedPoints" << endl;2944 3281 2945 3282 return connectedCircle; … … 2954 3291 list<list<TesselPoint*> *> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const 2955 3292 { 3293 Info FunctionInfo(__func__); 2956 3294 map<double, TesselPoint*> anglesOfPoints; 2957 3295 list<list<TesselPoint*> *> *ListOfPaths = new list<list<TesselPoint*> *>; … … 2998 3336 StartLine = CurrentLine; 2999 3337 CurrentPoint = CurrentLine->GetOtherEndpoint(ReferencePoint); 3000 Log() << Verbose( 3)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl;3338 Log() << Verbose(1)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl; 3001 3339 do { 3002 3340 // push current one 3003 Log() << Verbose( 3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;3341 Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl; 3004 3342 connectedPath->push_back(CurrentPoint->node); 3005 3343 3006 3344 // find next triangle 3007 3345 for (TriangleMap::iterator Runner = CurrentLine->triangles.begin(); Runner != CurrentLine->triangles.end(); Runner++) { 3008 Log() << Verbose( 3) << "INFO: Inspecting triangle " << *Runner->second << "." << endl;3346 Log() << Verbose(1) << "INFO: Inspecting triangle " << *Runner->second << "." << endl; 3009 3347 if ((Runner->second != triangle)) { // look for first triangle not equal to old one 3010 3348 triangle = Runner->second; … … 3013 3351 if (!TriangleRunner->second) { 3014 3352 TriangleRunner->second = true; 3015 Log() << Verbose( 3) << "INFO: Connecting triangle is " << *triangle << "." << endl;3353 Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl; 3016 3354 break; 3017 3355 } else { 3018 Log() << Verbose( 3) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl;3356 Log() << Verbose(1) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl; 3019 3357 triangle = NULL; 3020 3358 } … … 3031 3369 if ((triangle->lines[i] != CurrentLine) && (triangle->lines[i]->ContainsBoundaryPoint(ReferencePoint))) { // not the current line and still containing Point 3032 3370 CurrentLine = triangle->lines[i]; 3033 Log() << Verbose( 3) << "INFO: Connecting line is " << *CurrentLine << "." << endl;3371 Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl; 3034 3372 break; 3035 3373 } … … 3045 3383 } while (CurrentLine != StartLine); 3046 3384 // last point is missing, as it's on start line 3047 Log() << Verbose( 3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;3385 Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl; 3048 3386 if (StartLine->GetOtherEndpoint(ReferencePoint)->node != connectedPath->back()) 3049 3387 connectedPath->push_back(StartLine->GetOtherEndpoint(ReferencePoint)->node); … … 3051 3389 ListOfPaths->push_back(connectedPath); 3052 3390 } else { 3053 Log() << Verbose( 3) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl;3391 Log() << Verbose(1) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl; 3054 3392 } 3055 3393 } … … 3069 3407 list<list<TesselPoint*> *> * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const 3070 3408 { 3409 Info FunctionInfo(__func__); 3071 3410 list<list<TesselPoint*> *> *ListofPaths = GetPathsOfConnectedPoints(Point); 3072 3411 list<list<TesselPoint*> *> *ListofClosedPaths = new list<list<TesselPoint*> *>; … … 3082 3421 connectedPath = *ListRunner; 3083 3422 3084 Log() << Verbose( 2) << "INFO: Current path is " << connectedPath << "." << endl;3423 Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl; 3085 3424 3086 3425 // go through list, look for reappearance of starting Point and count … … 3092 3431 if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point 3093 3432 // we have a closed circle from Marker to new Marker 3094 Log() << Verbose( 3) << count+1 << ". closed path consists of: ";3433 Log() << Verbose(1) << count+1 << ". closed path consists of: "; 3095 3434 newPath = new list<TesselPoint*>; 3096 3435 list<TesselPoint*>::iterator CircleSprinter = Marker; … … 3108 3447 } 3109 3448 } 3110 Log() << Verbose( 3) << "INFO: " << count << " closed additional path(s) have been created." << endl;3449 Log() << Verbose(1) << "INFO: " << count << " closed additional path(s) have been created." << endl; 3111 3450 3112 3451 // delete list of paths … … 3130 3469 set<BoundaryTriangleSet*> *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const 3131 3470 { 3471 Info FunctionInfo(__func__); 3132 3472 set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>; 3133 3473 … … 3168 3508 return 0.; 3169 3509 } else 3170 Log() << Verbose( 2) << "Removing point " << *point << " from tesselated boundary ..." << endl;3510 Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl; 3171 3511 3172 3512 // copy old location for the volume … … 3198 3538 NormalVector.Zero(); 3199 3539 for (map<class BoundaryTriangleSet *, int>::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) { 3200 Log() << Verbose( 3) << "INFO: Removing triangle " << *(Runner->first) << "." << endl;3540 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->first) << "." << endl; 3201 3541 NormalVector.SubtractVector(&Runner->first->NormalVector); // has to point inward 3202 3542 RemoveTesselationTriangle(Runner->first); … … 3228 3568 smallestangle = 0.; 3229 3569 for (MiddleNode = connectedPath->begin(); MiddleNode != connectedPath->end(); MiddleNode++) { 3230 Log() << Verbose( 3) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;3570 Log() << Verbose(1) << "INFO: MiddleNode is " << **MiddleNode << "." << endl; 3231 3571 // construct vectors to next and previous neighbour 3232 3572 StartNode = MiddleNode; … … 3256 3596 MiddleNode = EndNode; 3257 3597 if (MiddleNode == connectedPath->end()) { 3258 Log() << Verbose(1) << "CRITICAL: Could not find a smallest angle!" << endl;3259 exit(255);3598 eLog() << Verbose(0) << "CRITICAL: Could not find a smallest angle!" << endl; 3599 performCriticalExit(); 3260 3600 } 3261 3601 StartNode = MiddleNode; … … 3266 3606 if (EndNode == connectedPath->end()) 3267 3607 EndNode = connectedPath->begin(); 3268 Log() << Verbose( 4) << "INFO: StartNode is " << **StartNode << "." << endl;3269 Log() << Verbose( 4) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;3270 Log() << Verbose( 4) << "INFO: EndNode is " << **EndNode << "." << endl;3271 Log() << Verbose( 3) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl;3608 Log() << Verbose(2) << "INFO: StartNode is " << **StartNode << "." << endl; 3609 Log() << Verbose(2) << "INFO: MiddleNode is " << **MiddleNode << "." << endl; 3610 Log() << Verbose(2) << "INFO: EndNode is " << **EndNode << "." << endl; 3611 Log() << Verbose(1) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl; 3272 3612 TriangleCandidates[0] = *StartNode; 3273 3613 TriangleCandidates[1] = *MiddleNode; … … 3275 3615 triangle = GetPresentTriangle(TriangleCandidates); 3276 3616 if (triangle != NULL) { 3277 eLog() << Verbose( 2) << "New triangle already present, skipping!" << endl;3617 eLog() << Verbose(0) << "New triangle already present, skipping!" << endl; 3278 3618 StartNode++; 3279 3619 MiddleNode++; … … 3287 3627 continue; 3288 3628 } 3289 Log() << Verbose( 5) << "Adding new triangle points."<< endl;3629 Log() << Verbose(3) << "Adding new triangle points."<< endl; 3290 3630 AddTesselationPoint(*StartNode, 0); 3291 3631 AddTesselationPoint(*MiddleNode, 1); 3292 3632 AddTesselationPoint(*EndNode, 2); 3293 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;3633 Log() << Verbose(3) << "Adding new triangle lines."<< endl; 3294 3634 AddTesselationLine(TPS[0], TPS[1], 0); 3295 3635 AddTesselationLine(TPS[0], TPS[2], 1); … … 3306 3646 // prepare nodes for next triangle 3307 3647 StartNode = EndNode; 3308 Log() << Verbose( 4) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl;3648 Log() << Verbose(2) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl; 3309 3649 connectedPath->remove(*MiddleNode); // remove the middle node (it is surrounded by triangles) 3310 3650 if (connectedPath->size() == 2) { // we are done … … 3313 3653 break; 3314 3654 } else if (connectedPath->size() < 2) { // something's gone wrong! 3315 Log() << Verbose(1) << "CRITICAL: There are only two endpoints left!" << endl;3316 exit(255);3655 eLog() << Verbose(0) << "CRITICAL: There are only two endpoints left!" << endl; 3656 performCriticalExit(); 3317 3657 } else { 3318 3658 MiddleNode = StartNode; … … 3342 3682 if (maxgain != 0) { 3343 3683 volume += maxgain; 3344 Log() << Verbose( 3) << "Flipping baseline with highest volume" << **Candidate << "." << endl;3684 Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl; 3345 3685 OtherBase = FlipBaseline(*Candidate); 3346 3686 NewLines.erase(Candidate); … … 3353 3693 delete(connectedPath); 3354 3694 } 3355 Log() << Verbose( 1) << count << " triangles were created." << endl;3695 Log() << Verbose(0) << count << " triangles were created." << endl; 3356 3696 } else { 3357 3697 while (!ListOfClosedPaths->empty()) { … … 3361 3701 delete(connectedPath); 3362 3702 } 3363 Log() << Verbose( 1) << "No need to create any triangles." << endl;3703 Log() << Verbose(0) << "No need to create any triangles." << endl; 3364 3704 } 3365 3705 delete(ListOfClosedPaths); 3366 3706 3367 Log() << Verbose( 1) << "Removed volume is " << volume << "." << endl;3707 Log() << Verbose(0) << "Removed volume is " << volume << "." << endl; 3368 3708 3369 3709 return volume; … … 3382 3722 list<BoundaryTriangleSet*> *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const 3383 3723 { 3724 Info FunctionInfo(__func__); 3384 3725 list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>; 3385 3726 LineMap::const_iterator FindLine; … … 3422 3763 } 3423 3764 3765 struct BoundaryLineSetCompare { 3766 bool operator() (const BoundaryLineSet * const a, const BoundaryLineSet * const b) { 3767 int lowerNra = -1; 3768 int lowerNrb = -1; 3769 3770 if (a->endpoints[0] < a->endpoints[1]) 3771 lowerNra = 0; 3772 else 3773 lowerNra = 1; 3774 3775 if (b->endpoints[0] < b->endpoints[1]) 3776 lowerNrb = 0; 3777 else 3778 lowerNrb = 1; 3779 3780 if (a->endpoints[lowerNra] < b->endpoints[lowerNrb]) 3781 return true; 3782 else if (a->endpoints[lowerNra] > b->endpoints[lowerNrb]) 3783 return false; 3784 else { // both lower-numbered endpoints are the same ... 3785 if (a->endpoints[(lowerNra+1)%2] < b->endpoints[(lowerNrb+1)%2]) 3786 return true; 3787 else if (a->endpoints[(lowerNra+1)%2] > b->endpoints[(lowerNrb+1)%2]) 3788 return false; 3789 } 3790 return false; 3791 }; 3792 }; 3793 3794 #define UniqueLines set < class BoundaryLineSet *, BoundaryLineSetCompare> 3795 3424 3796 /** 3425 3797 * Finds all degenerated lines within the tesselation structure. … … 3430 3802 map<int, int> * Tesselation::FindAllDegeneratedLines() 3431 3803 { 3432 map<int, class BoundaryLineSet *> AllLines; 3804 Info FunctionInfo(__func__); 3805 UniqueLines AllLines; 3433 3806 map<int, int> * DegeneratedLines = new map<int, int>; 3434 3807 3435 3808 // sanity check 3436 3809 if (LinesOnBoundary.empty()) { 3437 Log() << Verbose(1) << "Warning:FindAllDegeneratedTriangles() was called without any tesselation structure.";3810 eLog() << Verbose(2) << "FindAllDegeneratedTriangles() was called without any tesselation structure."; 3438 3811 return DegeneratedLines; 3439 3812 } 3440 3813 3441 3814 LineMap::iterator LineRunner1; 3442 pair< LineMap::iterator, bool> tester;3815 pair< UniqueLines::iterator, bool> tester; 3443 3816 for (LineRunner1 = LinesOnBoundary.begin(); LineRunner1 != LinesOnBoundary.end(); ++LineRunner1) { 3444 tester = AllLines.insert( pair<int,BoundaryLineSet *> (LineRunner1->second->endpoints[0]->Nr, LineRunner1->second));3445 if ( (!tester.second) && (tester.first->second->endpoints[1]->Nr == LineRunner1->second->endpoints[1]->Nr)) { // found degenerated line3446 DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, tester.first->second->Nr) );3447 DegeneratedLines->insert ( pair<int, int> ( tester.first->second->Nr, LineRunner1->second->Nr) );3817 tester = AllLines.insert( LineRunner1->second ); 3818 if (!tester.second) { // found degenerated line 3819 DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, (*tester.first)->Nr) ); 3820 DegeneratedLines->insert ( pair<int, int> ((*tester.first)->Nr, LineRunner1->second->Nr) ); 3448 3821 } 3449 3822 } … … 3451 3824 AllLines.clear(); 3452 3825 3453 Log() << Verbose( 1) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl;3826 Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl; 3454 3827 map<int,int>::iterator it; 3455 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) 3456 Log() << Verbose(2) << (*it).first << " => " << (*it).second << endl; 3828 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) { 3829 const LineMap::const_iterator Line1 = LinesOnBoundary.find((*it).first); 3830 const LineMap::const_iterator Line2 = LinesOnBoundary.find((*it).second); 3831 if (Line1 != LinesOnBoundary.end() && Line2 != LinesOnBoundary.end()) 3832 Log() << Verbose(0) << *Line1->second << " => " << *Line2->second << endl; 3833 else 3834 eLog() << Verbose(1) << "Either " << (*it).first << " or " << (*it).second << " are not in LinesOnBoundary!" << endl; 3835 } 3457 3836 3458 3837 return DegeneratedLines; … … 3467 3846 map<int, int> * Tesselation::FindAllDegeneratedTriangles() 3468 3847 { 3848 Info FunctionInfo(__func__); 3469 3849 map<int, int> * DegeneratedLines = FindAllDegeneratedLines(); 3470 3850 map<int, int> * DegeneratedTriangles = new map<int, int>; … … 3494 3874 delete(DegeneratedLines); 3495 3875 3496 Log() << Verbose( 1) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl;3876 Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl; 3497 3877 map<int,int>::iterator it; 3498 3878 for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++) 3499 Log() << Verbose( 2) << (*it).first << " => " << (*it).second << endl;3879 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; 3500 3880 3501 3881 return DegeneratedTriangles; … … 3508 3888 void Tesselation::RemoveDegeneratedTriangles() 3509 3889 { 3890 Info FunctionInfo(__func__); 3510 3891 map<int, int> * DegeneratedTriangles = FindAllDegeneratedTriangles(); 3511 3892 TriangleMap::iterator finder; 3512 3893 BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL; 3513 3894 int count = 0; 3514 3515 Log() << Verbose(1) << "Begin of RemoveDegeneratedTriangles" << endl;3516 3895 3517 3896 for (map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); … … 3572 3951 // erase the pair 3573 3952 count += (int) DegeneratedTriangles->erase(triangle->Nr); 3574 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;3953 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl; 3575 3954 RemoveTesselationTriangle(triangle); 3576 3955 count += (int) DegeneratedTriangles->erase(partnerTriangle->Nr); 3577 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;3956 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl; 3578 3957 RemoveTesselationTriangle(partnerTriangle); 3579 3958 } else { 3580 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle3959 Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle 3581 3960 << " and its partner " << *partnerTriangle << " because it is essential for at" 3582 3961 << " least one of the endpoints to be kept in the tesselation structure." << endl; … … 3584 3963 } 3585 3964 delete(DegeneratedTriangles); 3586 3587 Log() << Verbose(1) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl; 3588 Log() << Verbose(1) << "End of RemoveDegeneratedTriangles" << endl; 3965 if (count > 0) 3966 LastTriangle = NULL; 3967 3968 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl; 3589 3969 } 3590 3970 … … 3599 3979 void Tesselation::AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC) 3600 3980 { 3601 Log() << Verbose(2) << "Begin of AddBoundaryPointByDegeneratedTriangle" << endl; 3602 3981 Info FunctionInfo(__func__); 3603 3982 // find nearest boundary point 3604 3983 class TesselPoint *BackupPoint = NULL; … … 3616 3995 return; 3617 3996 } 3618 Log() << Verbose( 2) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;3997 Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl; 3619 3998 3620 3999 // go through its lines and find the best one to split … … 3649 4028 3650 4029 // create new triangle to connect point (connects automatically with the missing spot of the chosen line) 3651 Log() << Verbose( 5) << "Adding new triangle points."<< endl;4030 Log() << Verbose(2) << "Adding new triangle points."<< endl; 3652 4031 AddTesselationPoint((BestLine->endpoints[0]->node), 0); 3653 4032 AddTesselationPoint((BestLine->endpoints[1]->node), 1); 3654 4033 AddTesselationPoint(point, 2); 3655 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4034 Log() << Verbose(2) << "Adding new triangle lines."<< endl; 3656 4035 AddTesselationLine(TPS[0], TPS[1], 0); 3657 4036 AddTesselationLine(TPS[0], TPS[2], 1); … … 3660 4039 BTS->GetNormalVector(TempTriangle->NormalVector); 3661 4040 BTS->NormalVector.Scale(-1.); 3662 Log() << Verbose( 3) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl;4041 Log() << Verbose(1) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl; 3663 4042 AddTesselationTriangle(); 3664 4043 3665 4044 // create other side of this triangle and close both new sides of the first created triangle 3666 Log() << Verbose( 5) << "Adding new triangle points."<< endl;4045 Log() << Verbose(2) << "Adding new triangle points."<< endl; 3667 4046 AddTesselationPoint((BestLine->endpoints[0]->node), 0); 3668 4047 AddTesselationPoint((BestLine->endpoints[1]->node), 1); 3669 4048 AddTesselationPoint(point, 2); 3670 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4049 Log() << Verbose(2) << "Adding new triangle lines."<< endl; 3671 4050 AddTesselationLine(TPS[0], TPS[1], 0); 3672 4051 AddTesselationLine(TPS[0], TPS[2], 1); … … 3674 4053 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 3675 4054 BTS->GetNormalVector(TempTriangle->NormalVector); 3676 Log() << Verbose( 3) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl;4055 Log() << Verbose(1) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl; 3677 4056 AddTesselationTriangle(); 3678 4057 … … 3681 4060 if ((BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[0])) && (BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[1]))) { 3682 4061 if (BestLine == BTS->lines[i]){ 3683 Log() << Verbose(1) << "CRITICAL:BestLine is same as found line, something's wrong here!" << endl;3684 exit(255);4062 eLog() << Verbose(0) << "BestLine is same as found line, something's wrong here!" << endl; 4063 performCriticalExit(); 3685 4064 } 3686 4065 BTS->lines[i]->triangles.insert( pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle) ); … … 3689 4068 } 3690 4069 } 3691 3692 // exit3693 Log() << Verbose(2) << "End of AddBoundaryPointByDegeneratedTriangle" << endl;3694 4070 }; 3695 4071 … … 3701 4077 void Tesselation::Output(const char *filename, const PointCloud * const cloud) 3702 4078 { 4079 Info FunctionInfo(__func__); 3703 4080 ofstream *tempstream = NULL; 3704 4081 string NameofTempFile; … … 3713 4090 NameofTempFile.erase(npos, 1); 3714 4091 NameofTempFile.append(TecplotSuffix); 3715 Log() << Verbose( 1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";4092 Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n"; 3716 4093 tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc); 3717 4094 WriteTecplotFile(tempstream, this, cloud, TriangleFilesWritten); … … 3727 4104 NameofTempFile.erase(npos, 1); 3728 4105 NameofTempFile.append(Raster3DSuffix); 3729 Log() << Verbose( 1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";4106 Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n"; 3730 4107 tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc); 3731 4108 WriteRaster3dFile(tempstream, this, cloud); … … 3739 4116 TriangleFilesWritten++; 3740 4117 }; 4118 4119 struct BoundaryPolygonSetCompare { 4120 bool operator()(const BoundaryPolygonSet * s1, const BoundaryPolygonSet * s2) const { 4121 if (s1->endpoints.size() < s2->endpoints.size()) 4122 return true; 4123 else if (s1->endpoints.size() > s2->endpoints.size()) 4124 return false; 4125 else { // equality of number of endpoints 4126 PointSet::const_iterator Walker1 = s1->endpoints.begin(); 4127 PointSet::const_iterator Walker2 = s2->endpoints.begin(); 4128 while ((Walker1 != s1->endpoints.end()) || (Walker2 != s2->endpoints.end())) { 4129 if ((*Walker1)->Nr < (*Walker2)->Nr) 4130 return true; 4131 else if ((*Walker1)->Nr > (*Walker2)->Nr) 4132 return false; 4133 Walker1++; 4134 Walker2++; 4135 } 4136 return false; 4137 } 4138 } 4139 }; 4140 4141 #define UniquePolygonSet set < BoundaryPolygonSet *, BoundaryPolygonSetCompare> 4142 4143 /** Finds all degenerated polygons and calls ReTesselateDegeneratedPolygon()/ 4144 * \return number of polygons found 4145 */ 4146 int Tesselation::CorrectAllDegeneratedPolygons() 4147 { 4148 Info FunctionInfo(__func__); 4149 4150 /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector 4151 map <int, int> *DegeneratedTriangles = FindAllDegeneratedTriangles(); 4152 set < BoundaryPointSet *> EndpointCandidateList; 4153 pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester; 4154 pair < map < int, Vector *>::iterator, bool > TriangleInsertionTester; 4155 for (PointMap::const_iterator Runner = PointsOnBoundary.begin(); Runner != PointsOnBoundary.end(); Runner++) { 4156 Log() << Verbose(0) << "Current point is " << *Runner->second << "." << endl; 4157 map < int, Vector *> TriangleVectors; 4158 // gather all NormalVectors 4159 Log() << Verbose(1) << "Gathering triangles ..." << endl; 4160 for (LineMap::const_iterator LineRunner = (Runner->second)->lines.begin(); LineRunner != (Runner->second)->lines.end(); LineRunner++) 4161 for (TriangleMap::const_iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) { 4162 if (DegeneratedTriangles->find(TriangleRunner->second->Nr) == DegeneratedTriangles->end()) { 4163 TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) ); 4164 if (TriangleInsertionTester.second) 4165 Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl; 4166 } else { 4167 Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl; 4168 } 4169 } 4170 // check whether there are two that are parallel 4171 Log() << Verbose(1) << "Finding two parallel triangles ..." << endl; 4172 for (map < int, Vector *>::iterator VectorWalker = TriangleVectors.begin(); VectorWalker != TriangleVectors.end(); VectorWalker++) 4173 for (map < int, Vector *>::iterator VectorRunner = VectorWalker; VectorRunner != TriangleVectors.end(); VectorRunner++) 4174 if (VectorWalker != VectorRunner) { // skip equals 4175 const double SCP = VectorWalker->second->ScalarProduct(VectorRunner->second); // ScalarProduct should result in -1. for degenerated triangles 4176 Log() << Verbose(1) << "Checking " << *VectorWalker->second<< " against " << *VectorRunner->second << ": " << SCP << endl; 4177 if (fabs(SCP + 1.) < ParallelEpsilon) { 4178 InsertionTester = EndpointCandidateList.insert((Runner->second)); 4179 if (InsertionTester.second) 4180 Log() << Verbose(0) << " Adding " << *Runner->second << " to endpoint candidate list." << endl; 4181 // and break out of both loops 4182 VectorWalker = TriangleVectors.end(); 4183 VectorRunner = TriangleVectors.end(); 4184 break; 4185 } 4186 } 4187 } 4188 4189 /// 3. Find connected endpoint candidates and put them into a polygon 4190 UniquePolygonSet ListofDegeneratedPolygons; 4191 BoundaryPointSet *Walker = NULL; 4192 BoundaryPointSet *OtherWalker = NULL; 4193 BoundaryPolygonSet *Current = NULL; 4194 stack <BoundaryPointSet*> ToCheckConnecteds; 4195 while (!EndpointCandidateList.empty()) { 4196 Walker = *(EndpointCandidateList.begin()); 4197 if (Current == NULL) { // create a new polygon with current candidate 4198 Log() << Verbose(0) << "Starting new polygon set at point " << *Walker << endl; 4199 Current = new BoundaryPolygonSet; 4200 Current->endpoints.insert(Walker); 4201 EndpointCandidateList.erase(Walker); 4202 ToCheckConnecteds.push(Walker); 4203 } 4204 4205 // go through to-check stack 4206 while (!ToCheckConnecteds.empty()) { 4207 Walker = ToCheckConnecteds.top(); // fetch ... 4208 ToCheckConnecteds.pop(); // ... and remove 4209 for (LineMap::const_iterator LineWalker = Walker->lines.begin(); LineWalker != Walker->lines.end(); LineWalker++) { 4210 OtherWalker = (LineWalker->second)->GetOtherEndpoint(Walker); 4211 Log() << Verbose(1) << "Checking " << *OtherWalker << endl; 4212 set < BoundaryPointSet *>::iterator Finder = EndpointCandidateList.find(OtherWalker); 4213 if (Finder != EndpointCandidateList.end()) { // found a connected partner 4214 Log() << Verbose(1) << " Adding to polygon." << endl; 4215 Current->endpoints.insert(OtherWalker); 4216 EndpointCandidateList.erase(Finder); // remove from candidates 4217 ToCheckConnecteds.push(OtherWalker); // but check its partners too 4218 } else { 4219 Log() << Verbose(1) << " is not connected to " << *Walker << endl; 4220 } 4221 } 4222 } 4223 4224 Log() << Verbose(0) << "Final polygon is " << *Current << endl; 4225 ListofDegeneratedPolygons.insert(Current); 4226 Current = NULL; 4227 } 4228 4229 const int counter = ListofDegeneratedPolygons.size(); 4230 4231 Log() << Verbose(0) << "The following " << counter << " degenerated polygons have been found: " << endl; 4232 for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) 4233 Log() << Verbose(0) << " " << **PolygonRunner << endl; 4234 4235 /// 4. Go through all these degenerated polygons 4236 for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) { 4237 stack <int> TriangleNrs; 4238 Vector NormalVector; 4239 /// 4a. Gather all triangles of this polygon 4240 TriangleSet *T = (*PolygonRunner)->GetAllContainedTrianglesFromEndpoints(); 4241 4242 // check whether number is bigger than 2, otherwise it's just a simply degenerated one and nothing to do. 4243 if (T->size() == 2) { 4244 Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl; 4245 delete(T); 4246 continue; 4247 } 4248 4249 // check whether number is even 4250 // If this case occurs, we have to think about it! 4251 // The Problem is probably due to two degenerated polygons being connected by a bridging, non-degenerated polygon, as somehow one node has 4252 // connections to either polygon ... 4253 if (T->size() % 2 != 0) { 4254 eLog() << Verbose(0) << " degenerated polygon contains an odd number of triangles, probably contains bridging non-degenerated ones, too!" << endl; 4255 performCriticalExit(); 4256 } 4257 4258 TriangleSet::iterator TriangleWalker = T->begin(); // is the inner iterator 4259 /// 4a. Get NormalVector for one side (this is "front") 4260 NormalVector.CopyVector(&(*TriangleWalker)->NormalVector); 4261 Log() << Verbose(1) << "\"front\" defining triangle is " << **TriangleWalker << " and Normal vector of \"front\" side is " << NormalVector << endl; 4262 TriangleWalker++; 4263 TriangleSet::iterator TriangleSprinter = TriangleWalker; // is the inner advanced iterator 4264 /// 4b. Remove all triangles whose NormalVector is in opposite direction (i.e. "back") 4265 BoundaryTriangleSet *triangle = NULL; 4266 while (TriangleSprinter != T->end()) { 4267 TriangleWalker = TriangleSprinter; 4268 triangle = *TriangleWalker; 4269 TriangleSprinter++; 4270 Log() << Verbose(1) << "Current triangle to test for removal: " << *triangle << endl; 4271 if (triangle->NormalVector.ScalarProduct(&NormalVector) < 0) { // if from other side, then delete and remove from list 4272 Log() << Verbose(1) << " Removing ... " << endl; 4273 TriangleNrs.push(triangle->Nr); 4274 T->erase(TriangleWalker); 4275 RemoveTesselationTriangle(triangle); 4276 } else 4277 Log() << Verbose(1) << " Keeping ... " << endl; 4278 } 4279 /// 4c. Copy all "front" triangles but with inverse NormalVector 4280 TriangleWalker = T->begin(); 4281 while (TriangleWalker != T->end()) { // go through all front triangles 4282 Log() << Verbose(1) << " Re-creating triangle " << **TriangleWalker << " with NormalVector " << (*TriangleWalker)->NormalVector << endl; 4283 for (int i = 0; i < 3; i++) 4284 AddTesselationPoint((*TriangleWalker)->endpoints[i]->node, i); 4285 AddTesselationLine(TPS[0], TPS[1], 0); 4286 AddTesselationLine(TPS[0], TPS[2], 1); 4287 AddTesselationLine(TPS[1], TPS[2], 2); 4288 if (TriangleNrs.empty()) 4289 eLog() << Verbose(0) << "No more free triangle numbers!" << endl; 4290 BTS = new BoundaryTriangleSet(BLS, TriangleNrs.top()); // copy triangle ... 4291 AddTesselationTriangle(); // ... and add 4292 TriangleNrs.pop(); 4293 BTS->NormalVector.CopyVector(&(*TriangleWalker)->NormalVector); 4294 BTS->NormalVector.Scale(-1.); 4295 TriangleWalker++; 4296 } 4297 if (!TriangleNrs.empty()) { 4298 eLog() << Verbose(0) << "There have been less triangles created than removed!" << endl; 4299 } 4300 delete(T); // remove the triangleset 4301 } 4302 4303 map<int, int> * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles(); 4304 Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl; 4305 map<int,int>::iterator it; 4306 for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++) 4307 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; 4308 delete(SimplyDegeneratedTriangles); 4309 4310 /// 5. exit 4311 UniquePolygonSet::iterator PolygonRunner; 4312 while (!ListofDegeneratedPolygons.empty()) { 4313 PolygonRunner = ListofDegeneratedPolygons.begin(); 4314 delete(*PolygonRunner); 4315 ListofDegeneratedPolygons.erase(PolygonRunner); 4316 } 4317 4318 return counter; 4319 };
Note:
See TracChangeset
for help on using the changeset viewer.