Changes in / [482373:0b2dd2]
- Files:
-
- 8 added
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Makefile.am
r482373 r0b2dd2 5 5 ANALYSISHEADER = analysis_bonds.hpp analysis_correlation.hpp 6 6 7 SOURCE = ${ANALYSISSOURCE} ${ATOMSOURCE} bond.cpp bondgraph.cpp boundary.cpp config.cpp element.cpp ellipsoid.cpp errorlogger.cpp graph.cpp helpers.cpp leastsquaremin.cpp linkedcell.cpp log.cpp logger.cpp memoryusageobserver.cpp moleculelist.cpp molecule.cpp molecule_dynamics.cpp molecule_fragmentation.cpp molecule_geometry.cpp molecule_graph.cpp molecule_pointcloud.cpp parser.cpp periodentafel.cpp tesselation.cpp tesselationhelpers.cpp vector.cpp verbose.cpp8 HEADER = ${ANALYSISHEADER} ${ATOMHEADER} bond.hpp bondgraph.hpp boundary.hpp config.hpp defs.hpp element.hpp ellipsoid.hpp errorlogger.hpp graph.hpp helpers.hpp leastsquaremin.hpp linkedcell.hpp lists.hpp log.hpp logger.hpp memoryallocator.hpp memoryusageobserver.hpp molecule.hpp molecule_template.hpp parser.hpp periodentafel.hpp stackclass.hpp tesselation.hpp tesselationhelpers.hpp vector.hpp verbose.hpp7 SOURCE = ${ANALYSISSOURCE} ${ATOMSOURCE} bond.cpp bondgraph.cpp boundary.cpp config.cpp element.cpp ellipsoid.cpp errorlogger.cpp graph.cpp helpers.cpp info.cpp leastsquaremin.cpp linkedcell.cpp log.cpp logger.cpp memoryusageobserver.cpp moleculelist.cpp molecule.cpp molecule_dynamics.cpp molecule_fragmentation.cpp molecule_geometry.cpp molecule_graph.cpp molecule_pointcloud.cpp parser.cpp periodentafel.cpp tesselation.cpp tesselationhelpers.cpp vector.cpp verbose.cpp 8 HEADER = ${ANALYSISHEADER} ${ATOMHEADER} bond.hpp bondgraph.hpp boundary.hpp config.hpp defs.hpp element.hpp ellipsoid.hpp errorlogger.hpp graph.hpp helpers.hpp info.hpp leastsquaremin.hpp linkedcell.hpp lists.hpp log.hpp logger.hpp memoryallocator.hpp memoryusageobserver.hpp molecule.hpp molecule_template.hpp parser.hpp periodentafel.hpp stackclass.hpp tesselation.hpp tesselationhelpers.hpp vector.hpp verbose.hpp 9 9 10 10 BOOST_LIB = $(BOOST_LDFLAGS) $(BOOST_MPL_LIB) … … 25 25 26 26 #EXTRA_DIST = ${molecuilder_DATA} 27 28 FORCE: 29 $(srcdir)/.git-version: FORCE 30 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe HEAD) > .git-version-t 2>/dev/null \ 31 && ! diff .git-version-t $(srcdir)/.git-version >/dev/null 2>&1; then \ 32 mv -f .git-version-t $(srcdir)/.git-version; \ 33 else \ 34 rm -f .git-version-t; \ 35 fi 36 37 EXTRA_DIST = $(srcdir)/.git-version 38 39 $(srcdir)/version.c: $(srcdir)/.git-version 40 echo "const char *ESPACKVersion = \"$(PACKAGE_NAME) -- git version: "`cat $(srcdir)/.git-version`"\";" > $@ 41 42 molecuilder_SOURCES += $(srcdir)/version.c -
src/atom_bondedparticle.cpp
r482373 r0b2dd2 121 121 bond *CandidateBond = NULL; 122 122 123 NoBonds = CountBonds(); 123 124 //Log() << Verbose(3) << "Walker " << *this << ": " << (int)this->type->NoValenceOrbitals << " > " << NoBonds << "?" << endl; 124 NoBonds = CountBonds();125 125 if ((int)(type->NoValenceOrbitals) > NoBonds) { // we have a mismatch, check all bonding partners for mismatch 126 126 for (BondList::const_iterator Runner = ListOfBonds.begin(); Runner != ListOfBonds.end(); (++Runner)) { 127 127 OtherWalker = (*Runner)->GetOtherAtom(this); 128 128 OtherNoBonds = OtherWalker->CountBonds(); 129 //Log() << Verbose(3) << "OtherWalker " << *OtherWalker << ": " << (int)OtherWalker->type->NoValenceOrbitals << " > " << NoBonds << "?" << endl;130 if ((int)(OtherWalker->type->NoValenceOrbitals) > NoBonds) { // check if possible candidate129 //Log() << Verbose(3) << "OtherWalker " << *OtherWalker << ": " << (int)OtherWalker->type->NoValenceOrbitals << " > " << OtherNoBonds << "?" << endl; 130 if ((int)(OtherWalker->type->NoValenceOrbitals) > OtherNoBonds) { // check if possible candidate 131 131 if ((CandidateBond == NULL) || (ListOfBonds.size() > OtherWalker->ListOfBonds.size())) { // pick the one with fewer number of bonds first 132 132 CandidateBond = (*Runner); … … 137 137 if ((CandidateBond != NULL)) { 138 138 CandidateBond->BondDegree++; 139 Log() << Verbose(2) << "Increased bond degree for bond " << *CandidateBond << "." << endl;139 //Log() << Verbose(2) << "Increased bond degree for bond " << *CandidateBond << "." << endl; 140 140 } else { 141 //Log() << Verbose(2) << "Could not find correct degree for atom " << *this << "." << endl;141 eLog() << Verbose(2) << "Could not find correct degree for atom " << *this << "." << endl; 142 142 FalseBondDegree++; 143 143 } -
src/bondgraph.cpp
r482373 r0b2dd2 35 35 /** Parses the bond lengths in a given file and puts them int a matrix form. 36 36 * Allocates \a MatrixContainer for BondGraph::BondLengthMatrix, using MatrixContainer::ParseMatrix(), 37 * but only if parsing is successful l. Otherwise variable is left as NULL.37 * but only if parsing is successful. Otherwise variable is left as NULL. 38 38 * \param *out output stream for debugging 39 39 * \param filename file with bond lengths to parse -
src/boundary.cpp
r482373 r0b2dd2 10 10 #include "element.hpp" 11 11 #include "helpers.hpp" 12 #include "info.hpp" 12 13 #include "linkedcell.hpp" 13 14 #include "log.hpp" … … 33 34 double *GetDiametersOfCluster(const Boundaries *BoundaryPtr, const molecule *mol, Tesselation *&TesselStruct, const bool IsAngstroem) 34 35 { 36 Info FunctionInfo(__func__); 35 37 // get points on boundary of NULL was given as parameter 36 38 bool BoundaryFreeFlag = false; … … 53 55 } else { 54 56 BoundaryPoints = BoundaryPtr; 55 Log() << Verbose( 1) << "Using given boundary points set." << endl;57 Log() << Verbose(0) << "Using given boundary points set." << endl; 56 58 } 57 59 // determine biggest "diameter" of cluster for each axis … … 67 69 //Log() << Verbose(1) << "Current component is " << component << ", Othercomponent is " << Othercomponent << "." << endl; 68 70 for (Boundaries::const_iterator runner = BoundaryPoints[axis].begin(); runner != BoundaryPoints[axis].end(); runner++) { 69 //Log() << Verbose( 2) << "Current runner is " << *(runner->second.second) << "." << endl;71 //Log() << Verbose(1) << "Current runner is " << *(runner->second.second) << "." << endl; 70 72 // seek for the neighbours pair where the Othercomponent sign flips 71 73 Neighbour = runner; … … 82 84 DistanceVector.CopyVector(&runner->second.second->x); 83 85 DistanceVector.SubtractVector(&Neighbour->second.second->x); 84 //Log() << Verbose( 3) << "OldComponent is " << OldComponent << ", new one is " << DistanceVector.x[Othercomponent] << "." << endl;86 //Log() << Verbose(2) << "OldComponent is " << OldComponent << ", new one is " << DistanceVector.x[Othercomponent] << "." << endl; 85 87 } while ((runner != Neighbour) && (fabs(OldComponent / fabs( 86 88 OldComponent) - DistanceVector.x[Othercomponent] / fabs( … … 91 93 OtherNeighbour = BoundaryPoints[axis].end(); 92 94 OtherNeighbour--; 93 //Log() << Verbose( 2) << "The pair, where the sign of OtherComponent flips, is: " << *(Neighbour->second.second) << " and " << *(OtherNeighbour->second.second) << "." << endl;95 //Log() << Verbose(1) << "The pair, where the sign of OtherComponent flips, is: " << *(Neighbour->second.second) << " and " << *(OtherNeighbour->second.second) << "." << endl; 94 96 // now we have found the pair: Neighbour and OtherNeighbour 95 97 OtherVector.CopyVector(&runner->second.second->x); 96 98 OtherVector.SubtractVector(&OtherNeighbour->second.second->x); 97 //Log() << Verbose( 2) << "Distances to Neighbour and OtherNeighbour are " << DistanceVector.x[component] << " and " << OtherVector.x[component] << "." << endl;98 //Log() << Verbose( 2) << "OtherComponents to Neighbour and OtherNeighbour are " << DistanceVector.x[Othercomponent] << " and " << OtherVector.x[Othercomponent] << "." << endl;99 //Log() << Verbose(1) << "Distances to Neighbour and OtherNeighbour are " << DistanceVector.x[component] << " and " << OtherVector.x[component] << "." << endl; 100 //Log() << Verbose(1) << "OtherComponents to Neighbour and OtherNeighbour are " << DistanceVector.x[Othercomponent] << " and " << OtherVector.x[Othercomponent] << "." << endl; 99 101 // do linear interpolation between points (is exact) to extract exact intersection between Neighbour and OtherNeighbour 100 102 w1 = fabs(OtherVector.x[Othercomponent]); … … 103 105 * OtherVector.x[component]) / (w1 + w2)); 104 106 // mark if it has greater diameter 105 //Log() << Verbose( 2) << "Comparing current greatest " << GreatestDiameter[component] << " to new " << tmp << "." << endl;107 //Log() << Verbose(1) << "Comparing current greatest " << GreatestDiameter[component] << " to new " << tmp << "." << endl; 106 108 GreatestDiameter[component] = (GreatestDiameter[component] 107 109 > tmp) ? GreatestDiameter[component] : tmp; 108 110 } //else 109 //Log() << Verbose( 2) << "Saw no sign flip, probably top or bottom node." << endl;111 //Log() << Verbose(1) << "Saw no sign flip, probably top or bottom node." << endl; 110 112 } 111 113 } … … 135 137 Boundaries *GetBoundaryPoints(const molecule *mol, Tesselation *&TesselStruct) 136 138 { 139 Info FunctionInfo(__func__); 137 140 atom *Walker = NULL; 138 141 PointMap PointsOnBoundary; … … 149 152 double angle = 0.; 150 153 151 Log() << Verbose(1) << "Finding all boundary points." << endl;152 154 // 3a. Go through every axis 153 155 for (int axis = 0; axis < NDIM; axis++) { … … 176 178 angle = 0.; // otherwise it's a vector in Axis Direction and unimportant for boundary issues 177 179 178 //Log() << Verbose( 2) << "Checking sign in quadrant : " << ProjectedVector.Projection(&AngleReferenceNormalVector) << "." << endl;180 //Log() << Verbose(1) << "Checking sign in quadrant : " << ProjectedVector.Projection(&AngleReferenceNormalVector) << "." << endl; 179 181 if (ProjectedVector.ScalarProduct(&AngleReferenceNormalVector) > 0) { 180 182 angle = 2. * M_PI - angle; 181 183 } 182 Log() << Verbose( 2) << "Inserting " << *Walker << ": (r, alpha) = (" << radius << "," << angle << "): " << ProjectedVector << endl;184 Log() << Verbose(1) << "Inserting " << *Walker << ": (r, alpha) = (" << radius << "," << angle << "): " << ProjectedVector << endl; 183 185 BoundaryTestPair = BoundaryPoints[axis].insert(BoundariesPair(angle, DistancePair (radius, Walker))); 184 186 if (!BoundaryTestPair.second) { // same point exists, check first r, then distance of original vectors to center of gravity … … 210 212 // printing all inserted for debugging 211 213 // { 212 // Log() << Verbose( 2) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl;214 // Log() << Verbose(1) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl; 213 215 // int i=0; 214 216 // for(Boundaries::iterator runner = BoundaryPoints[axis].begin(); runner != BoundaryPoints[axis].end(); runner++) { 215 217 // if (runner != BoundaryPoints[axis].begin()) 216 // Log() << Verbose( 2) << ", " << i << ": " << *runner->second.second;218 // Log() << Verbose(0) << ", " << i << ": " << *runner->second.second; 217 219 // else 218 // Log() << Verbose( 2) << i << ": " << *runner->second.second;220 // Log() << Verbose(0) << i << ": " << *runner->second.second; 219 221 // i++; 220 222 // } 221 // Log() << Verbose( 2) << endl;223 // Log() << Verbose(0) << endl; 222 224 // } 223 225 // 3c. throw out points whose distance is less than the mean of left and right neighbours … … 249 251 SideA.SubtractVector(MolCenter); 250 252 SideA.ProjectOntoPlane(&AxisVector); 251 // Log() << Verbose( 0) << "SideA: " << SideA << endl;253 // Log() << Verbose(1) << "SideA: " << SideA << endl; 252 254 253 255 SideB.CopyVector(&right->second.second->x); 254 256 SideB.SubtractVector(MolCenter); 255 257 SideB.ProjectOntoPlane(&AxisVector); 256 // Log() << Verbose( 0) << "SideB: " << SideB << endl;258 // Log() << Verbose(1) << "SideB: " << SideB << endl; 257 259 258 260 SideC.CopyVector(&left->second.second->x); 259 261 SideC.SubtractVector(&right->second.second->x); 260 262 SideC.ProjectOntoPlane(&AxisVector); 261 // Log() << Verbose( 0) << "SideC: " << SideC << endl;263 // Log() << Verbose(1) << "SideC: " << SideC << endl; 262 264 263 265 SideH.CopyVector(&runner->second.second->x); 264 266 SideH.SubtractVector(MolCenter); 265 267 SideH.ProjectOntoPlane(&AxisVector); 266 // Log() << Verbose( 0) << "SideH: " << SideH << endl;268 // Log() << Verbose(1) << "SideH: " << SideH << endl; 267 269 268 270 // calculate each length … … 277 279 const double delta = SideC.Angle(&SideH); 278 280 const double MinDistance = a * sin(beta) / (sin(delta)) * (((alpha < M_PI / 2.) || (gamma < M_PI / 2.)) ? 1. : -1.); 279 //Log() << Verbose( 2) << " I calculated: a = " << a << ", h = " << h << ", beta(" << left->second.second->Name << "," << left->second.second->Name << "-" << right->second.second->Name << ") = " << beta << ", delta(" << left->second.second->Name << "," << runner->second.second->Name << ") = " << delta << ", Min = " << MinDistance << "." << endl;281 //Log() << Verbose(1) << " I calculated: a = " << a << ", h = " << h << ", beta(" << left->second.second->Name << "," << left->second.second->Name << "-" << right->second.second->Name << ") = " << beta << ", delta(" << left->second.second->Name << "," << runner->second.second->Name << ") = " << delta << ", Min = " << MinDistance << "." << endl; 280 282 Log() << Verbose(1) << "Checking CoG distance of runner " << *runner->second.second << " " << h << " against triangle's side length spanned by (" << *left->second.second << "," << *right->second.second << ") of " << MinDistance << "." << endl; 281 283 if ((fabs(h / fabs(h) - MinDistance / fabs(MinDistance)) < MYEPSILON) && ((h - MinDistance)) < -MYEPSILON) { … … 303 305 void FindConvexBorder(const molecule* mol, Tesselation *&TesselStruct, const LinkedCell *LCList, const char *filename) 304 306 { 307 Info FunctionInfo(__func__); 305 308 bool BoundaryFreeFlag = false; 306 309 Boundaries *BoundaryPoints = NULL; 307 308 Log() << Verbose(1) << "Begin of FindConvexBorder" << endl;309 310 310 311 if (TesselStruct != NULL) // free if allocated … … 317 318 BoundaryPoints = GetBoundaryPoints(mol, TesselStruct); 318 319 } else { 319 Log() << Verbose( 1) << "Using given boundary points set." << endl;320 Log() << Verbose(0) << "Using given boundary points set." << endl; 320 321 } 321 322 … … 323 324 for (int axis=0; axis < NDIM; axis++) 324 325 { 325 Log() << Verbose( 2) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl;326 Log() << Verbose(1) << "Printing list of candidates for axis " << axis << " which we have inserted so far." << endl; 326 327 int i=0; 327 328 for(Boundaries::iterator runner = BoundaryPoints[axis].begin(); runner != BoundaryPoints[axis].end(); runner++) { 328 329 if (runner != BoundaryPoints[axis].begin()) 329 Log() << Verbose( 2) << ", " << i << ": " << *runner->second.second;330 Log() << Verbose(0) << ", " << i << ": " << *runner->second.second; 330 331 else 331 Log() << Verbose( 2) << i << ": " << *runner->second.second;332 Log() << Verbose(0) << i << ": " << *runner->second.second; 332 333 i++; 333 334 } 334 Log() << Verbose( 2) << endl;335 Log() << Verbose(0) << endl; 335 336 } 336 337 … … 341 342 eLog() << Verbose(2) << "Point " << *(runner->second.second) << " is already present!" << endl; 342 343 343 Log() << Verbose( 2) << "I found " << TesselStruct->PointsOnBoundaryCount << " points on the convex boundary." << endl;344 Log() << Verbose(0) << "I found " << TesselStruct->PointsOnBoundaryCount << " points on the convex boundary." << endl; 344 345 // now we have the whole set of edge points in the BoundaryList 345 346 … … 347 348 // Log() << Verbose(1) << "Listing PointsOnBoundary:"; 348 349 // for(PointMap::iterator runner = PointsOnBoundary.begin(); runner != PointsOnBoundary.end(); runner++) { 349 // Log() << Verbose( 1) << " " << *runner->second;350 // Log() << Verbose(0) << " " << *runner->second; 350 351 // } 351 // Log() << Verbose( 1) << endl;352 // Log() << Verbose(0) << endl; 352 353 353 354 // 3a. guess starting triangle … … 359 360 // 3c. check whether all atoms lay inside the boundary, if not, add to boundary points, segment triangle into three with the new point 360 361 if (!TesselStruct->InsertStraddlingPoints(mol, LCList)) 361 Log() << Verbose(1) << "Insertion of straddling points failed!" << endl;362 363 Log() << Verbose( 2) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " intermediate triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl;362 eLog() << Verbose(1) << "Insertion of straddling points failed!" << endl; 363 364 Log() << Verbose(0) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " intermediate triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl; 364 365 365 366 // 4. Store triangles in tecplot file … … 411 412 // Log() << Verbose(1) << "Correction of concave tesselpoints failed!" << endl; 412 413 413 Log() << Verbose( 2) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl;414 Log() << Verbose(0) << "I created " << TesselStruct->TrianglesOnBoundary.size() << " triangles with " << TesselStruct->LinesOnBoundary.size() << " lines and " << TesselStruct->PointsOnBoundary.size() << " points." << endl; 414 415 415 416 // 4. Store triangles in tecplot file … … 437 438 if (BoundaryFreeFlag) 438 439 delete[] (BoundaryPoints); 439 440 Log() << Verbose(1) << "End of FindConvexBorder" << endl;441 440 }; 442 441 … … 450 449 bool RemoveAllBoundaryPoints(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename) 451 450 { 451 Info FunctionInfo(__func__); 452 452 int i=0; 453 453 char number[MAXSTRINGSIZE]; … … 460 460 PointMap::iterator PointRunner; 461 461 while (!TesselStruct->PointsOnBoundary.empty()) { 462 Log() << Verbose( 2) << "Remaining points are: ";462 Log() << Verbose(1) << "Remaining points are: "; 463 463 for (PointMap::iterator PointSprinter = TesselStruct->PointsOnBoundary.begin(); PointSprinter != TesselStruct->PointsOnBoundary.end(); PointSprinter++) 464 Log() << Verbose( 2) << *(PointSprinter->second) << "\t";465 Log() << Verbose( 2) << endl;464 Log() << Verbose(0) << *(PointSprinter->second) << "\t"; 465 Log() << Verbose(0) << endl; 466 466 467 467 PointRunner = TesselStruct->PointsOnBoundary.begin(); … … 503 503 double ConvexizeNonconvexEnvelope(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename) 504 504 { 505 Info FunctionInfo(__func__); 505 506 double volume = 0; 506 507 class BoundaryPointSet *point = NULL; … … 516 517 int run = 0; 517 518 518 Log() << Verbose(0) << "Begin of ConvexizeNonconvexEnvelope" << endl;519 520 519 // check whether there is something to work on 521 520 if (TesselStruct == NULL) { … … 539 538 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 540 539 line = LineRunner->second; 541 Log() << Verbose( 2) << "INFO: Current line of point " << *point << " is " << *line << "." << endl;540 Log() << Verbose(1) << "INFO: Current line of point " << *point << " is " << *line << "." << endl; 542 541 if (!line->CheckConvexityCriterion()) { 543 542 // remove the point if needed … … 604 603 605 604 // end 606 Log() << Verbose(1) << "Volume is " << volume << "." << endl; 607 Log() << Verbose(0) << "End of ConvexizeNonconvexEnvelope" << endl; 605 Log() << Verbose(0) << "Volume is " << volume << "." << endl; 608 606 return volume; 609 607 }; … … 619 617 double VolumeOfConvexEnvelope(class Tesselation *TesselStruct, class config *configuration) 620 618 { 619 Info FunctionInfo(__func__); 621 620 bool IsAngstroem = configuration->GetIsAngstroem(); 622 621 double volume = 0.; … … 625 624 626 625 // 6a. Every triangle forms a pyramid with the center of gravity as its peak, sum up the volumes 627 Log() << Verbose(1)628 << "Calculating the volume of the pyramids formed out of triangles and center of gravity."629 << endl;630 626 for (TriangleMap::iterator runner = TesselStruct->TrianglesOnBoundary.begin(); runner != TesselStruct->TrianglesOnBoundary.end(); runner++) 631 627 { // go through every triangle, calculate volume of its pyramid with CoG as peak … … 642 638 const double h = x.Norm(); // distance of CoG to triangle 643 639 const double PyramidVolume = (1. / 3.) * G * h; // this formula holds for _all_ pyramids (independent of n-edge base or (not) centered peak) 644 Log() << Verbose( 2) << "Area of triangle is " << setprecision(10) << G << " "640 Log() << Verbose(1) << "Area of triangle is " << setprecision(10) << G << " " 645 641 << (IsAngstroem ? "angstrom" : "atomiclength") << "^2, height is " 646 642 << h << " and the volume is " << PyramidVolume << " " … … 664 660 void StoreTrianglesinFile(const molecule * const mol, const Tesselation *&TesselStruct, const char *filename, const char *extraSuffix) 665 661 { 662 Info FunctionInfo(__func__); 666 663 // 4. Store triangles in tecplot file 667 664 if (filename != NULL) { … … 671 668 OutputName.append(TecplotSuffix); 672 669 ofstream *tecplot = new ofstream(OutputName.c_str()); 673 WriteTecplotFile(tecplot, TesselStruct, mol, 0);670 WriteTecplotFile(tecplot, TesselStruct, mol, -1); 674 671 tecplot->close(); 675 672 delete(tecplot); … … 698 695 void PrepareClustersinWater(config *configuration, molecule *mol, double ClusterVolume, double celldensity) 699 696 { 697 Info FunctionInfo(__func__); 700 698 bool IsAngstroem = true; 701 699 double *GreatestDiameter = NULL; … … 798 796 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandomAtomDisplacement, double RandomMolDisplacement, bool DoRandomRotation) 799 797 { 798 Info FunctionInfo(__func__); 800 799 molecule *Filling = new molecule(filler->elemente); 801 800 Vector CurrentPosition; … … 814 813 double phi[NDIM]; 815 814 class Tesselation *TesselStruct[List->ListOfMolecules.size()]; 816 817 Log() << Verbose(0) << "Begin of FillBoxWithMolecule" << endl;818 815 819 816 i=0; … … 877 874 for (int i=0;i<NDIM;i++) 878 875 FillerTranslations.x[i] = RandomMolDisplacement*(rand()/(RAND_MAX/2.) - 1.); 879 Log() << Verbose( 3) << "INFO: Translating this filler by " << FillerTranslations << "." << endl;876 Log() << Verbose(2) << "INFO: Translating this filler by " << FillerTranslations << "." << endl; 880 877 881 878 // go through all atoms … … 938 935 delete(TesselStruct[i]); 939 936 } 940 Log() << Verbose(0) << "End of FillBoxWithMolecule" << endl;941 942 937 return Filling; 943 938 }; … … 951 946 * \param RADIUS radius of the virtual sphere 952 947 * \param *filename filename prefix for output of vertex data 953 */ 954 void FindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LCList, const double RADIUS, const char *filename = NULL) 948 * \return true - tesselation successful, false - tesselation failed 949 */ 950 bool FindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LCList, const double RADIUS, const char *filename = NULL) 955 951 { 952 Info FunctionInfo(__func__); 956 953 bool freeLC = false; 957 LineMap::iterator baseline; 954 bool status = false; 955 CandidateForTesselation *baseline; 958 956 LineMap::iterator testline; 959 bool OneLoopWithoutSuccessFlag = false; // marks whether we went once through all baselines without finding any without two triangles957 bool OneLoopWithoutSuccessFlag = true; // marks whether we went once through all baselines without finding any without two triangles 960 958 bool TesselationFailFlag = false; 961 962 Log() << Verbose(1) << "Entering search for non convex hull. " << endl; 959 BoundaryTriangleSet *T = NULL; 960 963 961 if (TesselStruct == NULL) { 964 962 Log() << Verbose(1) << "Allocating Tesselation struct ..." << endl; … … 970 968 } 971 969 972 Log() << Verbose(0) << "Begin of FindNonConvexBorder\n";973 974 970 // initialise Linked Cell 975 971 if (LCList == NULL) { … … 982 978 983 979 // 2. expand from there 984 baseline = TesselStruct->LinesOnBoundary.begin(); 985 baseline++; // skip first line 986 while ((baseline != TesselStruct->LinesOnBoundary.end()) || (OneLoopWithoutSuccessFlag)) { 987 if (baseline->second->triangles.size() == 1) { 988 CheckListOfBaselines(TesselStruct); 989 // 3. find next triangle 990 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*(baseline->second), *(((baseline->second->triangles.begin()))->second), RADIUS, LCList); //the line is there, so there is a triangle, but only one. 991 OneLoopWithoutSuccessFlag = OneLoopWithoutSuccessFlag || TesselationFailFlag; 992 if (!TesselationFailFlag) 993 eLog() << Verbose(2) << "FindNextSuitableTriangle failed." << endl; 994 995 // write temporary envelope 996 if (filename != NULL) { 997 if ((DoSingleStepOutput && ((TesselStruct->TrianglesOnBoundary.size() % SingleStepWidth == 0)))) { // if we have a new triangle and want to output each new triangle configuration 998 TesselStruct->Output(filename, mol); 999 } 980 while ((!TesselStruct->OpenLines.empty()) && (OneLoopWithoutSuccessFlag)) { 981 // 2a. fill all new OpenLines 982 Log() << Verbose(1) << "There are " << TesselStruct->OpenLines.size() << " open lines to scan for candidates:" << endl; 983 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) 984 Log() << Verbose(2) << *(Runner->second) << endl; 985 986 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 987 baseline = Runner->second; 988 if (baseline->pointlist.empty()) { 989 T = (((baseline->BaseLine->triangles.begin()))->second); 990 Log() << Verbose(1) << "Finding best candidate for open line " << *baseline->BaseLine << " of triangle " << *T << endl; 991 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*baseline, *T, RADIUS, LCList); //the line is there, so there is a triangle, but only one. 1000 992 } 1001 if (TesselationFailFlag) { 1002 baseline = TesselStruct->LinesOnBoundary.begin(); 1003 OneLoopWithoutSuccessFlag = false; 1004 Log() << Verbose(2) << "Baseline set to begin." << endl; 993 } 994 995 // 2b. search for smallest ShortestAngle among all candidates 996 double ShortestAngle = 4.*M_PI; 997 Log() << Verbose(1) << "There are " << TesselStruct->OpenLines.size() << " open lines to scan for the best candidates:" << endl; 998 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) 999 Log() << Verbose(2) << *(Runner->second) << endl; 1000 1001 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 1002 if (Runner->second->ShortestAngle < ShortestAngle) { 1003 baseline = Runner->second; 1004 ShortestAngle = baseline->ShortestAngle; 1005 //Log() << Verbose(1) << "New best candidate is " << *baseline->BaseLine << " with point " << *baseline->point << " and angle " << baseline->ShortestAngle << endl; 1005 1006 } 1006 } else { 1007 //Log() << Verbose(1) << "Line " << *baseline->second << " has " << baseline->second->triangles.size() << " triangles adjacent" << endl; 1008 if (baseline->second->triangles.size() != 2) { 1009 eLog() << Verbose(0) << "TESSELATION FINISHED WITH INVALID TRIANGLE COUNT!" << endl; 1010 performCriticalExit(); 1007 } 1008 if ((ShortestAngle == 4.*M_PI) || (baseline->pointlist.empty())) 1009 OneLoopWithoutSuccessFlag = false; 1010 else { 1011 TesselStruct->AddCandidateTriangle(*baseline); 1012 } 1013 1014 // write temporary envelope 1015 if (filename != NULL) { 1016 if ((DoSingleStepOutput && ((TesselStruct->TrianglesOnBoundary.size() % SingleStepWidth == 0)))) { // if we have a new triangle and want to output each new triangle configuration 1017 TesselStruct->Output(filename, mol); 1011 1018 } 1012 1019 } 1013 1014 if ((baseline == TesselStruct->LinesOnBoundary.end()) && (OneLoopWithoutSuccessFlag)) { 1015 baseline = TesselStruct->LinesOnBoundary.begin(); // restart if we reach end due to newly inserted lines 1016 OneLoopWithoutSuccessFlag = false; 1017 } 1018 baseline++; 1019 } 1020 // check envelope for consistency 1021 CheckListOfBaselines(TesselStruct); 1022 1023 // look whether all points are inside of the convex envelope, otherwise add them via degenerated triangles 1024 //->InsertStraddlingPoints(mol, LCList); 1020 } 1021 // // check envelope for consistency 1022 // status = CheckListOfBaselines(TesselStruct); 1023 // 1024 // // look whether all points are inside of the convex envelope, otherwise add them via degenerated triangles 1025 // //->InsertStraddlingPoints(mol, LCList); 1025 1026 // mol->GoToFirst(); 1026 1027 // class TesselPoint *Runner = NULL; … … 1037 1038 // } 1038 1039 1039 // Purges surplus triangles.1040 TesselStruct->RemoveDegeneratedTriangles();1040 // // Purges surplus triangles. 1041 // TesselStruct->RemoveDegeneratedTriangles(); 1041 1042 1042 1043 // check envelope for consistency 1043 CheckListOfBaselines(TesselStruct); 1044 status = CheckListOfBaselines(TesselStruct); 1045 1046 // store before correction 1047 StoreTrianglesinFile(mol, (const Tesselation *&)TesselStruct, filename, ""); 1048 1049 // correct degenerated polygons 1050 TesselStruct->CorrectAllDegeneratedPolygons(); 1051 1052 // check envelope for consistency 1053 status = CheckListOfBaselines(TesselStruct); 1044 1054 1045 1055 // write final envelope … … 1049 1059 if (freeLC) 1050 1060 delete(LCList); 1051 Log() << Verbose(0) << "End of FindNonConvexBorder\n"; 1061 1062 return status; 1052 1063 }; 1053 1064 … … 1061 1072 Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol) 1062 1073 { 1074 Info FunctionInfo(__func__); 1063 1075 Vector *Center = new Vector; 1064 1076 Center->Zero(); -
src/boundary.hpp
r482373 r0b2dd2 35 35 36 36 #define DEBUG 1 37 #define DoSingleStepOutput 138 #define SingleStepWidth 1 37 #define DoSingleStepOutput 0 38 #define SingleStepWidth 10 39 39 40 40 #define DistancePair pair < double, atom* > … … 53 53 Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol); 54 54 void FindNextSuitablePoint(class BoundaryTriangleSet *BaseTriangle, class BoundaryLineSet *BaseLine, atom*& OptCandidate, Vector *OptCandidateCenter, double *ShortestAngle, const double RADIUS, LinkedCell *LC); 55 voidFindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LC, const double RADIUS, const char *tempbasename);55 bool FindNonConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *&LC, const double RADIUS, const char *tempbasename); 56 56 Boundaries *GetBoundaryPoints(const molecule *mol, Tesselation *&TesselStruct); 57 57 double * GetDiametersOfCluster(const Boundaries *BoundaryPtr, const molecule *mol, Tesselation *&TesselStruct, const bool IsAngstroem); -
src/builder.cpp
r482373 r0b2dd2 65 65 #include "molecule.hpp" 66 66 #include "periodentafel.hpp" 67 #include "version.h" 67 68 68 69 /********************************************* Subsubmenu routine ************************************/ … … 1247 1248 ofstream output; 1248 1249 molecule *mol = new molecule(periode); 1250 mol->SetNameFromFilename(ConfigFileName); 1249 1251 1250 1252 if (!strcmp(configuration->configpath, configuration->GetDefaultPath())) { … … 1385 1387 int argptr; 1386 1388 molecule *mol = NULL; 1387 string BondGraphFileName(" ");1389 string BondGraphFileName("\n"); 1388 1390 int verbosity = 0; 1389 1391 strncpy(configuration.databasepath, LocalPath, MAXSTRINGSIZE-1); … … 1539 1541 mol = new molecule(periode); 1540 1542 mol->ActiveFlag = true; 1543 if (ConfigFileName != NULL) 1544 mol->SetNameFromFilename(ConfigFileName); 1541 1545 molecules->insert(mol); 1546 } 1547 if (configuration.BG == NULL) { 1548 configuration.BG = new BondGraph(configuration.GetIsAngstroem()); 1549 if ((BondGraphFileName.empty()) && (configuration.BG->LoadBondLengthTable(BondGraphFileName))) { 1550 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1551 } else { 1552 eLog() << Verbose(1) << "Bond length table loading failed." << endl; 1553 } 1542 1554 } 1543 1555 … … 1563 1575 else { 1564 1576 Log() << Verbose(2) << "File found and parsed." << endl; 1577 // @TODO rather do the dissection afterwards 1578 // mol->SetNameFromFilename(argv[argptr]); 1579 // molecules->ListOfMolecules.remove(mol); 1580 // molecules->DissectMoleculeIntoConnectedSubgraphs(mol,&configuration); 1581 // delete(mol); 1582 // if (molecules->ListOfMolecules.size() != 0) { 1583 // for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 1584 // if ((*ListRunner)->ActiveFlag) { 1585 // mol = *ListRunner; 1586 // break; 1587 // } 1588 // } 1565 1589 configPresent = present; 1566 1590 } … … 1781 1805 start = clock(); 1782 1806 LCList = new LinkedCell(Boundary, atof(argv[argptr])*2.); 1783 FindNonConvexBorder(Boundary, T, LCList, atof(argv[argptr]), argv[argptr+1]); 1807 if (!FindNonConvexBorder(Boundary, T, LCList, atof(argv[argptr]), argv[argptr+1])) 1808 ExitFlag = 255; 1784 1809 //FindDistributionOfEllipsoids(T, &LCList, N, number, filename.c_str()); 1785 1810 end = clock(); 1786 1811 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl; 1787 1812 delete(LCList); 1813 delete(T); 1788 1814 argptr+=2; 1789 1815 } … … 2197 2223 int j; 2198 2224 2225 cout << ESPACKVersion << endl; 2226 2199 2227 setVerbosity(0); 2200 2228 -
src/config.cpp
r482373 r0b2dd2 140 140 void ConfigFileBuffer::MapIonTypesInBuffer(const int NoAtoms) 141 141 { 142 map<const char *, int, IonTypeCompare> LineList;142 map<const char *, int, IonTypeCompare> IonTypeLineMap; 143 143 if (LineMapping == NULL) { 144 144 eLog() << Verbose(0) << "map pointer is NULL: " << LineMapping << endl; … … 149 149 // put all into hashed map 150 150 for (int i=0; i<NoAtoms; ++i) { 151 LineList.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i));151 IonTypeLineMap.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i)); 152 152 } 153 153 154 154 // fill map 155 155 int nr=0; 156 for (map<const char *, int, IonTypeCompare>::iterator runner = LineList.begin(); runner != LineList.end(); ++runner) {156 for (map<const char *, int, IonTypeCompare>::iterator runner = IonTypeLineMap.begin(); runner != IonTypeLineMap.end(); ++runner) { 157 157 if (CurrentLine+nr < NoLines) 158 158 LineMapping[CurrentLine+(nr++)] = runner->second; … … 1056 1056 1057 1057 // 2. parse the bond graph file if given 1058 BG = new BondGraph(IsAngstroem); 1059 if (BG->LoadBondLengthTable(BondGraphFileName)) { 1060 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1061 } else { 1062 Log() << Verbose(0) << "Bond length table loading failed." << endl; 1058 if (BG == NULL) { 1059 BG = new BondGraph(IsAngstroem); 1060 if (BG->LoadBondLengthTable(BondGraphFileName)) { 1061 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1062 } else { 1063 eLog() << Verbose(1) << "Bond length table loading failed." << endl; 1064 } 1063 1065 } 1064 1066 1065 1067 // 3. parse the molecule in 1066 1068 LoadMolecule(mol, FileBuffer, periode, FastParsing); 1069 mol->SetNameFromFilename(filename); 1067 1070 mol->ActiveFlag = true; 1071 MolList->insert(mol); 1068 1072 1069 1073 // 4. dissect the molecule into connected subgraphs 1070 MolList->DissectMoleculeIntoConnectedSubgraphs(mol,this); 1071 1072 delete(mol); 1074 // don't do this here ... 1075 //MolList->DissectMoleculeIntoConnectedSubgraphs(mol,this); 1076 //delete(mol); 1077 1073 1078 delete(FileBuffer); 1074 1079 }; -
src/errorlogger.cpp
r482373 r0b2dd2 82 82 l.nix->clear(); 83 83 if (v.DoOutput(verbosityLevel)) { 84 v.print(cout);85 84 switch(v.Verbosity) { 86 85 case 0: 87 c out<< "CRITICAL: ";86 cerr << "CRITICAL: "; 88 87 break; 89 88 case 1: 90 c out<< "ERROR: ";89 cerr << "ERROR: "; 91 90 break; 92 91 case 2: 93 c out<< "WARNING: ";92 cerr << "WARNING: "; 94 93 break; 95 94 default: 96 95 break; 97 96 } 97 v.print(cerr); 98 98 return cerr; 99 99 } else … … 105 105 l->nix->clear(); 106 106 if (v.DoOutput(verbosityLevel)) { 107 v.print(cout);108 107 switch(v.Verbosity) { 109 108 case 0: 110 c out<< "CRITICAL: ";109 cerr << "CRITICAL: "; 111 110 break; 112 111 case 1: 113 c out<< "ERROR: ";112 cerr << "ERROR: "; 114 113 break; 115 114 case 2: 116 c out<< "WARNING: ";115 cerr << "WARNING: "; 117 116 break; 118 117 default: 119 118 break; 120 119 } 120 v.print(cerr); 121 121 return cerr; 122 122 } else -
src/molecule.hpp
r482373 r0b2dd2 106 106 107 107 // re-definition of virtual functions from PointCloud 108 const char * const GetName() const; 108 109 Vector *GetCenter() const ; 109 110 TesselPoint *GetPoint() const ; -
src/molecule_pointcloud.cpp
r482373 r0b2dd2 13 13 /************************************* Functions for class molecule *********************************/ 14 14 15 /** Returns a name for this point cloud, here the molecule's name. 16 * \return name of point cloud 17 */ 18 const char * const molecule::GetName() const 19 { 20 return name; 21 }; 15 22 16 23 /** Determine center of all atoms. -
src/moleculelist.cpp
r482373 r0b2dd2 759 759 // 4a. create array of molecules to fill 760 760 const int MolCount = Subgraphs->next->Count(); 761 char number[MAXSTRINGSIZE]; 761 762 molecule **molecules = Malloc<molecule *>(MolCount, "config::Load() - **molecules"); 762 763 for (int i=0;i<MolCount;i++) { 763 764 molecules[i] = (molecule*) new molecule(mol->elemente); 764 765 molecules[i]->ActiveFlag = true; 766 strncpy(molecules[i]->name, mol->name, MAXSTRINGSIZE); 767 if (MolCount > 1) { 768 sprintf(number, "-%d", i+1); 769 strncat(molecules[i]->name, number, MAXSTRINGSIZE - strlen(mol->name) - 1); 770 } 771 cout << "MolName is " << molecules[i]->name << endl; 765 772 insert(molecules[i]); 766 773 } … … 799 806 } 800 807 } 801 // 4d. we don't need to redo bonds, as they are connected subgraphs and still maintain edtheir ListOfBonds, but we have to remove them from first..last list808 // 4d. we don't need to redo bonds, as they are connected subgraphs and still maintain their ListOfBonds, but we have to remove them from first..last list 802 809 bond *Binder = mol->first; 803 810 while (mol->first->next != mol->last) { -
src/parser.cpp
r482373 r0b2dd2 158 158 //Log() << Verbose(0) << "Opening " << name << " ... " << input << endl; 159 159 if (input == NULL) { 160 eLog() << Verbose( 0) << endl << "Unable to open " << name << ", is the directory correct?" << endl;161 performCriticalExit();160 eLog() << Verbose(1) << endl << "Unable to open " << name << ", is the directory correct?" << endl; 161 //performCriticalExit(); 162 162 return false; 163 163 } -
src/tesselation.cpp
r482373 r0b2dd2 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 IsDegenerated(false), 882 ShortestAngle(2.*M_PI), 883 OtherShortestAngle(2.*M_PI) 884 { 885 Info FunctionInfo(__func__); 598 886 OptCenter.CopyVector(&OptCandidateCenter); 599 887 OtherOptCenter.CopyVector(&OtherOptCandidateCenter); … … 603 891 */ 604 892 CandidateForTesselation::~CandidateForTesselation() { 605 point = NULL;606 893 BaseLine = NULL; 607 894 }; 608 895 896 /** output operator for CandidateForTesselation. 897 * \param &ost output stream 898 * \param &a boundary line 899 */ 900 ostream & operator <<(ostream &ost, const CandidateForTesselation &a) 901 { 902 ost << "[" << a.BaseLine->Nr << "|" << a.BaseLine->endpoints[0]->node->Name << "," << a.BaseLine->endpoints[1]->node->Name << "] with "; 903 if (a.pointlist.empty()) 904 ost << "no candidate."; 905 else { 906 ost << "candidate"; 907 if (a.pointlist.size() != 1) 908 ost << "s "; 909 else 910 ost << " "; 911 for (TesselPointList::const_iterator Runner = a.pointlist.begin(); Runner != a.pointlist.end(); Runner++) 912 ost << *(*Runner) << " "; 913 ost << " at angle " << (a.ShortestAngle)<< "."; 914 } 915 916 return ost; 917 }; 918 919 609 920 // =========================================================== class TESSELATION =========================================== 610 921 611 922 /** Constructor of class Tesselation. 612 923 */ 613 Tesselation::Tesselation() 614 { 615 PointsOnBoundaryCount = 0; 616 LinesOnBoundaryCount = 0; 617 TrianglesOnBoundaryCount = 0; 618 InternalPointer = PointsOnBoundary.begin(); 619 LastTriangle = NULL; 620 TriangleFilesWritten = 0; 924 Tesselation::Tesselation() : 925 PointsOnBoundaryCount(0), 926 LinesOnBoundaryCount(0), 927 TrianglesOnBoundaryCount(0), 928 LastTriangle(NULL), 929 TriangleFilesWritten(0), 930 InternalPointer(PointsOnBoundary.begin()) 931 { 932 Info FunctionInfo(__func__); 621 933 } 622 934 ; … … 627 939 Tesselation::~Tesselation() 628 940 { 629 Log() << Verbose(1) << "Free'ing TesselStruct ... " << endl; 941 Info FunctionInfo(__func__); 942 Log() << Verbose(0) << "Free'ing TesselStruct ... " << endl; 630 943 for (TriangleMap::iterator runner = TrianglesOnBoundary.begin(); runner != TrianglesOnBoundary.end(); runner++) { 631 944 if (runner->second != NULL) { … … 635 948 eLog() << Verbose(1) << "The triangle " << runner->first << " has already been free'd." << endl; 636 949 } 637 Log() << Verbose( 1) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl;950 Log() << Verbose(0) << "This envelope was written to file " << TriangleFilesWritten << " times(s)." << endl; 638 951 } 639 952 ; … … 644 957 Vector * Tesselation::GetCenter(ofstream *out) const 645 958 { 959 Info FunctionInfo(__func__); 646 960 Vector *Center = new Vector(0.,0.,0.); 647 961 int num=0; … … 659 973 TesselPoint * Tesselation::GetPoint() const 660 974 { 975 Info FunctionInfo(__func__); 661 976 return (InternalPointer->second->node); 662 977 }; … … 667 982 TesselPoint * Tesselation::GetTerminalPoint() const 668 983 { 984 Info FunctionInfo(__func__); 669 985 PointMap::const_iterator Runner = PointsOnBoundary.end(); 670 986 Runner--; … … 677 993 void Tesselation::GoToNext() const 678 994 { 995 Info FunctionInfo(__func__); 679 996 if (InternalPointer != PointsOnBoundary.end()) 680 997 InternalPointer++; … … 686 1003 void Tesselation::GoToPrevious() const 687 1004 { 1005 Info FunctionInfo(__func__); 688 1006 if (InternalPointer != PointsOnBoundary.begin()) 689 1007 InternalPointer--; … … 695 1013 void Tesselation::GoToFirst() const 696 1014 { 1015 Info FunctionInfo(__func__); 697 1016 InternalPointer = PointsOnBoundary.begin(); 698 1017 }; … … 703 1022 void Tesselation::GoToLast() const 704 1023 { 1024 Info FunctionInfo(__func__); 705 1025 InternalPointer = PointsOnBoundary.end(); 706 1026 InternalPointer--; … … 712 1032 bool Tesselation::IsEmpty() const 713 1033 { 1034 Info FunctionInfo(__func__); 714 1035 return (PointsOnBoundary.empty()); 715 1036 }; … … 720 1041 bool Tesselation::IsEnd() const 721 1042 { 1043 Info FunctionInfo(__func__); 722 1044 return (InternalPointer == PointsOnBoundary.end()); 723 1045 }; … … 732 1054 Tesselation::GuessStartingTriangle() 733 1055 { 1056 Info FunctionInfo(__func__); 734 1057 // 4b. create a starting triangle 735 1058 // 4b1. create all distances … … 778 1101 baseline->second.first->second->node->node, 779 1102 baseline->second.second->second->node->node); 780 Log() << Verbose(2) << "Plane vector of candidate triangle is "; 781 PlaneVector.Output(); 782 Log() << Verbose(0) << endl; 1103 Log() << Verbose(2) << "Plane vector of candidate triangle is " << PlaneVector << endl; 783 1104 // 4. loop over all points 784 1105 double sign = 0.; … … 796 1117 if (fabs(distance) < 1e-4) // we need to have a small epsilon around 0 which is still ok 797 1118 continue; 798 Log() << Verbose(3) << "Projection of " << checker->second->node->Name 799 << " yields distance of " << distance << "." << endl; 1119 Log() << Verbose(2) << "Projection of " << checker->second->node->Name << " yields distance of " << distance << "." << endl; 800 1120 tmp = distance / fabs(distance); 801 1121 // 4b. Any have different sign to than before? (i.e. would lie outside convex hull with this starting triangle) … … 850 1170 if (checker == PointsOnBoundary.end()) 851 1171 { 852 Log() << Verbose( 0) << "Looks like we have a candidate!" << endl;1172 Log() << Verbose(2) << "Looks like we have a candidate!" << endl; 853 1173 break; 854 1174 } … … 880 1200 else 881 1201 { 882 Log() << Verbose(1) << "No starting triangle found." << endl; 883 exit(255); 1202 eLog() << Verbose(0) << "No starting triangle found." << endl; 884 1203 } 885 1204 } … … 901 1220 void Tesselation::TesselateOnBoundary(const PointCloud * const cloud) 902 1221 { 1222 Info FunctionInfo(__func__); 903 1223 bool flag; 904 1224 PointMap::iterator winner; … … 919 1239 // get peak point with respect to this base line's only triangle 920 1240 BTS = baseline->second->triangles.begin()->second; // there is only one triangle so far 921 Log() << Verbose( 2) << "Current baseline is between " << *(baseline->second) << "." << endl;1241 Log() << Verbose(0) << "Current baseline is between " << *(baseline->second) << "." << endl; 922 1242 for (int i = 0; i < 3; i++) 923 1243 if ((BTS->endpoints[i] != baseline->second->endpoints[0]) && (BTS->endpoints[i] != baseline->second->endpoints[1])) 924 1244 peak = BTS->endpoints[i]; 925 Log() << Verbose( 3) << " and has peak " << *peak << "." << endl;1245 Log() << Verbose(1) << " and has peak " << *peak << "." << endl; 926 1246 927 1247 // prepare some auxiliary vectors … … 938 1258 CenterVector.AddVector(BTS->endpoints[i]->node->node); 939 1259 CenterVector.Scale(1. / 3.); 940 Log() << Verbose( 4) << "CenterVector of base triangle is " << CenterVector << endl;1260 Log() << Verbose(2) << "CenterVector of base triangle is " << CenterVector << endl; 941 1261 942 1262 // normal vector of triangle … … 945 1265 BTS->GetNormalVector(NormalVector); 946 1266 NormalVector.CopyVector(&BTS->NormalVector); 947 Log() << Verbose( 4) << "NormalVector of base triangle is " << NormalVector << endl;1267 Log() << Verbose(2) << "NormalVector of base triangle is " << NormalVector << endl; 948 1268 949 1269 // vector in propagation direction (out of triangle) … … 952 1272 TempVector.CopyVector(&CenterVector); 953 1273 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;1274 //Log() << Verbose(0) << "Projection of propagation onto temp: " << PropagationVector.Projection(&TempVector) << "." << endl; 955 1275 if (PropagationVector.ScalarProduct(&TempVector) > 0) // make sure normal propagation vector points outward from baseline 956 1276 PropagationVector.Scale(-1.); 957 Log() << Verbose( 4) << "PropagationVector of base triangle is " << PropagationVector << endl;1277 Log() << Verbose(2) << "PropagationVector of base triangle is " << PropagationVector << endl; 958 1278 winner = PointsOnBoundary.end(); 959 1279 … … 961 1281 for (PointMap::iterator target = PointsOnBoundary.begin(); target != PointsOnBoundary.end(); target++) { 962 1282 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;1283 Log() << Verbose(1) << "Target point is " << *(target->second) << ":" << endl; 964 1284 965 1285 // first check direction, so that triangles don't intersect … … 968 1288 VirtualNormalVector.ProjectOntoPlane(&NormalVector); 969 1289 TempAngle = VirtualNormalVector.Angle(&PropagationVector); 970 Log() << Verbose( 4) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl;1290 Log() << Verbose(2) << "VirtualNormalVector is " << VirtualNormalVector << " and PropagationVector is " << PropagationVector << "." << endl; 971 1291 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;1292 Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", bad direction!" << endl; 973 1293 continue; 974 1294 } else 975 Log() << Verbose( 4) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl;1295 Log() << Verbose(2) << "Angle on triangle plane between propagation direction and base line to " << *(target->second) << " is " << TempAngle << ", good direction!" << endl; 976 1296 977 1297 // check first and second endpoint (if any connecting line goes to target has at least not more than 1 triangle) … … 979 1299 LineChecker[1] = baseline->second->endpoints[1]->lines.find(target->first); 980 1300 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;1301 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 1302 continue; 983 1303 } 984 1304 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;1305 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 1306 continue; 987 1307 } … … 1000 1320 helper.ProjectOntoPlane(&TempVector); 1001 1321 if (fabs(helper.NormSquared()) < MYEPSILON) { 1002 Log() << Verbose( 4) << "Chosen set of vectors is linear dependent." << endl;1322 Log() << Verbose(2) << "Chosen set of vectors is linear dependent." << endl; 1003 1323 continue; 1004 1324 } … … 1017 1337 // calculate angle 1018 1338 TempAngle = NormalVector.Angle(&VirtualNormalVector); 1019 Log() << Verbose( 4) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl;1339 Log() << Verbose(2) << "NormalVector is " << VirtualNormalVector << " and the angle is " << TempAngle << "." << endl; 1020 1340 if ((SmallestAngle - TempAngle) > MYEPSILON) { // set to new possible winner 1021 1341 SmallestAngle = TempAngle; 1022 1342 winner = target; 1023 Log() << Verbose( 4) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;1343 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl; 1024 1344 } else if (fabs(SmallestAngle - TempAngle) < MYEPSILON) { // check the angle to propagation, both possible targets are in one plane! (their normals have same angle) 1025 1345 // hence, check the angles to some normal direction from our base line but in this common plane of both targets... … … 1039 1359 SmallestAngle = TempAngle; 1040 1360 winner = target; 1041 Log() << Verbose( 4) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl;1361 Log() << Verbose(2) << "New winner " << *winner->second->node << " due to smaller angle " << TempAngle << " to propagation direction." << endl; 1042 1362 } else 1043 Log() << Verbose( 4) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl;1363 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle to propagation direction." << endl; 1044 1364 } else 1045 Log() << Verbose( 4) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl;1365 Log() << Verbose(2) << "Keeping old winner " << *winner->second->node << " due to smaller angle between normal vectors." << endl; 1046 1366 } 1047 1367 } // end of loop over all boundary points … … 1049 1369 // 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 1370 if (winner != PointsOnBoundary.end()) { 1051 Log() << Verbose( 2) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl;1371 Log() << Verbose(0) << "Winning target point is " << *(winner->second) << " with angle " << SmallestAngle << "." << endl; 1052 1372 // create the lins of not yet present 1053 1373 BLS[0] = baseline->second; … … 1079 1399 TrianglesOnBoundaryCount++; 1080 1400 } else { 1081 Log() << Verbose(1) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl;1401 eLog() << Verbose(2) << "I could not determine a winner for this baseline " << *(baseline->second) << "." << endl; 1082 1402 } 1083 1403 1084 1404 // 5d. If the set of lines is not yet empty, go to 5. and continue 1085 1405 } else 1086 Log() << Verbose( 2) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl;1406 Log() << Verbose(0) << "Baseline candidate " << *(baseline->second) << " has a triangle count of " << baseline->second->triangles.size() << "." << endl; 1087 1407 } while (flag); 1088 1408 … … 1099 1419 bool Tesselation::InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC) 1100 1420 { 1421 Info FunctionInfo(__func__); 1101 1422 Vector Intersection, Normal; 1102 1423 TesselPoint *Walker = NULL; … … 1105 1426 bool AddFlag = false; 1106 1427 LinkedCell *BoundaryPoints = NULL; 1107 1108 Log() << Verbose(1) << "Begin of InsertStraddlingPoints" << endl;1109 1428 1110 1429 cloud->GoToFirst(); … … 1117 1436 } 1118 1437 Walker = cloud->GetPoint(); 1119 Log() << Verbose( 2) << "Current point is " << *Walker << "." << endl;1438 Log() << Verbose(0) << "Current point is " << *Walker << "." << endl; 1120 1439 // get the next triangle 1121 1440 triangles = FindClosestTrianglesToPoint(Walker->node, BoundaryPoints); 1122 1441 BTS = triangles->front(); 1123 1442 if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) { 1124 Log() << Verbose( 2) << "No triangles found, probably a tesselation point itself." << endl;1443 Log() << Verbose(0) << "No triangles found, probably a tesselation point itself." << endl; 1125 1444 cloud->GoToNext(); 1126 1445 continue; 1127 1446 } else { 1128 1447 } 1129 Log() << Verbose( 2) << "Closest triangle is " << *BTS << "." << endl;1448 Log() << Verbose(0) << "Closest triangle is " << *BTS << "." << endl; 1130 1449 // get the intersection point 1131 1450 if (BTS->GetIntersectionInsideTriangle(Center, Walker->node, &Intersection)) { 1132 Log() << Verbose( 2) << "We have an intersection at " << Intersection << "." << endl;1451 Log() << Verbose(0) << "We have an intersection at " << Intersection << "." << endl; 1133 1452 // we have the intersection, check whether in- or outside of boundary 1134 1453 if ((Center->DistanceSquared(Walker->node) - Center->DistanceSquared(&Intersection)) < -MYEPSILON) { 1135 1454 // inside, next! 1136 Log() << Verbose( 2) << *Walker << " is inside wrt triangle " << *BTS << "." << endl;1455 Log() << Verbose(0) << *Walker << " is inside wrt triangle " << *BTS << "." << endl; 1137 1456 } else { 1138 1457 // outside! 1139 Log() << Verbose( 2) << *Walker << " is outside wrt triangle " << *BTS << "." << endl;1458 Log() << Verbose(0) << *Walker << " is outside wrt triangle " << *BTS << "." << endl; 1140 1459 class BoundaryLineSet *OldLines[3], *NewLines[3]; 1141 1460 class BoundaryPointSet *OldPoints[3], *NewPoint; … … 1147 1466 Normal.CopyVector(&BTS->NormalVector); 1148 1467 // add Walker to boundary points 1149 Log() << Verbose( 2) << "Adding " << *Walker << " to BoundaryPoints." << endl;1468 Log() << Verbose(0) << "Adding " << *Walker << " to BoundaryPoints." << endl; 1150 1469 AddFlag = true; 1151 1470 if (AddBoundaryPoint(Walker,0)) … … 1154 1473 continue; 1155 1474 // remove triangle 1156 Log() << Verbose( 2) << "Erasing triangle " << *BTS << "." << endl;1475 Log() << Verbose(0) << "Erasing triangle " << *BTS << "." << endl; 1157 1476 TrianglesOnBoundary.erase(BTS->Nr); 1158 1477 delete(BTS); … … 1162 1481 BPS[1] = OldPoints[i]; 1163 1482 NewLines[i] = new class BoundaryLineSet(BPS, LinesOnBoundaryCount); 1164 Log() << Verbose( 3) << "Creating new line " << *NewLines[i] << "." << endl;1483 Log() << Verbose(1) << "Creating new line " << *NewLines[i] << "." << endl; 1165 1484 LinesOnBoundary.insert(LinePair(LinesOnBoundaryCount, NewLines[i])); // no need for check for unique insertion as BPS[0] is definitely a new one 1166 1485 LinesOnBoundaryCount++; … … 1173 1492 if (NewLines[j]->IsConnectedTo(BLS[0])) { 1174 1493 if (n>2) { 1175 Log() << Verbose(1) << BLS[0] << " connects to all of the new lines?!" << endl;1494 eLog() << Verbose(2) << BLS[0] << " connects to all of the new lines?!" << endl; 1176 1495 return false; 1177 1496 } else … … 1184 1503 BTS->GetNormalVector(Normal); 1185 1504 Normal.Scale(-1.); 1186 Log() << Verbose( 2) << "Created new triangle " << *BTS << "." << endl;1505 Log() << Verbose(0) << "Created new triangle " << *BTS << "." << endl; 1187 1506 TrianglesOnBoundary.insert(TrianglePair(TrianglesOnBoundaryCount, BTS)); 1188 1507 TrianglesOnBoundaryCount++; … … 1198 1517 // exit 1199 1518 delete(Center); 1200 Log() << Verbose(1) << "End of InsertStraddlingPoints" << endl;1201 1519 return true; 1202 1520 }; … … 1209 1527 bool Tesselation::AddBoundaryPoint(TesselPoint * Walker, const int n) 1210 1528 { 1529 Info FunctionInfo(__func__); 1211 1530 PointTestPair InsertUnique; 1212 1531 BPS[n] = new class BoundaryPointSet(Walker); … … 1230 1549 void Tesselation::AddTesselationPoint(TesselPoint* Candidate, const int n) 1231 1550 { 1551 Info FunctionInfo(__func__); 1232 1552 PointTestPair InsertUnique; 1233 1553 TPS[n] = new class BoundaryPointSet(Candidate); … … 1237 1557 } else { 1238 1558 delete TPS[n]; 1239 Log() << Verbose( 4) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl;1559 Log() << Verbose(0) << "Node " << *((InsertUnique.first)->second->node) << " is already present in PointsOnBoundary." << endl; 1240 1560 TPS[n] = (InsertUnique.first)->second; 1241 1561 } … … 1250 1570 void Tesselation::SetTesselationPoint(TesselPoint* Candidate, const int n) const 1251 1571 { 1572 Info FunctionInfo(__func__); 1252 1573 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Candidate->nr); 1253 1574 if (FindPoint != PointsOnBoundary.end()) … … 1267 1588 bool insertNewLine = true; 1268 1589 1269 if (a->lines.find(b->node->nr) != a->lines.end()) { 1270 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1590 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1591 if (FindLine != a->lines.end()) { 1592 Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl; 1593 1271 1594 pair<LineMap::iterator,LineMap::iterator> FindPair; 1272 1595 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 1596 1275 1597 for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) { … … 1277 1599 if (FindLine->second->triangles.size() < 2) { 1278 1600 insertNewLine = false; 1279 Log() << Verbose( 4) << "Using existing line " << *FindLine->second << endl;1601 Log() << Verbose(0) << "Using existing line " << *FindLine->second << endl; 1280 1602 1281 1603 BPS[0] = FindLine->second->endpoints[0]; 1282 1604 BPS[1] = FindLine->second->endpoints[1]; 1283 1605 BLS[n] = FindLine->second; 1606 1607 // remove existing line from OpenLines 1608 CandidateMap::iterator CandidateLine = OpenLines.find(BLS[n]); 1609 if (CandidateLine != OpenLines.end()) { 1610 Log() << Verbose(1) << " Removing line from OpenLines." << endl; 1611 delete(CandidateLine->second); 1612 OpenLines.erase(CandidateLine); 1613 } else { 1614 eLog() << Verbose(1) << "Line exists and is attached to less than two triangles, but not in OpenLines!" << endl; 1615 } 1284 1616 1285 1617 break; … … 1304 1636 void Tesselation::AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n) 1305 1637 { 1306 Log() << Verbose(4) << "Adding line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl; 1638 Info FunctionInfo(__func__); 1639 Log() << Verbose(0) << "Adding open line [" << LinesOnBoundaryCount << "|" << *(a->node) << " and " << *(b->node) << "." << endl; 1307 1640 BPS[0] = a; 1308 1641 BPS[1] = b; … … 1312 1645 // increase counter 1313 1646 LinesOnBoundaryCount++; 1647 // also add to open lines 1648 CandidateForTesselation *CFT = new CandidateForTesselation(BLS[n]); 1649 OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (BLS[n], CFT)); 1314 1650 }; 1315 1651 … … 1319 1655 void Tesselation::AddTesselationTriangle() 1320 1656 { 1657 Info FunctionInfo(__func__); 1321 1658 Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1322 1659 … … 1337 1674 void Tesselation::AddTesselationTriangle(const int nr) 1338 1675 { 1339 Log() << Verbose(1) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1676 Info FunctionInfo(__func__); 1677 Log() << Verbose(0) << "Adding triangle to global TrianglesOnBoundary map." << endl; 1340 1678 1341 1679 // add triangle to global map … … 1355 1693 void Tesselation::RemoveTesselationTriangle(class BoundaryTriangleSet *triangle) 1356 1694 { 1695 Info FunctionInfo(__func__); 1357 1696 if (triangle == NULL) 1358 1697 return; 1359 1698 for (int i = 0; i < 3; i++) { 1360 1699 if (triangle->lines[i] != NULL) { 1361 Log() << Verbose( 5) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl;1700 Log() << Verbose(0) << "Removing triangle Nr." << triangle->Nr << " in line " << *triangle->lines[i] << "." << endl; 1362 1701 triangle->lines[i]->triangles.erase(triangle->Nr); 1363 1702 if (triangle->lines[i]->triangles.empty()) { 1364 Log() << Verbose( 5) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl;1703 Log() << Verbose(0) << *triangle->lines[i] << " is no more attached to any triangle, erasing." << endl; 1365 1704 RemoveTesselationLine(triangle->lines[i]); 1366 1705 } else { 1367 Log() << Verbose(5) << *triangle->lines[i] << " is still attached to another triangle: "; 1706 Log() << Verbose(0) << *triangle->lines[i] << " is still attached to another triangle: "; 1707 OpenLines.insert(pair< BoundaryLineSet *, CandidateForTesselation *> (triangle->lines[i], NULL)); 1368 1708 for(TriangleMap::iterator TriangleRunner = triangle->lines[i]->triangles.begin(); TriangleRunner != triangle->lines[i]->triangles.end(); TriangleRunner++) 1369 1709 Log() << Verbose(0) << "[" << (TriangleRunner->second)->Nr << "|" << *((TriangleRunner->second)->endpoints[0]) << ", " << *((TriangleRunner->second)->endpoints[1]) << ", " << *((TriangleRunner->second)->endpoints[2]) << "] \t"; 1370 1710 Log() << Verbose(0) << endl; 1371 1711 // for (int j=0;j<2;j++) { 1372 // Log() << Verbose( 5) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": ";1712 // Log() << Verbose(0) << "Lines of endpoint " << *(triangle->lines[i]->endpoints[j]) << ": "; 1373 1713 // for(LineMap::iterator LineRunner = triangle->lines[i]->endpoints[j]->lines.begin(); LineRunner != triangle->lines[i]->endpoints[j]->lines.end(); LineRunner++) 1374 1714 // Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t"; … … 1382 1722 1383 1723 if (TrianglesOnBoundary.erase(triangle->Nr)) 1384 Log() << Verbose( 5) << "Removing triangle Nr. " << triangle->Nr << "." << endl;1724 Log() << Verbose(0) << "Removing triangle Nr. " << triangle->Nr << "." << endl; 1385 1725 delete(triangle); 1386 1726 }; … … 1392 1732 void Tesselation::RemoveTesselationLine(class BoundaryLineSet *line) 1393 1733 { 1734 Info FunctionInfo(__func__); 1394 1735 int Numbers[2]; 1395 1736 … … 1412 1753 for (LineMap::iterator Runner = erasor.first; Runner != erasor.second; Runner++) 1413 1754 if ((*Runner).second == line) { 1414 Log() << Verbose( 5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;1755 Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl; 1415 1756 line->endpoints[i]->lines.erase(Runner); 1416 1757 break; … … 1418 1759 } else { // there's just a single line left 1419 1760 if (line->endpoints[i]->lines.erase(line->Nr)) 1420 Log() << Verbose( 5) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl;1761 Log() << Verbose(0) << "Removing Line Nr. " << line->Nr << " in boundary point " << *line->endpoints[i] << "." << endl; 1421 1762 } 1422 1763 if (line->endpoints[i]->lines.empty()) { 1423 Log() << Verbose( 5) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl;1764 Log() << Verbose(0) << *line->endpoints[i] << " has no more lines it's attached to, erasing." << endl; 1424 1765 RemoveTesselationPoint(line->endpoints[i]); 1425 1766 } else { 1426 Log() << Verbose( 5) << *line->endpoints[i] << " has still lines it's attached to: ";1767 Log() << Verbose(0) << *line->endpoints[i] << " has still lines it's attached to: "; 1427 1768 for(LineMap::iterator LineRunner = line->endpoints[i]->lines.begin(); LineRunner != line->endpoints[i]->lines.end(); LineRunner++) 1428 1769 Log() << Verbose(0) << "[" << *(LineRunner->second) << "] \t"; … … 1437 1778 1438 1779 if (LinesOnBoundary.erase(line->Nr)) 1439 Log() << Verbose( 5) << "Removing line Nr. " << line->Nr << "." << endl;1780 Log() << Verbose(0) << "Removing line Nr. " << line->Nr << "." << endl; 1440 1781 delete(line); 1441 1782 }; … … 1448 1789 void Tesselation::RemoveTesselationPoint(class BoundaryPointSet *point) 1449 1790 { 1791 Info FunctionInfo(__func__); 1450 1792 if (point == NULL) 1451 1793 return; 1452 1794 if (PointsOnBoundary.erase(point->Nr)) 1453 Log() << Verbose( 5) << "Removing point Nr. " << point->Nr << "." << endl;1795 Log() << Verbose(0) << "Removing point Nr. " << point->Nr << "." << endl; 1454 1796 delete(point); 1455 1797 }; … … 1466 1808 int Tesselation::CheckPresenceOfTriangle(TesselPoint *Candidates[3]) const 1467 1809 { 1810 Info FunctionInfo(__func__); 1468 1811 int adjacentTriangleCount = 0; 1469 1812 class BoundaryPointSet *Points[3]; 1470 1813 1471 Log() << Verbose(2) << "Begin of CheckPresenceOfTriangle" << endl;1472 1814 // builds a triangle point set (Points) of the end points 1473 1815 for (int i = 0; i < 3; i++) { … … 1488 1830 for (; (FindLine != Points[i]->lines.end()) && (FindLine->first == Points[j]->node->nr); FindLine++) { 1489 1831 TriangleMap *triangles = &FindLine->second->triangles; 1490 Log() << Verbose( 3) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl;1832 Log() << Verbose(1) << "Current line is " << FindLine->first << ": " << *(FindLine->second) << " with triangles " << triangles << "." << endl; 1491 1833 for (TriangleMap::const_iterator FindTriangle = triangles->begin(); FindTriangle != triangles->end(); FindTriangle++) { 1492 1834 if (FindTriangle->second->IsPresentTupel(Points)) { … … 1494 1836 } 1495 1837 } 1496 Log() << Verbose( 3) << "end." << endl;1838 Log() << Verbose(1) << "end." << endl; 1497 1839 } 1498 1840 // 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;1841 //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1500 1842 //return adjacentTriangleCount; 1501 1843 } … … 1504 1846 } 1505 1847 1506 Log() << Verbose(2) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1507 Log() << Verbose(2) << "End of CheckPresenceOfTriangle" << endl; 1848 Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1508 1849 return adjacentTriangleCount; 1509 1850 }; … … 1519 1860 class BoundaryTriangleSet * Tesselation::GetPresentTriangle(TesselPoint *Candidates[3]) 1520 1861 { 1862 Info FunctionInfo(__func__); 1521 1863 class BoundaryTriangleSet *triangle = NULL; 1522 1864 class BoundaryPointSet *Points[3]; … … 1548 1890 } 1549 1891 // 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;1892 //Log() << Verbose(0) << "Found " << adjacentTriangleCount << " adjacent triangles for the point set." << endl; 1551 1893 //return adjacentTriangleCount; 1552 1894 } … … 1569 1911 void Tesselation::FindStartingTriangle(const double RADIUS, const LinkedCell *LC) 1570 1912 { 1571 Log() << Verbose(1) << "Begin of FindStartingTriangle\n";1913 Info FunctionInfo(__func__); 1572 1914 int i = 0; 1573 TesselPoint* FirstPoint = NULL;1574 TesselPoint* SecondPoint = NULL;1575 1915 TesselPoint* MaxPoint[NDIM]; 1916 TesselPoint* Temporary; 1576 1917 double maxCoordinate[NDIM]; 1577 Vector Oben;1918 BoundaryLineSet BaseLine; 1578 1919 Vector helper; 1579 1920 Vector Chord; 1580 1921 Vector SearchDirection; 1581 1582 Oben.Zero(); 1922 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 1923 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in 1924 Vector SphereCenter; 1925 Vector NormalVector; 1926 1927 NormalVector.Zero(); 1583 1928 1584 1929 for (i = 0; i < 3; i++) { … … 1593 1938 for (LC->n[(i+2)%NDIM]=0;LC->n[(i+2)%NDIM]<LC->N[(i+2)%NDIM];LC->n[(i+2)%NDIM]++) { 1594 1939 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;1940 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 1596 1941 if (List != NULL) { 1597 1942 for (LinkedNodes::const_iterator Runner = List->begin();Runner != List->end();Runner++) { 1598 1943 if ((*Runner)->node->x[i] > maxCoordinate[i]) { 1599 Log() << Verbose( 2) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl;1944 Log() << Verbose(1) << "New maximal for axis " << i << " node is " << *(*Runner) << " at " << *(*Runner)->node << "." << endl; 1600 1945 maxCoordinate[i] = (*Runner)->node->x[i]; 1601 1946 MaxPoint[i] = (*Runner); … … 1608 1953 } 1609 1954 1610 Log() << Verbose( 2) << "Found maximum coordinates: ";1955 Log() << Verbose(1) << "Found maximum coordinates: "; 1611 1956 for (int i=0;i<NDIM;i++) 1612 1957 Log() << Verbose(0) << i << ": " << *MaxPoint[i] << "\t"; … … 1614 1959 1615 1960 BTS = NULL; 1616 CandidateList *OptCandidates = new CandidateList();1617 1961 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;1962 NormalVector.Zero(); 1963 NormalVector.x[k] = 1.; 1964 BaseLine.endpoints[0] = new BoundaryPointSet(MaxPoint[k]); 1965 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; 1622 1966 1623 1967 double ShortestAngle; 1624 TesselPoint* OptCandidate = NULL;1625 1968 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 1969 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? 1970 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_... 1971 if (Temporary == NULL) // have we found a second point? 1630 1972 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); 1973 BaseLine.endpoints[1] = new BoundaryPointSet(Temporary); 1974 1975 // construct center of circle 1976 CircleCenter.CopyVector(BaseLine.endpoints[0]->node->node); 1977 CircleCenter.AddVector(BaseLine.endpoints[1]->node->node); 1978 CircleCenter.Scale(0.5); 1979 1980 // construct normal vector of circle 1981 CirclePlaneNormal.CopyVector(BaseLine.endpoints[0]->node->node); 1982 CirclePlaneNormal.SubtractVector(BaseLine.endpoints[1]->node->node); 1983 1984 double radius = CirclePlaneNormal.NormSquared(); 1985 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 1986 1987 NormalVector.ProjectOntoPlane(&CirclePlaneNormal); 1988 NormalVector.Normalize(); 1638 1989 ShortestAngle = 2.*M_PI; // This will indicate the quadrant. 1639 1990 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) 1991 SphereCenter.CopyVector(&NormalVector); 1992 SphereCenter.Scale(CircleRadius); 1993 SphereCenter.AddVector(&CircleCenter); 1994 // Now, NormalVector and SphereCenter are two orthonormalized vectors in the plane defined by CirclePlaneNormal (not normalized) 1647 1995 1648 1996 // 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 ...1997 SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector); // whether we look "left" first or "right" first is not important ... 1650 1998 1651 1999 // 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 } 2000 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; 2001 Log() << Verbose(0) << "Found second point is at " << *BaseLine.endpoints[1]->node << ".\n"; 2002 2003 //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << helper << ".\n"; 2004 CandidateForTesselation OptCandidates(&BaseLine); 2005 FindThirdPointForTesselation(NormalVector, SearchDirection, SphereCenter, OptCandidates, NULL, RADIUS, LC); 2006 Log() << Verbose(0) << "List of third Points is:" << endl; 2007 for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); it++) { 2008 Log() << Verbose(0) << " " << *(*it) << endl; 2009 } 2010 2011 BTS = NULL; 2012 AddCandidateTriangle(OptCandidates); 2013 // delete(BaseLine.endpoints[0]); 2014 // delete(BaseLine.endpoints[1]); 2015 1693 2016 if (BTS != NULL) // we have created one starting triangle 1694 2017 break; 1695 2018 else { 1696 2019 // 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"; 2020 OptCandidates.pointlist.clear(); 2021 } 2022 } 1714 2023 }; 1715 2024 1716 2025 /** Checks for a given baseline and a third point candidate whether baselines of the found triangle don't have even better candidates. 1717 2026 * This is supposed to prevent early closing of the tesselation. 1718 * \param *BaseRay baseline, i.e. not \a *OptCandidate2027 * \param CandidateLine CandidateForTesselation with baseline and shortestangle , i.e. not \a *OptCandidate 1719 2028 * \param *ThirdNode third point in triangle, not in BoundaryLineSet::endpoints 1720 * \param ShortestAngle path length on this circle band for the current \a *ThirdNode1721 2029 * \param RADIUS radius of sphere 1722 2030 * \param *LC LinkedCell structure 1723 2031 * \return true - there is a better candidate (smaller angle than \a ShortestAngle), false - no better TesselPoint candidate found 1724 2032 */ 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 }; 2033 //bool Tesselation::HasOtherBaselineBetterCandidate(CandidateForTesselation &CandidateLine, const TesselPoint * const ThirdNode, double RADIUS, const LinkedCell * const LC) const 2034 //{ 2035 // Info FunctionInfo(__func__); 2036 // bool result = false; 2037 // Vector CircleCenter; 2038 // Vector CirclePlaneNormal; 2039 // Vector OldSphereCenter; 2040 // Vector SearchDirection; 2041 // Vector helper; 2042 // TesselPoint *OtherOptCandidate = NULL; 2043 // double OtherShortestAngle = 2.*M_PI; // This will indicate the quadrant. 2044 // double radius, CircleRadius; 2045 // BoundaryLineSet *Line = NULL; 2046 // BoundaryTriangleSet *T = NULL; 2047 // 2048 // // check both other lines 2049 // PointMap::const_iterator FindPoint = PointsOnBoundary.find(ThirdNode->nr); 2050 // if (FindPoint != PointsOnBoundary.end()) { 2051 // for (int i=0;i<2;i++) { 2052 // LineMap::const_iterator FindLine = (FindPoint->second)->lines.find(BaseRay->endpoints[0]->node->nr); 2053 // if (FindLine != (FindPoint->second)->lines.end()) { 2054 // Line = FindLine->second; 2055 // Log() << Verbose(0) << "Found line " << *Line << "." << endl; 2056 // if (Line->triangles.size() == 1) { 2057 // T = Line->triangles.begin()->second; 2058 // // construct center of circle 2059 // CircleCenter.CopyVector(Line->endpoints[0]->node->node); 2060 // CircleCenter.AddVector(Line->endpoints[1]->node->node); 2061 // CircleCenter.Scale(0.5); 2062 // 2063 // // construct normal vector of circle 2064 // CirclePlaneNormal.CopyVector(Line->endpoints[0]->node->node); 2065 // CirclePlaneNormal.SubtractVector(Line->endpoints[1]->node->node); 2066 // 2067 // // calculate squared radius of circle 2068 // radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 2069 // if (radius/4. < RADIUS*RADIUS) { 2070 // CircleRadius = RADIUS*RADIUS - radius/4.; 2071 // CirclePlaneNormal.Normalize(); 2072 // //Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2073 // 2074 // // construct old center 2075 // GetCenterofCircumcircle(&OldSphereCenter, *T->endpoints[0]->node->node, *T->endpoints[1]->node->node, *T->endpoints[2]->node->node); 2076 // helper.CopyVector(&T->NormalVector); // normal vector ensures that this is correct center of the two possible ones 2077 // radius = Line->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 2078 // helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2079 // OldSphereCenter.AddVector(&helper); 2080 // OldSphereCenter.SubtractVector(&CircleCenter); 2081 // //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 2082 // 2083 // // construct SearchDirection 2084 // SearchDirection.MakeNormalVector(&T->NormalVector, &CirclePlaneNormal); 2085 // helper.CopyVector(Line->endpoints[0]->node->node); 2086 // helper.SubtractVector(ThirdNode->node); 2087 // if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 2088 // SearchDirection.Scale(-1.); 2089 // SearchDirection.ProjectOntoPlane(&OldSphereCenter); 2090 // SearchDirection.Normalize(); 2091 // Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2092 // if (fabs(OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 2093 // // rotated the wrong way! 2094 // eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; 2095 // } 2096 // 2097 // // add third point 2098 // FindThirdPointForTesselation(T->NormalVector, SearchDirection, OldSphereCenter, OptCandidates, ThirdNode, RADIUS, LC); 2099 // for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); ++it) { 2100 // if (((*it) == BaseRay->endpoints[0]->node) || ((*it) == BaseRay->endpoints[1]->node)) // skip if it's the same triangle than suggested 2101 // continue; 2102 // Log() << Verbose(0) << " Third point candidate is " << (*it) 2103 // << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 2104 // Log() << Verbose(0) << " Baseline is " << *BaseRay << endl; 2105 // 2106 // // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 2107 // TesselPoint *PointCandidates[3]; 2108 // PointCandidates[0] = (*it); 2109 // PointCandidates[1] = BaseRay->endpoints[0]->node; 2110 // PointCandidates[2] = BaseRay->endpoints[1]->node; 2111 // bool check=false; 2112 // int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 2113 // // If there is no triangle, add it regularly. 2114 // if (existentTrianglesCount == 0) { 2115 // SetTesselationPoint((*it), 0); 2116 // SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 2117 // SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 2118 // 2119 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 2120 // OtherOptCandidate = (*it); 2121 // check = true; 2122 // } 2123 // } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 2124 // SetTesselationPoint((*it), 0); 2125 // SetTesselationPoint(BaseRay->endpoints[0]->node, 1); 2126 // SetTesselationPoint(BaseRay->endpoints[1]->node, 2); 2127 // 2128 // // 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) 2129 // // i.e. at least one of the three lines must be present with TriangleCount <= 1 2130 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS)) { 2131 // OtherOptCandidate = (*it); 2132 // check = true; 2133 // } 2134 // } 2135 // 2136 // if (check) { 2137 // if (ShortestAngle > OtherShortestAngle) { 2138 // Log() << Verbose(0) << "There is a better candidate than " << *ThirdNode << " with " << ShortestAngle << " from baseline " << *Line << ": " << *OtherOptCandidate << " with " << OtherShortestAngle << "." << endl; 2139 // result = true; 2140 // break; 2141 // } 2142 // } 2143 // } 2144 // delete(OptCandidates); 2145 // if (result) 2146 // break; 2147 // } else { 2148 // Log() << Verbose(0) << "Circumcircle for base line " << *Line << " and base triangle " << T << " is too big!" << endl; 2149 // } 2150 // } else { 2151 // eLog() << Verbose(2) << "Baseline is connected to two triangles already?" << endl; 2152 // } 2153 // } else { 2154 // Log() << Verbose(1) << "No present baseline between " << BaseRay->endpoints[0] << " and candidate " << *ThirdNode << "." << endl; 2155 // } 2156 // } 2157 // } else { 2158 // eLog() << Verbose(1) << "Could not find the TesselPoint " << *ThirdNode << "." << endl; 2159 // } 2160 // 2161 // return result; 2162 //}; 1859 2163 1860 2164 /** This function finds a triangle to a line, adjacent to an existing one. 1861 2165 * @param out output stream for debugging 1862 * @param Line currentbaseline to search from2166 * @param CandidateLine current cadndiate baseline to search from 1863 2167 * @param T current triangle which \a Line is edge of 1864 2168 * @param RADIUS radius of the rolling ball … … 1866 2170 * @param *LC LinkedCell structure with neighbouring points 1867 2171 */ 1868 bool Tesselation::FindNextSuitableTriangle( BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC)1869 { 1870 Log() << Verbose(0) << "Begin of FindNextSuitableTriangle\n";2172 bool Tesselation::FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC) 2173 { 2174 Info FunctionInfo(__func__); 1871 2175 bool result = true; 1872 CandidateList *OptCandidates = new CandidateList();1873 2176 1874 2177 Vector CircleCenter; 1875 2178 Vector CirclePlaneNormal; 1876 Vector OldSphereCenter;2179 Vector RelativeSphereCenter; 1877 2180 Vector SearchDirection; 1878 2181 Vector helper; 1879 2182 TesselPoint *ThirdNode = NULL; 1880 2183 LineMap::iterator testline; 1881 double ShortestAngle = 2.*M_PI; // This will indicate the quadrant.1882 2184 double radius, CircleRadius; 1883 2185 1884 Log() << Verbose(1) << "Current baseline is " << Line << " of triangle " << T << "." << endl;1885 2186 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))2187 if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) { 1887 2188 ThirdNode = T.endpoints[i]->node; 2189 break; 2190 } 2191 Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl; 1888 2192 1889 2193 // construct center of circle 1890 CircleCenter.CopyVector( Line.endpoints[0]->node->node);1891 CircleCenter.AddVector( Line.endpoints[1]->node->node);2194 CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2195 CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node); 1892 2196 CircleCenter.Scale(0.5); 1893 2197 1894 2198 // construct normal vector of circle 1895 CirclePlaneNormal.CopyVector( Line.endpoints[0]->node->node);1896 CirclePlaneNormal.SubtractVector( Line.endpoints[1]->node->node);2199 CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2200 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 1897 2201 1898 2202 // calculate squared radius of circle 1899 2203 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 1900 2204 if (radius/4. < RADIUS*RADIUS) { 2205 // construct relative sphere center with now known CircleCenter 2206 RelativeSphereCenter.CopyVector(&T.SphereCenter); 2207 RelativeSphereCenter.SubtractVector(&CircleCenter); 2208 1901 2209 CircleRadius = RADIUS*RADIUS - radius/4.; 1902 2210 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); 2211 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2212 2213 Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl; 2214 2215 // construct SearchDirection and an "outward pointer" 2216 SearchDirection.MakeNormalVector(&RelativeSphereCenter, &CirclePlaneNormal); 2217 helper.CopyVector(&CircleCenter); 1917 2218 helper.SubtractVector(ThirdNode->node); 1918 2219 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 1919 2220 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) { 2221 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2222 if (fabs(RelativeSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 1924 2223 // rotated the wrong way! 1925 2224 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; … … 1927 2226 1928 2227 // add third point 1929 FindThirdPointForTesselation(T.NormalVector, SearchDirection, OldSphereCenter, &Line, ThirdNode, OptCandidates, &ShortestAngle, RADIUS, LC);2228 FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdNode, RADIUS, LC); 1930 2229 1931 2230 } 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()) {2231 Log() << Verbose(0) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and base triangle " << T << " is too big!" << endl; 2232 } 2233 2234 if (CandidateLine.pointlist.empty()) { 1936 2235 eLog() << Verbose(2) << "Could not find a suitable candidate." << endl; 1937 2236 return false; 1938 2237 } 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"; 2238 Log() << Verbose(0) << "Third Points are: " << endl; 2239 for (TesselPointList::iterator it = CandidateLine.pointlist.begin(); it != CandidateLine.pointlist.end(); ++it) { 2240 Log() << Verbose(0) << " " << *(*it) << endl; 2241 } 2242 2243 return true; 2244 2245 // BoundaryLineSet *BaseRay = CandidateLine.BaseLine; 2246 // for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2247 // Log() << Verbose(0) << "Third point candidate is " << *(*it)->point 2248 // << " with circumsphere's center at " << (*it)->OptCenter << "." << endl; 2249 // Log() << Verbose(0) << "Baseline is " << *BaseRay << endl; 2250 // 2251 // // check whether all edges of the new triangle still have space for one more triangle (i.e. TriangleCount <2) 2252 // TesselPoint *PointCandidates[3]; 2253 // PointCandidates[0] = (*it)->point; 2254 // PointCandidates[1] = BaseRay->endpoints[0]->node; 2255 // PointCandidates[2] = BaseRay->endpoints[1]->node; 2256 // int existentTrianglesCount = CheckPresenceOfTriangle(PointCandidates); 2257 // 2258 // BTS = NULL; 2259 // // check for present edges and whether we reach better candidates from them 2260 // //if (HasOtherBaselineBetterCandidate(BaseRay, (*it)->point, ShortestAngle, RADIUS, LC) ) { 2261 // if (0) { 2262 // result = false; 2263 // break; 2264 // } else { 2265 // // If there is no triangle, add it regularly. 2266 // if (existentTrianglesCount == 0) { 2267 // AddTesselationPoint((*it)->point, 0); 2268 // AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 2269 // AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 2270 // 2271 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const )TPS)) { 2272 // CandidateLine.point = (*it)->point; 2273 // CandidateLine.OptCenter.CopyVector(&((*it)->OptCenter)); 2274 // CandidateLine.OtherOptCenter.CopyVector(&((*it)->OtherOptCenter)); 2275 // CandidateLine.ShortestAngle = ShortestAngle; 2276 // } else { 2277 //// eLog() << Verbose(1) << "This triangle consisting of "; 2278 //// Log() << Verbose(0) << *(*it)->point << ", "; 2279 //// Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2280 //// Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2281 //// Log() << Verbose(0) << "exists and is not added, as it 0x80000000006fc150(does not seem helpful!" << endl; 2282 // result = false; 2283 // } 2284 // } else if ((existentTrianglesCount >= 1) && (existentTrianglesCount <= 3)) { // If there is a planar region within the structure, we need this triangle a second time. 2285 // AddTesselationPoint((*it)->point, 0); 2286 // AddTesselationPoint(BaseRay->endpoints[0]->node, 1); 2287 // AddTesselationPoint(BaseRay->endpoints[1]->node, 2); 2288 // 2289 // // 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) 2290 // // i.e. at least one of the three lines must be present with TriangleCount <= 1 2291 // if (CheckLineCriteriaForDegeneratedTriangle((const BoundaryPointSet ** const)TPS) || CandidateLine.BaseLine->skipped) { 2292 // CandidateLine.point = (*it)->point; 2293 // CandidateLine.OptCenter.CopyVector(&(*it)->OptCenter); 2294 // CandidateLine.OtherOptCenter.CopyVector(&(*it)->OtherOptCenter); 2295 // CandidateLine.ShortestAngle = ShortestAngle+2.*M_PI; 2296 // 2297 // } else { 2298 //// 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; 2299 // result = false; 2300 // } 2301 // } else { 2302 //// Log() << Verbose(1) << "This triangle consisting of "; 2303 //// Log() << Verbose(0) << *(*it)->point << ", "; 2304 //// Log() << Verbose(0) << *BaseRay->endpoints[0]->node << " and "; 2305 //// Log() << Verbose(0) << *BaseRay->endpoints[1]->node << " "; 2306 //// Log() << Verbose(0) << "is invalid!" << endl; 2307 // result = false; 2308 // } 2309 // } 2310 // 2311 // // set baseline to new ray from ref point (here endpoints[0]->node) to current candidate (here (*it)->point)) 2312 // BaseRay = BLS[0]; 2313 // if ((BTS != NULL) && (BTS->NormalVector.NormSquared() < MYEPSILON)) { 2314 // eLog() << Verbose(1) << "Triangle " << *BTS << " has zero normal vector!" << endl; 2315 // exit(255); 2316 // } 2317 // 2318 // } 2319 // 2320 // // remove all candidates from the list and then the list itself 2321 // class CandidateForTesselation *remover = NULL; 2322 // for (CandidateList::iterator it = OptCandidates->begin(); it != OptCandidates->end(); ++it) { 2323 // remover = *it; 2324 // delete(remover); 2325 // } 2326 // delete(OptCandidates); 2043 2327 return result; 2328 }; 2329 2330 /** Adds the present line and candidate point from \a &CandidateLine to the Tesselation. 2331 * \param CandidateLine triangle to add 2332 * \NOTE we need the copy operator here as the original CandidateForTesselation is removed in AddTesselationLine() 2333 */ 2334 void Tesselation::AddCandidateTriangle(CandidateForTesselation CandidateLine) 2335 { 2336 Info FunctionInfo(__func__); 2337 Vector Center; 2338 TesselPoint * const TurningPoint = CandidateLine.BaseLine->endpoints[0]->node; 2339 2340 // fill the set of neighbours 2341 Center.CopyVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2342 Center.SubtractVector(TurningPoint->node); 2343 set<TesselPoint*> SetOfNeighbours; 2344 SetOfNeighbours.insert(CandidateLine.BaseLine->endpoints[1]->node); 2345 for (TesselPointList::iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); Runner++) 2346 SetOfNeighbours.insert(*Runner); 2347 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, &Center); 2348 2349 // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles) 2350 TesselPointList::iterator Runner = connectedClosestPoints->begin(); 2351 TesselPointList::iterator Sprinter = Runner; 2352 Sprinter++; 2353 while(Sprinter != connectedClosestPoints->end()) { 2354 // add the points 2355 AddTesselationPoint(TurningPoint, 0); 2356 AddTesselationPoint((*Runner), 1); 2357 AddTesselationPoint((*Sprinter), 2); 2358 2359 2360 // add the lines 2361 AddTesselationLine(TPS[0], TPS[1], 0); 2362 AddTesselationLine(TPS[0], TPS[2], 1); 2363 AddTesselationLine(TPS[1], TPS[2], 2); 2364 2365 // add the triangles 2366 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 2367 AddTesselationTriangle(); 2368 BTS->GetCenter(&Center); 2369 Center.SubtractVector(&CandidateLine.OptCenter); 2370 BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter); 2371 BTS->GetNormalVector(Center); 2372 2373 Log() << Verbose(0) << "--> New triangle with " << *BTS << " and normal vector " << BTS->NormalVector << "." << endl; 2374 Runner = Sprinter; 2375 Sprinter++; 2376 } 2377 delete(connectedClosestPoints); 2044 2378 }; 2045 2379 … … 2053 2387 class BoundaryPointSet *Tesselation::IsConvexRectangle(class BoundaryLineSet *Base) 2054 2388 { 2389 Info FunctionInfo(__func__); 2055 2390 class BoundaryPointSet *Spot = NULL; 2056 2391 class BoundaryLineSet *OtherBase; … … 2064 2399 OtherBase = new class BoundaryLineSet(BPS,-1); 2065 2400 2066 Log() << Verbose( 3) << "INFO: Current base line is " << *Base << "." << endl;2067 Log() << Verbose( 3) << "INFO: Other base line is " << *OtherBase << "." << endl;2401 Log() << Verbose(1) << "INFO: Current base line is " << *Base << "." << endl; 2402 Log() << Verbose(1) << "INFO: Other base line is " << *OtherBase << "." << endl; 2068 2403 2069 2404 // get the closest point on each line to the other line … … 2085 2420 delete(ClosestPoint); 2086 2421 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;2422 Log() << Verbose(1) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << "' rectangle is concave." << endl; 2088 2423 if (distance[0] < distance[1]) { 2089 2424 Spot = Base->endpoints[0]; … … 2093 2428 return Spot; 2094 2429 } else { // different sign, i.e. we are in between 2095 Log() << Verbose( 3) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl;2430 Log() << Verbose(0) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl; 2096 2431 return NULL; 2097 2432 } … … 2101 2436 void Tesselation::PrintAllBoundaryPoints(ofstream *out) const 2102 2437 { 2438 Info FunctionInfo(__func__); 2103 2439 // print all lines 2104 Log() << Verbose( 1) << "Printing all boundary points for debugging:" << endl;2440 Log() << Verbose(0) << "Printing all boundary points for debugging:" << endl; 2105 2441 for (PointMap::const_iterator PointRunner = PointsOnBoundary.begin();PointRunner != PointsOnBoundary.end(); PointRunner++) 2106 Log() << Verbose( 2) << *(PointRunner->second) << endl;2442 Log() << Verbose(0) << *(PointRunner->second) << endl; 2107 2443 }; 2108 2444 2109 2445 void Tesselation::PrintAllBoundaryLines(ofstream *out) const 2110 2446 { 2447 Info FunctionInfo(__func__); 2111 2448 // print all lines 2112 Log() << Verbose( 1) << "Printing all boundary lines for debugging:" << endl;2449 Log() << Verbose(0) << "Printing all boundary lines for debugging:" << endl; 2113 2450 for (LineMap::const_iterator LineRunner = LinesOnBoundary.begin(); LineRunner != LinesOnBoundary.end(); LineRunner++) 2114 Log() << Verbose( 2) << *(LineRunner->second) << endl;2451 Log() << Verbose(0) << *(LineRunner->second) << endl; 2115 2452 }; 2116 2453 2117 2454 void Tesselation::PrintAllBoundaryTriangles(ofstream *out) const 2118 2455 { 2456 Info FunctionInfo(__func__); 2119 2457 // print all triangles 2120 Log() << Verbose( 1) << "Printing all boundary triangles for debugging:" << endl;2458 Log() << Verbose(0) << "Printing all boundary triangles for debugging:" << endl; 2121 2459 for (TriangleMap::const_iterator TriangleRunner = TrianglesOnBoundary.begin(); TriangleRunner != TrianglesOnBoundary.end(); TriangleRunner++) 2122 Log() << Verbose( 2) << *(TriangleRunner->second) << endl;2460 Log() << Verbose(0) << *(TriangleRunner->second) << endl; 2123 2461 }; 2124 2462 … … 2130 2468 double Tesselation::PickFarthestofTwoBaselines(class BoundaryLineSet *Base) 2131 2469 { 2470 Info FunctionInfo(__func__); 2132 2471 class BoundaryLineSet *OtherBase; 2133 2472 Vector *ClosestPoint[2]; … … 2141 2480 OtherBase = new class BoundaryLineSet(BPS,-1); 2142 2481 2143 Log() << Verbose( 3) << "INFO: Current base line is " << *Base << "." << endl;2144 Log() << Verbose( 3) << "INFO: Other base line is " << *OtherBase << "." << endl;2482 Log() << Verbose(0) << "INFO: Current base line is " << *Base << "." << endl; 2483 Log() << Verbose(0) << "INFO: Other base line is " << *OtherBase << "." << endl; 2145 2484 2146 2485 // get the closest point on each line to the other line … … 2162 2501 2163 2502 if (Distance.NormSquared() < MYEPSILON) { // check for intersection 2164 Log() << Verbose( 3) << "REJECT: Both lines have an intersection: Nothing to do." << endl;2503 Log() << Verbose(0) << "REJECT: Both lines have an intersection: Nothing to do." << endl; 2165 2504 return false; 2166 2505 } else { // check for sign against BaseLineNormal … … 2172 2511 } 2173 2512 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;2513 Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl; 2175 2514 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 2176 2515 } … … 2178 2517 2179 2518 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;2519 Log() << Verbose(0) << "ACCEPT: Other base line would be higher: Flipping baseline." << endl; 2181 2520 // calculate volume summand as a general tetraeder 2182 2521 return volume; 2183 2522 } else { // Base higher than OtherBase -> do nothing 2184 Log() << Verbose( 2) << "REJECT: Base line is higher: Nothing to do." << endl;2523 Log() << Verbose(0) << "REJECT: Base line is higher: Nothing to do." << endl; 2185 2524 return 0.; 2186 2525 } … … 2197 2536 class BoundaryLineSet * Tesselation::FlipBaseline(class BoundaryLineSet *Base) 2198 2537 { 2538 Info FunctionInfo(__func__); 2199 2539 class BoundaryLineSet *OldLines[4], *NewLine; 2200 2540 class BoundaryPointSet *OldPoints[2]; … … 2203 2543 int i,m; 2204 2544 2205 Log() << Verbose(1) << "Begin of FlipBaseline" << endl;2206 2207 2545 // calculate NormalVector for later use 2208 2546 BaseLineNormal.Zero(); … … 2212 2550 } 2213 2551 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;2552 Log() << Verbose(1) << "INFO: Adding NormalVector " << runner->second->NormalVector << " of triangle " << *(runner->second) << "." << endl; 2215 2553 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 2216 2554 } … … 2225 2563 i=0; 2226 2564 m=0; 2227 Log() << Verbose( 3) << "The four old lines are: ";2565 Log() << Verbose(0) << "The four old lines are: "; 2228 2566 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) 2229 2567 for (int j=0;j<3;j++) // all of their endpoints and baselines … … 2233 2571 } 2234 2572 Log() << Verbose(0) << endl; 2235 Log() << Verbose( 3) << "The two old points are: ";2573 Log() << Verbose(0) << "The two old points are: "; 2236 2574 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) 2237 2575 for (int j=0;j<3;j++) // all of their endpoints and baselines … … 2259 2597 2260 2598 // remove triangles and baseline removes itself 2261 Log() << Verbose( 3) << "INFO: Deleting baseline " << *Base << " from global list." << endl;2599 Log() << Verbose(0) << "INFO: Deleting baseline " << *Base << " from global list." << endl; 2262 2600 OldBaseLineNr = Base->Nr; 2263 2601 m=0; 2264 2602 for(TriangleMap::iterator runner = Base->triangles.begin(); runner != Base->triangles.end(); runner++) { 2265 Log() << Verbose( 3) << "INFO: Deleting triangle " << *(runner->second) << "." << endl;2603 Log() << Verbose(0) << "INFO: Deleting triangle " << *(runner->second) << "." << endl; 2266 2604 OldTriangleNrs[m++] = runner->second->Nr; 2267 2605 RemoveTesselationTriangle(runner->second); … … 2273 2611 NewLine = new class BoundaryLineSet(BPS, OldBaseLineNr); 2274 2612 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;2613 Log() << Verbose(0) << "INFO: Created new baseline " << *NewLine << "." << endl; 2276 2614 2277 2615 // construct new triangles with flipped baseline … … 2288 2626 BTS->GetNormalVector(BaseLineNormal); 2289 2627 AddTesselationTriangle(OldTriangleNrs[0]); 2290 Log() << Verbose( 3) << "INFO: Created new triangle " << *BTS << "." << endl;2628 Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl; 2291 2629 2292 2630 BLS[0] = (i==2 ? OldLines[3] : OldLines[2]); … … 2296 2634 BTS->GetNormalVector(BaseLineNormal); 2297 2635 AddTesselationTriangle(OldTriangleNrs[1]); 2298 Log() << Verbose( 3) << "INFO: Created new triangle " << *BTS << "." << endl;2636 Log() << Verbose(0) << "INFO: Created new triangle " << *BTS << "." << endl; 2299 2637 } else { 2300 Log() << Verbose(1) << "The four old lines do not connect, something's utterly wrong here!" << endl;2638 eLog() << Verbose(0) << "The four old lines do not connect, something's utterly wrong here!" << endl; 2301 2639 return NULL; 2302 2640 } 2303 2641 2304 Log() << Verbose(1) << "End of FlipBaseline" << endl;2305 2642 return NewLine; 2306 2643 }; … … 2317 2654 void Tesselation::FindSecondPointForTesselation(TesselPoint* a, Vector Oben, TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC) 2318 2655 { 2319 Log() << Verbose(2) << "Begin of FindSecondPointForTesselation" << endl;2656 Info FunctionInfo(__func__); 2320 2657 Vector AngleCheck; 2321 2658 class TesselPoint* Candidate = NULL; … … 2338 2675 Nupper[i] = ((N[i]+1) < LC->N[i]) ? N[i]+1 : LC->N[i]-1; 2339 2676 } 2340 Log() << Verbose( 3) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :"2677 Log() << Verbose(0) << "LC Intervals from [" << N[0] << "<->" << LC->N[0] << ", " << N[1] << "<->" << LC->N[1] << ", " << N[2] << "<->" << LC->N[2] << "] :" 2341 2678 << " [" << Nlower[0] << "," << Nupper[0] << "], " << " [" << Nlower[1] << "," << Nupper[1] << "], " << " [" << Nlower[2] << "," << Nupper[2] << "], " << endl; 2342 2679 … … 2345 2682 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 2346 2683 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;2684 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 2348 2685 if (List != NULL) { 2349 2686 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 2376 2713 angle = AngleCheck.Angle(&Oben); 2377 2714 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";2715 //Log() << Verbose(1) << "Old values of Storage: %lf %lf \n", Storage[0], Storage[1]); 2716 Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Is a better candidate with distance " << norm << " and angle " << angle << " to oben " << Oben << ".\n"; 2380 2717 OptCandidate = Candidate; 2381 2718 Storage[0] = angle; 2382 //Log() << Verbose( 3) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]);2719 //Log() << Verbose(1) << "Changing something in Storage: %lf %lf. \n", Storage[0], Storage[2]); 2383 2720 } else { 2384 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl;2721 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Looses with angle " << angle << " to a better candidate " << *OptCandidate << endl; 2385 2722 } 2386 2723 } else { 2387 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl;2724 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Refused due to Radius " << norm << endl; 2388 2725 } 2389 2726 } else { 2390 //Log() << Verbose( 3) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl;2727 //Log() << Verbose(1) << "Current candidate is " << *Candidate << ": Candidate is equal to first endpoint." << *a << "." << endl; 2391 2728 } 2392 2729 } 2393 2730 } else { 2394 Log() << Verbose( 3) << "Linked cell list is empty." << endl;2731 Log() << Verbose(0) << "Linked cell list is empty." << endl; 2395 2732 } 2396 2733 } 2397 Log() << Verbose(2) << "End of FindSecondPointForTesselation" << endl;2398 2734 }; 2399 2735 … … 2424 2760 * @param SearchDirection general direction where to search for the next point, relative to center of BaseLine 2425 2761 * @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 line2762 * @param CandidateLine CandidateForTesselation with the current base line and list of candidates and ShortestAngle 2427 2763 * @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 2764 * @param RADIUS radius of sphere 2431 2765 * @param *LC LinkedCell structure with neighbouring points 2432 2766 */ 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 { 2767 void Tesselation::FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint * const ThirdNode, const double RADIUS, const LinkedCell *LC) const 2768 { 2769 Info FunctionInfo(__func__); 2435 2770 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 2436 2771 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in … … 2440 2775 Vector NewNormalVector; // normal vector of the Candidate's triangle 2441 2776 Vector helper, OptCandidateCenter, OtherOptCandidateCenter; 2777 Vector RelativeOldSphereCenter; 2778 Vector NewPlaneCenter; 2442 2779 double CircleRadius; // radius of this circle 2443 2780 double radius; 2781 double otherradius; 2444 2782 double alpha, Otheralpha; // angles (i.e. parameter for the circle). 2783 bool IsDegenerated; 2445 2784 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; 2446 2785 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; 2786 TesselPoint *CandidateTriangle[3]; 2787 2788 Log() << Verbose(1) << "INFO: NormalVector of BaseTriangle is " << NormalVector << "." << endl; 2452 2789 2453 2790 // construct center of circle 2454 CircleCenter.CopyVector( BaseLine->endpoints[0]->node->node);2455 CircleCenter.AddVector( BaseLine->endpoints[1]->node->node);2791 CircleCenter.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2792 CircleCenter.AddVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2456 2793 CircleCenter.Scale(0.5); 2457 2794 2458 2795 // construct normal vector of circle 2459 CirclePlaneNormal.CopyVector(BaseLine->endpoints[0]->node->node); 2460 CirclePlaneNormal.SubtractVector(BaseLine->endpoints[1]->node->node); 2796 CirclePlaneNormal.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2797 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2798 2799 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 2800 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 2801 2802 CandidateTriangle[0] = CandidateLine.BaseLine->endpoints[0]->node; 2803 CandidateTriangle[1] = CandidateLine.BaseLine->endpoints[1]->node; 2461 2804 2462 2805 // calculate squared radius TesselPoint *ThirdNode,f circle 2463 radius = CirclePlaneNormal. ScalarProduct(&CirclePlaneNormal);2464 if (radius /4.< RADIUS*RADIUS) {2465 CircleRadius = RADIUS*RADIUS - radius /4.;2806 radius = CirclePlaneNormal.NormSquared()/4.; 2807 if (radius < RADIUS*RADIUS) { 2808 CircleRadius = RADIUS*RADIUS - radius; 2466 2809 CirclePlaneNormal.Normalize(); 2467 //Log() << Verbose(2) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;2810 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2468 2811 2469 2812 // 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);2813 if (fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { 2814 eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl; 2815 RelativeOldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal); 2816 } 2817 radius = RelativeOldSphereCenter.NormSquared(); 2475 2818 if (fabs(radius - CircleRadius) < HULLEPSILON) { 2476 //Log() << Verbose(2) << "INFO: OldSphereCenter is at " <<OldSphereCenter << "." << endl;2819 Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl; 2477 2820 2478 2821 // check SearchDirection 2479 //Log() << Verbose(2) << "INFO: SearchDirection is " << SearchDirection << "." << endl;2480 if (fabs( OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way!2822 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2823 if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way! 2481 2824 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl; 2482 2825 } … … 2486 2829 for(int i=0;i<NDIM;i++) // store indices of this cell 2487 2830 N[i] = LC->n[i]; 2488 //Log() << Verbose( 2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;2831 //Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 2489 2832 } else { 2490 2833 eLog() << Verbose(1) << "Vector " << CircleCenter << " is outside of LinkedCell's bounding box." << endl; … … 2492 2835 } 2493 2836 // then go through the current and all neighbouring cells and check the contained points for possible candidates 2494 //Log() << Verbose( 2) << "LC Intervals:";2837 //Log() << Verbose(1) << "LC Intervals:"; 2495 2838 for (int i=0;i<NDIM;i++) { 2496 2839 Nlower[i] = ((N[i]-1) >= 0) ? N[i]-1 : 0; … … 2503 2846 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 2504 2847 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;2848 //Log() << Verbose(1) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl; 2506 2849 if (List != NULL) { 2507 2850 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 2509 2852 2510 2853 // 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)2854 Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl; 2855 if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node) ){ 2856 2857 // find center on the plane 2858 GetCenterofCircumcircle(&NewPlaneCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node); 2859 Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl; 2860 2861 if ((NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node)) 2862 && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON) 2520 2863 ) { 2521 helper.CopyVector(&NewNormalVector); 2522 //Log() << Verbose(2) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2523 radius = BaseLine->endpoints[0]->node->node->DistanceSquared(&NewSphereCenter); 2864 Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2865 radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewPlaneCenter); 2866 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2867 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2868 Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl; 2524 2869 if (radius < RADIUS*RADIUS) { 2870 otherradius = CandidateLine.BaseLine->endpoints[1]->node->node->DistanceSquared(&NewPlaneCenter); 2871 if (fabs(radius - otherradius) > HULLEPSILON) { 2872 eLog() << Verbose(1) << "Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius-otherradius) << endl; 2873 } 2874 // construct both new centers 2875 NewSphereCenter.CopyVector(&NewPlaneCenter); 2876 OtherNewSphereCenter.CopyVector(&NewPlaneCenter); 2877 helper.CopyVector(&NewNormalVector); 2525 2878 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2526 //Log() << Verbose(2) << "INFO: Distance of NewCircleCenter to NewSphereCenter is " << helper.Norm()<< " with sphere radius " << RADIUS << "." << endl;2879 Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl; 2527 2880 NewSphereCenter.AddVector(&helper); 2528 NewSphereCenter.SubtractVector(&CircleCenter); 2529 //Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2530 2881 Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2531 2882 // OtherNewSphereCenter is created by the same vector just in the other direction 2532 2883 helper.Scale(-1.); 2533 2884 OtherNewSphereCenter.AddVector(&helper); 2534 OtherNewSphereCenter.SubtractVector(&CircleCenter); 2535 //Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 2885 Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 2536 2886 2537 2887 alpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, NewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2538 2888 Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2539 2889 alpha = min(alpha, Otheralpha); 2540 // if there is a better candidate, drop the current list and add the new candidate 2541 // otherwise ignore the new candidate and keep the list 2542 if (*ShortestAngle > (alpha - HULLEPSILON)) { 2543 optCandidate = new CandidateForTesselation(Candidate, BaseLine, OptCandidateCenter, OtherOptCandidateCenter); 2544 if (fabs(alpha - Otheralpha) > MYEPSILON) { 2545 optCandidate->OptCenter.CopyVector(&NewSphereCenter); 2546 optCandidate->OtherOptCenter.CopyVector(&OtherNewSphereCenter); 2890 2891 CandidateTriangle[2] = Candidate; 2892 // the idea of the IsDegenerated flag is not to put a penalty on degenerated triangles, but to push them to the 2893 // very end of the Tesselation::OpenLines list. 2894 IsDegenerated = (CheckPresenceOfTriangle(CandidateTriangle) >= 3); 2895 if (!IsDegenerated && CandidateLine.IsDegenerated) { // if current is not, but old one was, comparison would be unfair 2896 // if there is a better candidate, drop the current list and add the new candidate 2897 // otherwise ignore the new candidate and keep the list 2898 if (CandidateLine.ShortestAngle-2.*M_PI > (alpha - HULLEPSILON)) { 2899 if (fabs(alpha - Otheralpha) > MYEPSILON) { 2900 CandidateLine.OptCenter.CopyVector(&NewSphereCenter); 2901 CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter); 2902 } else { 2903 CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter); 2904 CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter); 2905 } 2906 // if there is an equal candidate, add it to the list without clearing the list 2907 if ((CandidateLine.ShortestAngle-2.*M_PI - HULLEPSILON) < alpha) { 2908 CandidateLine.pointlist.push_back(Candidate); 2909 Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with " 2910 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2911 } else { 2912 // remove all candidates from the list and then the list itself 2913 CandidateLine.pointlist.clear(); 2914 CandidateLine.pointlist.push_back(Candidate); 2915 Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with " 2916 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2917 } 2918 CandidateLine.ShortestAngle = alpha; 2919 CandidateLine.IsDegenerated = IsDegenerated; 2920 if (IsDegenerated) 2921 CandidateLine.ShortestAngle += 2.*M_PI; 2922 Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl; 2547 2923 } else { 2548 optCandidate->OptCenter.CopyVector(&OtherNewSphereCenter); 2549 optCandidate->OtherOptCenter.CopyVector(&NewSphereCenter); 2924 if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) { 2925 Log() << Verbose(1) << "REJECT: Old candidate " << *(Candidate) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl; 2926 } else { 2927 Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl; 2928 } 2550 2929 } 2551 // 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; 2930 } else { 2931 // if there is a better candidate, drop the current list and add the new candidate 2932 // otherwise ignore the new candidate and keep the list 2933 if (CandidateLine.ShortestAngle > (alpha - HULLEPSILON)) { 2934 if (fabs(alpha - Otheralpha) > MYEPSILON) { 2935 CandidateLine.OptCenter.CopyVector(&NewSphereCenter); 2936 CandidateLine.OtherOptCenter.CopyVector(&OtherNewSphereCenter); 2937 } else { 2938 CandidateLine.OptCenter.CopyVector(&OtherNewSphereCenter); 2939 CandidateLine.OtherOptCenter.CopyVector(&NewSphereCenter); 2940 } 2941 // if there is an equal candidate, add it to the list without clearing the list 2942 if ((CandidateLine.ShortestAngle - HULLEPSILON) < alpha) { 2943 CandidateLine.pointlist.push_back(Candidate); 2944 Log() << Verbose(0) << "ACCEPT: We have found an equally good candidate: " << *(Candidate) << " with " 2945 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2946 } else { 2947 // remove all candidates from the list and then the list itself 2948 CandidateLine.pointlist.clear(); 2949 CandidateLine.pointlist.push_back(Candidate); 2950 Log() << Verbose(0) << "ACCEPT: We have found a better candidate: " << *(Candidate) << " with " 2951 << alpha << " and circumsphere's center at " << CandidateLine.OptCenter << "." << endl; 2952 } 2953 CandidateLine.ShortestAngle = alpha; 2954 Log() << Verbose(0) << "INFO: There are " << CandidateLine.pointlist.size() << " candidates in the list now." << endl; 2556 2955 } else { 2557 // 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); 2956 if ((Candidate != NULL) && (CandidateLine.pointlist.begin() != CandidateLine.pointlist.end())) { 2957 Log() << Verbose(1) << "REJECT: Old candidate " << *(Candidate) << " with " << CandidateLine.ShortestAngle << " is better than new one " << *Candidate << " with " << alpha << " ." << endl; 2958 } else { 2959 Log() << Verbose(1) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl; 2562 2960 } 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;2567 }2568 *ShortestAngle = alpha;2569 //Log() << Verbose(2) << "INFO: There are " << candidates->size() << " candidates in the list now." << endl;2570 } 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;2573 } else {2574 //Log() << Verbose(2) << "REJECT: Candidate " << *Candidate << " with " << alpha << " was rejected." << endl;2575 2961 } 2576 2962 } 2577 2963 2578 2964 } else { 2579 //Log() << Verbose(2) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl;2965 Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl; 2580 2966 } 2581 2967 } else { 2582 //Log() << Verbose(2) << "REJECT: Three points from " << *BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl;2968 Log() << Verbose(1) << "REJECT: Three points from " << *CandidateLine.BaseLine << " and Candidate " << *Candidate << " are linear-dependent." << endl; 2583 2969 } 2584 2970 } else { 2585 2971 if (ThirdNode != NULL) { 2586 //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl;2972 Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " and " << *ThirdNode << " contains Candidate " << *Candidate << "." << endl; 2587 2973 } else { 2588 //Log() << Verbose(2) << "REJECT: Base triangle " << *BaseLine << " contains Candidate " << *Candidate << "." << endl;2974 Log() << Verbose(1) << "REJECT: Base triangle " << *CandidateLine.BaseLine << " contains Candidate " << *Candidate << "." << endl; 2589 2975 } 2590 2976 } … … 2597 2983 } else { 2598 2984 if (ThirdNode != NULL) 2599 Log() << Verbose( 2) << "Circumcircle for base line " << *BaseLine << " and third node " << *ThirdNode << " is too big!" << endl;2985 Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " and third node " << *ThirdNode << " is too big!" << endl; 2600 2986 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; 2987 Log() << Verbose(1) << "Circumcircle for base line " << *CandidateLine.BaseLine << " is too big!" << endl; 2988 } 2989 2990 Log() << Verbose(1) << "INFO: Sorting candidate list ..." << endl; 2991 if (CandidateLine.pointlist.size() > 1) { 2992 CandidateLine.pointlist.unique(); 2993 CandidateLine.pointlist.sort(); //SortCandidates); 2994 } 2611 2995 }; 2612 2996 … … 2618 3002 class BoundaryPointSet *Tesselation::GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const 2619 3003 { 3004 Info FunctionInfo(__func__); 2620 3005 const BoundaryLineSet * lines[2] = { line1, line2 }; 2621 3006 class BoundaryPointSet *node = NULL; … … 2631 3016 { // if insertion fails, we have common endpoint 2632 3017 node = OrderTest.first->second; 2633 Log() << Verbose( 5) << "Common endpoint of lines " << *line13018 Log() << Verbose(1) << "Common endpoint of lines " << *line1 2634 3019 << " and " << *line2 << " is: " << *node << "." << endl; 2635 3020 j = 2; … … 2648 3033 list<BoundaryTriangleSet*> * Tesselation::FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const 2649 3034 { 3035 Info FunctionInfo(__func__); 2650 3036 TesselPoint *trianglePoints[3]; 2651 3037 TesselPoint *SecondPoint = NULL; … … 2653 3039 2654 3040 if (LinesOnBoundary.empty()) { 2655 Log() << Verbose(0) << "Error: There is no tesselation structure to compare the point with, please create one first.";3041 eLog() << Verbose(1) << "Error: There is no tesselation structure to compare the point with, please create one first."; 2656 3042 return NULL; 2657 3043 } … … 2661 3047 // check whether closest point is "too close" :), then it's inside 2662 3048 if (trianglePoints[0] == NULL) { 2663 Log() << Verbose( 2) << "Is the only point, no one else is closeby." << endl;3049 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 2664 3050 return NULL; 2665 3051 } 2666 3052 if (trianglePoints[0]->node->DistanceSquared(x) < MYEPSILON) { 2667 Log() << Verbose( 3) << "Point is right on a tesselation point, no nearest triangle." << endl;3053 Log() << Verbose(1) << "Point is right on a tesselation point, no nearest triangle." << endl; 2668 3054 PointMap::const_iterator PointRunner = PointsOnBoundary.find(trianglePoints[0]->nr); 2669 3055 triangles = new list<BoundaryTriangleSet*>; … … 2689 3075 } 2690 3076 } else { 2691 list<TesselPoint*> *connectedClosestPoints = GetCircleOfConnectedPoints(trianglePoints[0], x); 3077 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(trianglePoints[0]); 3078 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(connectedPoints, trianglePoints[0], x); 3079 delete(connectedPoints); 2692 3080 if (connectedClosestPoints != NULL) { 2693 3081 trianglePoints[1] = connectedClosestPoints->front(); … … 2697 3085 eLog() << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl; 2698 3086 } 2699 //Log() << Verbose( 2) << "List of triangle points:" << endl;2700 //Log() << Verbose( 3) << *trianglePoints[i] << endl;3087 //Log() << Verbose(1) << "List of triangle points:" << endl; 3088 //Log() << Verbose(2) << *trianglePoints[i] << endl; 2701 3089 } 2702 3090 2703 3091 triangles = FindTriangles(trianglePoints); 2704 Log() << Verbose( 2) << "List of possible triangles:" << endl;3092 Log() << Verbose(1) << "List of possible triangles:" << endl; 2705 3093 for(list<BoundaryTriangleSet*>::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 2706 Log() << Verbose( 3) << **Runner << endl;3094 Log() << Verbose(2) << **Runner << endl; 2707 3095 2708 3096 delete(connectedClosestPoints); 2709 3097 } else { 2710 3098 triangles = NULL; 2711 Log() << Verbose(1) << "There is no circle of connected points!" << endl;3099 eLog() << Verbose(2) << "There is no circle of connected points!" << endl; 2712 3100 } 2713 3101 } … … 2729 3117 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const 2730 3118 { 3119 Info FunctionInfo(__func__); 2731 3120 class BoundaryTriangleSet *result = NULL; 2732 3121 list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC); … … 2738 3127 if (triangles->size() == 1) { // there is no degenerate case 2739 3128 result = triangles->front(); 2740 Log() << Verbose( 2) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl;3129 Log() << Verbose(1) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl; 2741 3130 } else { 2742 3131 result = triangles->front(); 2743 3132 result->GetCenter(&Center); 2744 3133 Center.SubtractVector(x); 2745 Log() << Verbose( 2) << "Normal Vector of this front side is " << result->NormalVector << "." << endl;3134 Log() << Verbose(1) << "Normal Vector of this front side is " << result->NormalVector << "." << endl; 2746 3135 if (Center.ScalarProduct(&result->NormalVector) < 0) { 2747 3136 result = triangles->back(); 2748 Log() << Verbose( 2) << "Normal Vector of this back side is " << result->NormalVector << "." << endl;3137 Log() << Verbose(1) << "Normal Vector of this back side is " << result->NormalVector << "." << endl; 2749 3138 if (Center.ScalarProduct(&result->NormalVector) < 0) { 2750 3139 eLog() << Verbose(1) << "Front and back side yield NormalVector in wrong direction!" << endl; … … 2765 3154 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const 2766 3155 { 3156 Info FunctionInfo(__func__); 2767 3157 class BoundaryTriangleSet *result = FindClosestTriangleToPoint(&Point, LC); 2768 3158 Vector Center; … … 2774 3164 2775 3165 result->GetCenter(&Center); 2776 Log() << Verbose( 3) << "INFO: Central point of the triangle is " << Center << "." << endl;3166 Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl; 2777 3167 Center.SubtractVector(&Point); 2778 Log() << Verbose( 3) << "INFO: Vector from center to point to test is " << Center << "." << endl;3168 Log() << Verbose(2) << "INFO: Vector from center to point to test is " << Center << "." << endl; 2779 3169 if (Center.ScalarProduct(&result->NormalVector) > -MYEPSILON) { 2780 3170 Log() << Verbose(1) << Point << " is an inner point." << endl; … … 2795 3185 bool Tesselation::IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const 2796 3186 { 3187 Info FunctionInfo(__func__); 2797 3188 return IsInnerPoint(*(Point->node), LC); 2798 3189 } … … 2806 3197 set<TesselPoint*> * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const 2807 3198 { 3199 Info FunctionInfo(__func__); 2808 3200 set<TesselPoint*> *connectedPoints = new set<TesselPoint*>; 2809 3201 class BoundaryPointSet *ReferencePoint = NULL; 2810 3202 TesselPoint* current; 2811 3203 bool takePoint = false; 2812 2813 Log() << Verbose(3) << "Begin of GetAllConnectedPoints" << endl;2814 3204 2815 3205 // find the respective boundary point … … 2818 3208 ReferencePoint = PointRunner->second; 2819 3209 } else { 2820 Log() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl;3210 eLog() << Verbose(2) << "GetAllConnectedPoints() could not find the BoundaryPoint belonging to " << *Point << "." << endl; 2821 3211 ReferencePoint = NULL; 2822 3212 } … … 2842 3232 2843 3233 if (takePoint) { 2844 Log() << Verbose( 5) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl;3234 Log() << Verbose(1) << "INFO: Endpoint " << *current << " of line " << *(findLines->second) << " is enlisted." << endl; 2845 3235 connectedPoints->insert(current); 2846 3236 } … … 2854 3244 } 2855 3245 2856 Log() << Verbose(3) << "End of GetAllConnectedPoints" << endl;2857 3246 return connectedPoints; 2858 3247 }; … … 2866 3255 * 2867 3256 * @param *out output stream for debugging 3257 * @param *SetOfNeighbours all points for which the angle should be calculated 2868 3258 * @param *Point of which get all connected points 2869 3259 * @param *Reference Reference vector for zero angle or NULL for no preference 2870 3260 * @return list of the all points linked to the provided one 2871 3261 */ 2872 list<TesselPoint*> * Tesselation::GetCircleOfConnectedPoints(const TesselPoint* const Point, const Vector * const Reference) const 2873 { 3262 list<TesselPoint*> * Tesselation::GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3263 { 3264 Info FunctionInfo(__func__); 2874 3265 map<double, TesselPoint*> anglesOfPoints; 2875 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(Point);2876 3266 list<TesselPoint*> *connectedCircle = new list<TesselPoint*>; 2877 3267 Vector center; … … 2881 3271 Vector helper; 2882 3272 2883 if ( connectedPoints == NULL) {2884 Log() << Verbose(2) << "Could not find any connected points!" << endl;3273 if (SetOfNeighbours == NULL) { 3274 eLog() << Verbose(2) << "Could not find any connected points!" << endl; 2885 3275 delete(connectedCircle); 2886 3276 return NULL; 2887 3277 } 2888 Log() << Verbose(2) << "Begin of GetCircleOfConnectedPoints" << endl;2889 3278 2890 3279 // calculate central point 2891 for (set<TesselPoint*>::const_iterator TesselRunner = connectedPoints->begin(); TesselRunner != connectedPoints->end(); TesselRunner++)3280 for (set<TesselPoint*>::const_iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++) 2892 3281 center.AddVector((*TesselRunner)->node); 2893 3282 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size() 2894 3283 // << "; 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;3284 center.Scale(1.0/SetOfNeighbours->size()); 3285 Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl; 2897 3286 2898 3287 // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points … … 2900 3289 PlaneNormal.SubtractVector(¢er); 2901 3290 PlaneNormal.Normalize(); 2902 Log() << Verbose( 4) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;3291 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl; 2903 3292 2904 3293 // construct one orthogonal vector … … 2909 3298 } 2910 3299 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);3300 Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl; 3301 AngleZero.CopyVector((*SetOfNeighbours->begin())->node); 2913 3302 AngleZero.SubtractVector(Point->node); 2914 3303 AngleZero.ProjectOntoPlane(&PlaneNormal); … … 2918 3307 } 2919 3308 } 2920 Log() << Verbose( 4) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl;3309 Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl; 2921 3310 if (AngleZero.NormSquared() > MYEPSILON) 2922 3311 OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero); 2923 3312 else 2924 3313 OrthogonalVector.MakeNormalVector(&PlaneNormal); 2925 Log() << Verbose( 4) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl;3314 Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl; 2926 3315 2927 3316 // go through all connected points and calculate angle 2928 for (set<TesselPoint*>::iterator listRunner = connectedPoints->begin(); listRunner != connectedPoints->end(); listRunner++) {3317 for (set<TesselPoint*>::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 2929 3318 helper.CopyVector((*listRunner)->node); 2930 3319 helper.SubtractVector(Point->node); 2931 3320 helper.ProjectOntoPlane(&PlaneNormal); 2932 3321 double angle = GetAngle(helper, AngleZero, OrthogonalVector); 2933 Log() << Verbose( 3) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl;3322 Log() << Verbose(0) << "INFO: Calculated angle is " << angle << " for point " << **listRunner << "." << endl; 2934 3323 anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 2935 3324 } … … 2938 3327 connectedCircle->push_back(AngleRunner->second); 2939 3328 } 2940 2941 delete(connectedPoints);2942 2943 Log() << Verbose(2) << "End of GetCircleOfConnectedPoints" << endl;2944 3329 2945 3330 return connectedCircle; … … 2954 3339 list<list<TesselPoint*> *> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const 2955 3340 { 3341 Info FunctionInfo(__func__); 2956 3342 map<double, TesselPoint*> anglesOfPoints; 2957 3343 list<list<TesselPoint*> *> *ListOfPaths = new list<list<TesselPoint*> *>; … … 2998 3384 StartLine = CurrentLine; 2999 3385 CurrentPoint = CurrentLine->GetOtherEndpoint(ReferencePoint); 3000 Log() << Verbose( 3)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl;3386 Log() << Verbose(1)<< "INFO: Beginning path retrieval at " << *CurrentPoint << " of line " << *CurrentLine << "." << endl; 3001 3387 do { 3002 3388 // push current one 3003 Log() << Verbose( 3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;3389 Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl; 3004 3390 connectedPath->push_back(CurrentPoint->node); 3005 3391 3006 3392 // find next triangle 3007 3393 for (TriangleMap::iterator Runner = CurrentLine->triangles.begin(); Runner != CurrentLine->triangles.end(); Runner++) { 3008 Log() << Verbose( 3) << "INFO: Inspecting triangle " << *Runner->second << "." << endl;3394 Log() << Verbose(1) << "INFO: Inspecting triangle " << *Runner->second << "." << endl; 3009 3395 if ((Runner->second != triangle)) { // look for first triangle not equal to old one 3010 3396 triangle = Runner->second; … … 3013 3399 if (!TriangleRunner->second) { 3014 3400 TriangleRunner->second = true; 3015 Log() << Verbose( 3) << "INFO: Connecting triangle is " << *triangle << "." << endl;3401 Log() << Verbose(1) << "INFO: Connecting triangle is " << *triangle << "." << endl; 3016 3402 break; 3017 3403 } else { 3018 Log() << Verbose( 3) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl;3404 Log() << Verbose(1) << "INFO: Skipping " << *triangle << ", as we have already visited it." << endl; 3019 3405 triangle = NULL; 3020 3406 } … … 3031 3417 if ((triangle->lines[i] != CurrentLine) && (triangle->lines[i]->ContainsBoundaryPoint(ReferencePoint))) { // not the current line and still containing Point 3032 3418 CurrentLine = triangle->lines[i]; 3033 Log() << Verbose( 3) << "INFO: Connecting line is " << *CurrentLine << "." << endl;3419 Log() << Verbose(1) << "INFO: Connecting line is " << *CurrentLine << "." << endl; 3034 3420 break; 3035 3421 } … … 3045 3431 } while (CurrentLine != StartLine); 3046 3432 // last point is missing, as it's on start line 3047 Log() << Verbose( 3) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl;3433 Log() << Verbose(1) << "INFO: Putting " << *CurrentPoint << " at end of path." << endl; 3048 3434 if (StartLine->GetOtherEndpoint(ReferencePoint)->node != connectedPath->back()) 3049 3435 connectedPath->push_back(StartLine->GetOtherEndpoint(ReferencePoint)->node); … … 3051 3437 ListOfPaths->push_back(connectedPath); 3052 3438 } else { 3053 Log() << Verbose( 3) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl;3439 Log() << Verbose(1) << "INFO: Skipping " << *runner->second << ", as we have already visited it." << endl; 3054 3440 } 3055 3441 } … … 3069 3455 list<list<TesselPoint*> *> * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const 3070 3456 { 3457 Info FunctionInfo(__func__); 3071 3458 list<list<TesselPoint*> *> *ListofPaths = GetPathsOfConnectedPoints(Point); 3072 3459 list<list<TesselPoint*> *> *ListofClosedPaths = new list<list<TesselPoint*> *>; … … 3082 3469 connectedPath = *ListRunner; 3083 3470 3084 Log() << Verbose( 2) << "INFO: Current path is " << connectedPath << "." << endl;3471 Log() << Verbose(1) << "INFO: Current path is " << connectedPath << "." << endl; 3085 3472 3086 3473 // go through list, look for reappearance of starting Point and count … … 3092 3479 if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point 3093 3480 // we have a closed circle from Marker to new Marker 3094 Log() << Verbose( 3) << count+1 << ". closed path consists of: ";3481 Log() << Verbose(1) << count+1 << ". closed path consists of: "; 3095 3482 newPath = new list<TesselPoint*>; 3096 3483 list<TesselPoint*>::iterator CircleSprinter = Marker; … … 3108 3495 } 3109 3496 } 3110 Log() << Verbose( 3) << "INFO: " << count << " closed additional path(s) have been created." << endl;3497 Log() << Verbose(1) << "INFO: " << count << " closed additional path(s) have been created." << endl; 3111 3498 3112 3499 // delete list of paths … … 3130 3517 set<BoundaryTriangleSet*> *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const 3131 3518 { 3519 Info FunctionInfo(__func__); 3132 3520 set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>; 3133 3521 … … 3168 3556 return 0.; 3169 3557 } else 3170 Log() << Verbose( 2) << "Removing point " << *point << " from tesselated boundary ..." << endl;3558 Log() << Verbose(0) << "Removing point " << *point << " from tesselated boundary ..." << endl; 3171 3559 3172 3560 // copy old location for the volume … … 3198 3586 NormalVector.Zero(); 3199 3587 for (map<class BoundaryTriangleSet *, int>::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) { 3200 Log() << Verbose( 3) << "INFO: Removing triangle " << *(Runner->first) << "." << endl;3588 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->first) << "." << endl; 3201 3589 NormalVector.SubtractVector(&Runner->first->NormalVector); // has to point inward 3202 3590 RemoveTesselationTriangle(Runner->first); … … 3228 3616 smallestangle = 0.; 3229 3617 for (MiddleNode = connectedPath->begin(); MiddleNode != connectedPath->end(); MiddleNode++) { 3230 Log() << Verbose( 3) << "INFO: MiddleNode is " << **MiddleNode << "." << endl;3618 Log() << Verbose(1) << "INFO: MiddleNode is " << **MiddleNode << "." << endl; 3231 3619 // construct vectors to next and previous neighbour 3232 3620 StartNode = MiddleNode; … … 3256 3644 MiddleNode = EndNode; 3257 3645 if (MiddleNode == connectedPath->end()) { 3258 Log() << Verbose(1) << "CRITICAL: Could not find a smallest angle!" << endl;3259 exit(255);3646 eLog() << Verbose(0) << "CRITICAL: Could not find a smallest angle!" << endl; 3647 performCriticalExit(); 3260 3648 } 3261 3649 StartNode = MiddleNode; … … 3266 3654 if (EndNode == connectedPath->end()) 3267 3655 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;3656 Log() << Verbose(2) << "INFO: StartNode is " << **StartNode << "." << endl; 3657 Log() << Verbose(2) << "INFO: MiddleNode is " << **MiddleNode << "." << endl; 3658 Log() << Verbose(2) << "INFO: EndNode is " << **EndNode << "." << endl; 3659 Log() << Verbose(1) << "INFO: Attempting to create triangle " << (*StartNode)->Name << ", " << (*MiddleNode)->Name << " and " << (*EndNode)->Name << "." << endl; 3272 3660 TriangleCandidates[0] = *StartNode; 3273 3661 TriangleCandidates[1] = *MiddleNode; … … 3275 3663 triangle = GetPresentTriangle(TriangleCandidates); 3276 3664 if (triangle != NULL) { 3277 eLog() << Verbose( 2) << "New triangle already present, skipping!" << endl;3665 eLog() << Verbose(0) << "New triangle already present, skipping!" << endl; 3278 3666 StartNode++; 3279 3667 MiddleNode++; … … 3287 3675 continue; 3288 3676 } 3289 Log() << Verbose( 5) << "Adding new triangle points."<< endl;3677 Log() << Verbose(3) << "Adding new triangle points."<< endl; 3290 3678 AddTesselationPoint(*StartNode, 0); 3291 3679 AddTesselationPoint(*MiddleNode, 1); 3292 3680 AddTesselationPoint(*EndNode, 2); 3293 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;3681 Log() << Verbose(3) << "Adding new triangle lines."<< endl; 3294 3682 AddTesselationLine(TPS[0], TPS[1], 0); 3295 3683 AddTesselationLine(TPS[0], TPS[2], 1); … … 3306 3694 // prepare nodes for next triangle 3307 3695 StartNode = EndNode; 3308 Log() << Verbose( 4) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl;3696 Log() << Verbose(2) << "Removing " << **MiddleNode << " from closed path, remaining points: " << connectedPath->size() << "." << endl; 3309 3697 connectedPath->remove(*MiddleNode); // remove the middle node (it is surrounded by triangles) 3310 3698 if (connectedPath->size() == 2) { // we are done … … 3313 3701 break; 3314 3702 } else if (connectedPath->size() < 2) { // something's gone wrong! 3315 Log() << Verbose(1) << "CRITICAL: There are only two endpoints left!" << endl;3316 exit(255);3703 eLog() << Verbose(0) << "CRITICAL: There are only two endpoints left!" << endl; 3704 performCriticalExit(); 3317 3705 } else { 3318 3706 MiddleNode = StartNode; … … 3342 3730 if (maxgain != 0) { 3343 3731 volume += maxgain; 3344 Log() << Verbose( 3) << "Flipping baseline with highest volume" << **Candidate << "." << endl;3732 Log() << Verbose(1) << "Flipping baseline with highest volume" << **Candidate << "." << endl; 3345 3733 OtherBase = FlipBaseline(*Candidate); 3346 3734 NewLines.erase(Candidate); … … 3353 3741 delete(connectedPath); 3354 3742 } 3355 Log() << Verbose( 1) << count << " triangles were created." << endl;3743 Log() << Verbose(0) << count << " triangles were created." << endl; 3356 3744 } else { 3357 3745 while (!ListOfClosedPaths->empty()) { … … 3361 3749 delete(connectedPath); 3362 3750 } 3363 Log() << Verbose( 1) << "No need to create any triangles." << endl;3751 Log() << Verbose(0) << "No need to create any triangles." << endl; 3364 3752 } 3365 3753 delete(ListOfClosedPaths); 3366 3754 3367 Log() << Verbose( 1) << "Removed volume is " << volume << "." << endl;3755 Log() << Verbose(0) << "Removed volume is " << volume << "." << endl; 3368 3756 3369 3757 return volume; … … 3382 3770 list<BoundaryTriangleSet*> *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const 3383 3771 { 3772 Info FunctionInfo(__func__); 3384 3773 list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>; 3385 3774 LineMap::const_iterator FindLine; … … 3422 3811 } 3423 3812 3813 struct BoundaryLineSetCompare { 3814 bool operator() (const BoundaryLineSet * const a, const BoundaryLineSet * const b) { 3815 int lowerNra = -1; 3816 int lowerNrb = -1; 3817 3818 if (a->endpoints[0] < a->endpoints[1]) 3819 lowerNra = 0; 3820 else 3821 lowerNra = 1; 3822 3823 if (b->endpoints[0] < b->endpoints[1]) 3824 lowerNrb = 0; 3825 else 3826 lowerNrb = 1; 3827 3828 if (a->endpoints[lowerNra] < b->endpoints[lowerNrb]) 3829 return true; 3830 else if (a->endpoints[lowerNra] > b->endpoints[lowerNrb]) 3831 return false; 3832 else { // both lower-numbered endpoints are the same ... 3833 if (a->endpoints[(lowerNra+1)%2] < b->endpoints[(lowerNrb+1)%2]) 3834 return true; 3835 else if (a->endpoints[(lowerNra+1)%2] > b->endpoints[(lowerNrb+1)%2]) 3836 return false; 3837 } 3838 return false; 3839 }; 3840 }; 3841 3842 #define UniqueLines set < class BoundaryLineSet *, BoundaryLineSetCompare> 3843 3424 3844 /** 3425 3845 * Finds all degenerated lines within the tesselation structure. … … 3430 3850 map<int, int> * Tesselation::FindAllDegeneratedLines() 3431 3851 { 3432 map<int, class BoundaryLineSet *> AllLines; 3852 Info FunctionInfo(__func__); 3853 UniqueLines AllLines; 3433 3854 map<int, int> * DegeneratedLines = new map<int, int>; 3434 3855 3435 3856 // sanity check 3436 3857 if (LinesOnBoundary.empty()) { 3437 Log() << Verbose(1) << "Warning:FindAllDegeneratedTriangles() was called without any tesselation structure.";3858 eLog() << Verbose(2) << "FindAllDegeneratedTriangles() was called without any tesselation structure."; 3438 3859 return DegeneratedLines; 3439 3860 } 3440 3861 3441 3862 LineMap::iterator LineRunner1; 3442 pair< LineMap::iterator, bool> tester;3863 pair< UniqueLines::iterator, bool> tester; 3443 3864 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) );3865 tester = AllLines.insert( LineRunner1->second ); 3866 if (!tester.second) { // found degenerated line 3867 DegeneratedLines->insert ( pair<int, int> (LineRunner1->second->Nr, (*tester.first)->Nr) ); 3868 DegeneratedLines->insert ( pair<int, int> ((*tester.first)->Nr, LineRunner1->second->Nr) ); 3448 3869 } 3449 3870 } … … 3451 3872 AllLines.clear(); 3452 3873 3453 Log() << Verbose( 1) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl;3874 Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl; 3454 3875 map<int,int>::iterator it; 3455 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) 3456 Log() << Verbose(2) << (*it).first << " => " << (*it).second << endl; 3876 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) { 3877 const LineMap::const_iterator Line1 = LinesOnBoundary.find((*it).first); 3878 const LineMap::const_iterator Line2 = LinesOnBoundary.find((*it).second); 3879 if (Line1 != LinesOnBoundary.end() && Line2 != LinesOnBoundary.end()) 3880 Log() << Verbose(0) << *Line1->second << " => " << *Line2->second << endl; 3881 else 3882 eLog() << Verbose(1) << "Either " << (*it).first << " or " << (*it).second << " are not in LinesOnBoundary!" << endl; 3883 } 3457 3884 3458 3885 return DegeneratedLines; … … 3467 3894 map<int, int> * Tesselation::FindAllDegeneratedTriangles() 3468 3895 { 3896 Info FunctionInfo(__func__); 3469 3897 map<int, int> * DegeneratedLines = FindAllDegeneratedLines(); 3470 3898 map<int, int> * DegeneratedTriangles = new map<int, int>; … … 3494 3922 delete(DegeneratedLines); 3495 3923 3496 Log() << Verbose( 1) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl;3924 Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl; 3497 3925 map<int,int>::iterator it; 3498 3926 for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++) 3499 Log() << Verbose( 2) << (*it).first << " => " << (*it).second << endl;3927 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; 3500 3928 3501 3929 return DegeneratedTriangles; … … 3508 3936 void Tesselation::RemoveDegeneratedTriangles() 3509 3937 { 3938 Info FunctionInfo(__func__); 3510 3939 map<int, int> * DegeneratedTriangles = FindAllDegeneratedTriangles(); 3511 3940 TriangleMap::iterator finder; 3512 3941 BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL; 3513 3942 int count = 0; 3514 3515 Log() << Verbose(1) << "Begin of RemoveDegeneratedTriangles" << endl;3516 3943 3517 3944 for (map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); … … 3572 3999 // erase the pair 3573 4000 count += (int) DegeneratedTriangles->erase(triangle->Nr); 3574 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl;4001 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *triangle << "." << endl; 3575 4002 RemoveTesselationTriangle(triangle); 3576 4003 count += (int) DegeneratedTriangles->erase(partnerTriangle->Nr); 3577 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl;4004 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removes triangle " << *partnerTriangle << "." << endl; 3578 4005 RemoveTesselationTriangle(partnerTriangle); 3579 4006 } else { 3580 Log() << Verbose( 1) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle4007 Log() << Verbose(0) << "RemoveDegeneratedTriangles() does not remove triangle " << *triangle 3581 4008 << " and its partner " << *partnerTriangle << " because it is essential for at" 3582 4009 << " least one of the endpoints to be kept in the tesselation structure." << endl; … … 3584 4011 } 3585 4012 delete(DegeneratedTriangles); 3586 3587 Log() << Verbose(1) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl; 3588 Log() << Verbose(1) << "End of RemoveDegeneratedTriangles" << endl; 4013 if (count > 0) 4014 LastTriangle = NULL; 4015 4016 Log() << Verbose(0) << "RemoveDegeneratedTriangles() removed " << count << " triangles:" << endl; 3589 4017 } 3590 4018 … … 3599 4027 void Tesselation::AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC) 3600 4028 { 3601 Log() << Verbose(2) << "Begin of AddBoundaryPointByDegeneratedTriangle" << endl; 3602 4029 Info FunctionInfo(__func__); 3603 4030 // find nearest boundary point 3604 4031 class TesselPoint *BackupPoint = NULL; … … 3616 4043 return; 3617 4044 } 3618 Log() << Verbose( 2) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl;4045 Log() << Verbose(0) << "Nearest point on boundary is " << NearestPoint->Name << "." << endl; 3619 4046 3620 4047 // go through its lines and find the best one to split … … 3649 4076 3650 4077 // 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;4078 Log() << Verbose(2) << "Adding new triangle points."<< endl; 3652 4079 AddTesselationPoint((BestLine->endpoints[0]->node), 0); 3653 4080 AddTesselationPoint((BestLine->endpoints[1]->node), 1); 3654 4081 AddTesselationPoint(point, 2); 3655 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4082 Log() << Verbose(2) << "Adding new triangle lines."<< endl; 3656 4083 AddTesselationLine(TPS[0], TPS[1], 0); 3657 4084 AddTesselationLine(TPS[0], TPS[2], 1); … … 3660 4087 BTS->GetNormalVector(TempTriangle->NormalVector); 3661 4088 BTS->NormalVector.Scale(-1.); 3662 Log() << Verbose( 3) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl;4089 Log() << Verbose(1) << "INFO: NormalVector of new triangle is " << BTS->NormalVector << "." << endl; 3663 4090 AddTesselationTriangle(); 3664 4091 3665 4092 // 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;4093 Log() << Verbose(2) << "Adding new triangle points."<< endl; 3667 4094 AddTesselationPoint((BestLine->endpoints[0]->node), 0); 3668 4095 AddTesselationPoint((BestLine->endpoints[1]->node), 1); 3669 4096 AddTesselationPoint(point, 2); 3670 Log() << Verbose( 5) << "Adding new triangle lines."<< endl;4097 Log() << Verbose(2) << "Adding new triangle lines."<< endl; 3671 4098 AddTesselationLine(TPS[0], TPS[1], 0); 3672 4099 AddTesselationLine(TPS[0], TPS[2], 1); … … 3674 4101 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 3675 4102 BTS->GetNormalVector(TempTriangle->NormalVector); 3676 Log() << Verbose( 3) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl;4103 Log() << Verbose(1) << "INFO: NormalVector of other new triangle is " << BTS->NormalVector << "." << endl; 3677 4104 AddTesselationTriangle(); 3678 4105 … … 3681 4108 if ((BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[0])) && (BTS->lines[i]->ContainsBoundaryPoint(BestLine->endpoints[1]))) { 3682 4109 if (BestLine == BTS->lines[i]){ 3683 Log() << Verbose(1) << "CRITICAL:BestLine is same as found line, something's wrong here!" << endl;3684 exit(255);4110 eLog() << Verbose(0) << "BestLine is same as found line, something's wrong here!" << endl; 4111 performCriticalExit(); 3685 4112 } 3686 4113 BTS->lines[i]->triangles.insert( pair<int, class BoundaryTriangleSet *> (TempTriangle->Nr, TempTriangle) ); … … 3689 4116 } 3690 4117 } 3691 3692 // exit3693 Log() << Verbose(2) << "End of AddBoundaryPointByDegeneratedTriangle" << endl;3694 4118 }; 3695 4119 … … 3701 4125 void Tesselation::Output(const char *filename, const PointCloud * const cloud) 3702 4126 { 4127 Info FunctionInfo(__func__); 3703 4128 ofstream *tempstream = NULL; 3704 4129 string NameofTempFile; … … 3713 4138 NameofTempFile.erase(npos, 1); 3714 4139 NameofTempFile.append(TecplotSuffix); 3715 Log() << Verbose( 1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";4140 Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n"; 3716 4141 tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc); 3717 4142 WriteTecplotFile(tempstream, this, cloud, TriangleFilesWritten); … … 3727 4152 NameofTempFile.erase(npos, 1); 3728 4153 NameofTempFile.append(Raster3DSuffix); 3729 Log() << Verbose( 1) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n";4154 Log() << Verbose(0) << "Writing temporary non convex hull to file " << NameofTempFile << ".\n"; 3730 4155 tempstream = new ofstream(NameofTempFile.c_str(), ios::trunc); 3731 4156 WriteRaster3dFile(tempstream, this, cloud); … … 3739 4164 TriangleFilesWritten++; 3740 4165 }; 4166 4167 struct BoundaryPolygonSetCompare { 4168 bool operator()(const BoundaryPolygonSet * s1, const BoundaryPolygonSet * s2) const { 4169 if (s1->endpoints.size() < s2->endpoints.size()) 4170 return true; 4171 else if (s1->endpoints.size() > s2->endpoints.size()) 4172 return false; 4173 else { // equality of number of endpoints 4174 PointSet::const_iterator Walker1 = s1->endpoints.begin(); 4175 PointSet::const_iterator Walker2 = s2->endpoints.begin(); 4176 while ((Walker1 != s1->endpoints.end()) || (Walker2 != s2->endpoints.end())) { 4177 if ((*Walker1)->Nr < (*Walker2)->Nr) 4178 return true; 4179 else if ((*Walker1)->Nr > (*Walker2)->Nr) 4180 return false; 4181 Walker1++; 4182 Walker2++; 4183 } 4184 return false; 4185 } 4186 } 4187 }; 4188 4189 #define UniquePolygonSet set < BoundaryPolygonSet *, BoundaryPolygonSetCompare> 4190 4191 /** Finds all degenerated polygons and calls ReTesselateDegeneratedPolygon()/ 4192 * \return number of polygons found 4193 */ 4194 int Tesselation::CorrectAllDegeneratedPolygons() 4195 { 4196 Info FunctionInfo(__func__); 4197 4198 /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector 4199 map <int, int> *DegeneratedTriangles = FindAllDegeneratedTriangles(); 4200 set < BoundaryPointSet *> EndpointCandidateList; 4201 pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester; 4202 pair < map < int, Vector *>::iterator, bool > TriangleInsertionTester; 4203 for (PointMap::const_iterator Runner = PointsOnBoundary.begin(); Runner != PointsOnBoundary.end(); Runner++) { 4204 Log() << Verbose(0) << "Current point is " << *Runner->second << "." << endl; 4205 map < int, Vector *> TriangleVectors; 4206 // gather all NormalVectors 4207 Log() << Verbose(1) << "Gathering triangles ..." << endl; 4208 for (LineMap::const_iterator LineRunner = (Runner->second)->lines.begin(); LineRunner != (Runner->second)->lines.end(); LineRunner++) 4209 for (TriangleMap::const_iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) { 4210 if (DegeneratedTriangles->find(TriangleRunner->second->Nr) == DegeneratedTriangles->end()) { 4211 TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) ); 4212 if (TriangleInsertionTester.second) 4213 Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl; 4214 } else { 4215 Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl; 4216 } 4217 } 4218 // check whether there are two that are parallel 4219 Log() << Verbose(1) << "Finding two parallel triangles ..." << endl; 4220 for (map < int, Vector *>::iterator VectorWalker = TriangleVectors.begin(); VectorWalker != TriangleVectors.end(); VectorWalker++) 4221 for (map < int, Vector *>::iterator VectorRunner = VectorWalker; VectorRunner != TriangleVectors.end(); VectorRunner++) 4222 if (VectorWalker != VectorRunner) { // skip equals 4223 const double SCP = VectorWalker->second->ScalarProduct(VectorRunner->second); // ScalarProduct should result in -1. for degenerated triangles 4224 Log() << Verbose(1) << "Checking " << *VectorWalker->second<< " against " << *VectorRunner->second << ": " << SCP << endl; 4225 if (fabs(SCP + 1.) < ParallelEpsilon) { 4226 InsertionTester = EndpointCandidateList.insert((Runner->second)); 4227 if (InsertionTester.second) 4228 Log() << Verbose(0) << " Adding " << *Runner->second << " to endpoint candidate list." << endl; 4229 // and break out of both loops 4230 VectorWalker = TriangleVectors.end(); 4231 VectorRunner = TriangleVectors.end(); 4232 break; 4233 } 4234 } 4235 } 4236 4237 /// 3. Find connected endpoint candidates and put them into a polygon 4238 UniquePolygonSet ListofDegeneratedPolygons; 4239 BoundaryPointSet *Walker = NULL; 4240 BoundaryPointSet *OtherWalker = NULL; 4241 BoundaryPolygonSet *Current = NULL; 4242 stack <BoundaryPointSet*> ToCheckConnecteds; 4243 while (!EndpointCandidateList.empty()) { 4244 Walker = *(EndpointCandidateList.begin()); 4245 if (Current == NULL) { // create a new polygon with current candidate 4246 Log() << Verbose(0) << "Starting new polygon set at point " << *Walker << endl; 4247 Current = new BoundaryPolygonSet; 4248 Current->endpoints.insert(Walker); 4249 EndpointCandidateList.erase(Walker); 4250 ToCheckConnecteds.push(Walker); 4251 } 4252 4253 // go through to-check stack 4254 while (!ToCheckConnecteds.empty()) { 4255 Walker = ToCheckConnecteds.top(); // fetch ... 4256 ToCheckConnecteds.pop(); // ... and remove 4257 for (LineMap::const_iterator LineWalker = Walker->lines.begin(); LineWalker != Walker->lines.end(); LineWalker++) { 4258 OtherWalker = (LineWalker->second)->GetOtherEndpoint(Walker); 4259 Log() << Verbose(1) << "Checking " << *OtherWalker << endl; 4260 set < BoundaryPointSet *>::iterator Finder = EndpointCandidateList.find(OtherWalker); 4261 if (Finder != EndpointCandidateList.end()) { // found a connected partner 4262 Log() << Verbose(1) << " Adding to polygon." << endl; 4263 Current->endpoints.insert(OtherWalker); 4264 EndpointCandidateList.erase(Finder); // remove from candidates 4265 ToCheckConnecteds.push(OtherWalker); // but check its partners too 4266 } else { 4267 Log() << Verbose(1) << " is not connected to " << *Walker << endl; 4268 } 4269 } 4270 } 4271 4272 Log() << Verbose(0) << "Final polygon is " << *Current << endl; 4273 ListofDegeneratedPolygons.insert(Current); 4274 Current = NULL; 4275 } 4276 4277 const int counter = ListofDegeneratedPolygons.size(); 4278 4279 Log() << Verbose(0) << "The following " << counter << " degenerated polygons have been found: " << endl; 4280 for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) 4281 Log() << Verbose(0) << " " << **PolygonRunner << endl; 4282 4283 /// 4. Go through all these degenerated polygons 4284 for (UniquePolygonSet::iterator PolygonRunner = ListofDegeneratedPolygons.begin(); PolygonRunner != ListofDegeneratedPolygons.end(); PolygonRunner++) { 4285 stack <int> TriangleNrs; 4286 Vector NormalVector; 4287 /// 4a. Gather all triangles of this polygon 4288 TriangleSet *T = (*PolygonRunner)->GetAllContainedTrianglesFromEndpoints(); 4289 4290 if (T->size() == 2) { 4291 Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl; 4292 delete(T); 4293 continue; 4294 } 4295 4296 TriangleSet::iterator TriangleWalker = T->begin(); // is the inner iterator 4297 /// 4a. Get NormalVector for one side (this is "front") 4298 NormalVector.CopyVector(&(*TriangleWalker)->NormalVector); 4299 Log() << Verbose(1) << "\"front\" defining triangle is " << **TriangleWalker << " and Normal vector of \"front\" side is " << NormalVector << endl; 4300 TriangleWalker++; 4301 TriangleSet::iterator TriangleSprinter = TriangleWalker; // is the inner advanced iterator 4302 /// 4b. Remove all triangles whose NormalVector is in opposite direction (i.e. "back") 4303 BoundaryTriangleSet *triangle = NULL; 4304 while (TriangleSprinter != T->end()) { 4305 TriangleWalker = TriangleSprinter; 4306 triangle = *TriangleWalker; 4307 TriangleSprinter++; 4308 Log() << Verbose(1) << "Current triangle to test for removal: " << *triangle << endl; 4309 if (triangle->NormalVector.ScalarProduct(&NormalVector) < 0) { // if from other side, then delete and remove from list 4310 Log() << Verbose(1) << " Removing ... " << endl; 4311 TriangleNrs.push(triangle->Nr); 4312 T->erase(TriangleWalker); 4313 RemoveTesselationTriangle(triangle); 4314 } else 4315 Log() << Verbose(1) << " Keeping ... " << endl; 4316 } 4317 /// 4c. Copy all "front" triangles but with inverse NormalVector 4318 TriangleWalker = T->begin(); 4319 while (TriangleWalker != T->end()) { // go through all front triangles 4320 Log() << Verbose(1) << " Re-creating triangle " << **TriangleWalker << " with NormalVector " << (*TriangleWalker)->NormalVector << endl; 4321 for (int i = 0; i < 3; i++) 4322 AddTesselationPoint((*TriangleWalker)->endpoints[i]->node, i); 4323 AddTesselationLine(TPS[0], TPS[1], 0); 4324 AddTesselationLine(TPS[0], TPS[2], 1); 4325 AddTesselationLine(TPS[1], TPS[2], 2); 4326 if (TriangleNrs.empty()) 4327 eLog() << Verbose(0) << "No more free triangle numbers!" << endl; 4328 BTS = new BoundaryTriangleSet(BLS, TriangleNrs.top()); // copy triangle ... 4329 AddTesselationTriangle(); // ... and add 4330 TriangleNrs.pop(); 4331 BTS->NormalVector.CopyVector(&(*TriangleWalker)->NormalVector); 4332 BTS->NormalVector.Scale(-1.); 4333 TriangleWalker++; 4334 } 4335 if (!TriangleNrs.empty()) { 4336 eLog() << Verbose(0) << "There have been less triangles created than removed!" << endl; 4337 } 4338 delete(T); // remove the triangleset 4339 } 4340 4341 map<int, int> * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles(); 4342 Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl; 4343 map<int,int>::iterator it; 4344 for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++) 4345 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; 4346 delete(SimplyDegeneratedTriangles); 4347 4348 /// 5. exit 4349 UniquePolygonSet::iterator PolygonRunner; 4350 while (!ListofDegeneratedPolygons.empty()) { 4351 PolygonRunner = ListofDegeneratedPolygons.begin(); 4352 delete(*PolygonRunner); 4353 ListofDegeneratedPolygons.erase(PolygonRunner); 4354 } 4355 4356 return counter; 4357 }; -
src/tesselation.hpp
r482373 r0b2dd2 23 23 #include <list> 24 24 #include <set> 25 #include <stack> 25 26 26 27 #include "atom_particleinfo.hpp" … … 47 48 #define VRMLSUffix ".wrl" 48 49 50 #define ParallelEpsilon 1e-3 51 49 52 // ======================================================= some template functions ========================================= 50 53 51 54 #define PointMap map < int, class BoundaryPointSet * > 55 #define PointSet set < class BoundaryPointSet * > 56 #define PointList list < class BoundaryPointSet * > 52 57 #define PointPair pair < int, class BoundaryPointSet * > 53 58 #define PointTestPair pair < PointMap::iterator, bool > 59 54 60 #define CandidateList list <class CandidateForTesselation *> 61 #define CandidateMap map <class BoundaryLineSet *, class CandidateForTesselation *> 55 62 56 63 #define LineMap multimap < int, class BoundaryLineSet * > 64 #define LineSet set < class BoundaryLineSet * > 65 #define LineList list < class BoundaryLineSet * > 57 66 #define LinePair pair < int, class BoundaryLineSet * > 58 67 #define LineTestPair pair < LineMap::iterator, bool > 59 68 60 69 #define TriangleMap map < int, class BoundaryTriangleSet * > 70 #define TriangleSet set < class BoundaryTriangleSet * > 71 #define TriangleList list < class BoundaryTriangleSet * > 61 72 #define TrianglePair pair < int, class BoundaryTriangleSet * > 62 73 #define TriangleTestPair pair < TrianglePair::iterator, bool > 63 74 75 #define PolygonMap map < int, class BoundaryPolygonSet * > 76 #define PolygonSet set < class BoundaryPolygonSet * > 77 #define PolygonList list < class BoundaryPolygonSet * > 78 64 79 #define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> > 65 80 #define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> > 81 82 #define TesselPointList list <TesselPoint *> 83 #define TesselPointSet set <TesselPoint *> 66 84 67 85 /********************************************** declarations *******************************/ … … 114 132 TriangleMap triangles; 115 133 int Nr; 134 bool skipped; 116 135 }; 117 136 … … 139 158 class BoundaryLineSet *lines[3]; 140 159 Vector NormalVector; 160 Vector SphereCenter; 141 161 int Nr; 142 162 }; 143 163 144 164 ostream & operator << (ostream &ost, const BoundaryTriangleSet &a); 165 166 167 // ======================================================== class BoundaryTriangleSet ======================================= 168 169 /** Set of BoundaryPointSet. 170 * This is just meant as a container for a group of endpoints, extending the node, line, triangle concept. However, this has 171 * only marginally something to do with the tesselation. Hence, there is no incorporation into the bookkeeping of the Tesselation 172 * class (i.e. no allocation, no deletion). 173 * \note we assume that the set of endpoints reside (more or less) on a plane. 174 */ 175 class BoundaryPolygonSet { 176 public: 177 BoundaryPolygonSet(); 178 ~BoundaryPolygonSet(); 179 180 Vector * GetNormalVector(const Vector &NormalVector) const; 181 void GetCenter(Vector *center) const; 182 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 183 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 184 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 185 bool ContainsBoundaryTriangle(const BoundaryTriangleSet * const point) const; 186 bool ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const; 187 bool ContainsPresentTupel(const BoundaryPolygonSet * const P) const; 188 bool ContainsPresentTupel(const PointSet &endpoints) const; 189 TriangleSet * GetAllContainedTrianglesFromEndpoints() const; 190 bool FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line); 191 192 PointSet endpoints; 193 int Nr; 194 }; 195 196 ostream & operator << (ostream &ost, const BoundaryPolygonSet &a); 145 197 146 198 // =========================================================== class TESSELPOINT =========================================== … … 170 222 virtual ~PointCloud(); 171 223 224 virtual const char * const GetName() const { return "unknown"; }; 172 225 virtual Vector *GetCenter() const { return NULL; }; 173 226 virtual TesselPoint *GetPoint() const { return NULL; }; … … 177 230 virtual void GoToFirst() const {}; 178 231 virtual void GoToLast() const {}; 179 virtual bool IsEmpty() const { return false; };180 virtual bool IsEnd() const { return false; };232 virtual bool IsEmpty() const { return true; }; 233 virtual bool IsEnd() const { return true; }; 181 234 }; 182 235 … … 185 238 class CandidateForTesselation { 186 239 public : 240 CandidateForTesselation(BoundaryLineSet* currentBaseLine); 187 241 CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, Vector OptCandidateCenter, Vector OtherOptCandidateCenter); 188 242 ~CandidateForTesselation(); 189 243 190 TesselPoint *point;244 TesselPointList pointlist; 191 245 BoundaryLineSet *BaseLine; 192 246 Vector OptCenter; 193 247 Vector OtherOptCenter; 194 }; 248 bool IsDegenerated; 249 double ShortestAngle; 250 double OtherShortestAngle; 251 }; 252 253 ostream & operator <<(ostream &ost, const CandidateForTesselation &a); 195 254 196 255 // =========================================================== class TESSELATION =========================================== … … 210 269 void AddTesselationTriangle(); 211 270 void AddTesselationTriangle(const int nr); 271 void AddCandidateTriangle(CandidateForTesselation CandidateLine); 212 272 void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle); 213 273 void RemoveTesselationLine(class BoundaryLineSet *line); … … 218 278 void FindStartingTriangle(const double RADIUS, const LinkedCell *LC); 219 279 void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC); 220 void 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;221 bool FindNextSuitableTriangle( BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC);280 void FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint * const ThirdNode, const double RADIUS, const LinkedCell *LC) const; 281 bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC); 222 282 int CheckPresenceOfTriangle(class TesselPoint *Candidates[3]) const; 223 283 class BoundaryTriangleSet * GetPresentTriangle(TesselPoint *Candidates[3]); … … 235 295 void RemoveDegeneratedTriangles(); 236 296 void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC); 297 int CorrectAllDegeneratedPolygons(); 237 298 238 299 set<TesselPoint*> * GetAllConnectedPoints(const TesselPoint* const Point) const; … … 240 301 list<list<TesselPoint*> *> * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; 241 302 list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 242 list<TesselPoint*> * GetCircleOf ConnectedPoints(const TesselPoint* const Point, const Vector * const Reference = NULL) const;303 list<TesselPoint*> * GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const; 243 304 class BoundaryPointSet *GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 244 305 list<BoundaryTriangleSet*> *FindTriangles(const TesselPoint* const Points[3]) const; … … 259 320 PointMap PointsOnBoundary; 260 321 LineMap LinesOnBoundary; 322 CandidateMap OpenLines; 261 323 TriangleMap TrianglesOnBoundary; 262 324 int PointsOnBoundaryCount; … … 286 348 mutable PointMap::const_iterator InternalPointer; 287 349 288 bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const;350 //bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const; 289 351 }; 290 352 -
src/tesselationhelpers.cpp
r482373 r0b2dd2 8 8 #include <fstream> 9 9 10 #include "info.hpp" 10 11 #include "linkedcell.hpp" 11 12 #include "log.hpp" … … 15 16 #include "verbose.hpp" 16 17 17 double DetGet(gsl_matrix * const A, const int inPlace) { 18 double DetGet(gsl_matrix * const A, const int inPlace) 19 { 20 Info FunctionInfo(__func__); 18 21 /* 19 22 inPlace = 1 => A is replaced with the LU decomposed copy. … … 45 48 void GetSphere(Vector * const center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS) 46 49 { 50 Info FunctionInfo(__func__); 47 51 gsl_matrix *A = gsl_matrix_calloc(3,3); 48 52 double m11, m12, m13, m14; … … 111 115 const double HalfplaneIndicator, const double AlternativeIndicator, const double alpha, const double beta, const double gamma, const double RADIUS, const double Umkreisradius) 112 116 { 117 Info FunctionInfo(__func__); 113 118 Vector TempNormal, helper; 114 119 double Restradius; 115 120 Vector OtherCenter; 116 Log() << Verbose(3) << "Begin of GetCenterOfSphere.\n";117 121 Center->Zero(); 118 122 helper.CopyVector(&a); … … 128 132 Center->Scale(1./(sin(2.*alpha) + sin(2.*beta) + sin(2.*gamma))); 129 133 NewUmkreismittelpunkt->CopyVector(Center); 130 Log() << Verbose( 4) << "Center of new circumference is " << *NewUmkreismittelpunkt << ".\n";134 Log() << Verbose(1) << "Center of new circumference is " << *NewUmkreismittelpunkt << ".\n"; 131 135 // Here we calculated center of circumscribing circle, using barycentric coordinates 132 Log() << Verbose( 4) << "Center of circumference is " << *Center << " in direction " << *Direction << ".\n";136 Log() << Verbose(1) << "Center of circumference is " << *Center << " in direction " << *Direction << ".\n"; 133 137 134 138 TempNormal.CopyVector(&a); … … 154 158 TempNormal.Normalize(); 155 159 Restradius = sqrt(RADIUS*RADIUS - Umkreisradius*Umkreisradius); 156 Log() << Verbose( 4) << "Height of center of circumference to center of sphere is " << Restradius << ".\n";160 Log() << Verbose(1) << "Height of center of circumference to center of sphere is " << Restradius << ".\n"; 157 161 TempNormal.Scale(Restradius); 158 Log() << Verbose( 4) << "Shift vector to sphere of circumference is " << TempNormal << ".\n";162 Log() << Verbose(1) << "Shift vector to sphere of circumference is " << TempNormal << ".\n"; 159 163 160 164 Center->AddVector(&TempNormal); 161 Log() << Verbose( 0) << "Center of sphere of circumference is " << *Center << ".\n";165 Log() << Verbose(1) << "Center of sphere of circumference is " << *Center << ".\n"; 162 166 GetSphere(&OtherCenter, a, b, c, RADIUS); 163 Log() << Verbose(0) << "OtherCenter of sphere of circumference is " << OtherCenter << ".\n"; 164 Log() << Verbose(3) << "End of GetCenterOfSphere.\n"; 167 Log() << Verbose(1) << "OtherCenter of sphere of circumference is " << OtherCenter << ".\n"; 165 168 }; 166 169 … … 174 177 void GetCenterofCircumcircle(Vector * const Center, const Vector &a, const Vector &b, const Vector &c) 175 178 { 179 Info FunctionInfo(__func__); 176 180 Vector helper; 177 181 double alpha, beta, gamma; … … 186 190 beta = M_PI - SideC.Angle(&SideA); 187 191 gamma = M_PI - SideA.Angle(&SideB); 188 //Log() << Verbose( 3) << "INFO: alpha = " << alpha/M_PI*180. << ", beta = " << beta/M_PI*180. << ", gamma = " << gamma/M_PI*180. << "." << endl;192 //Log() << Verbose(1) << "INFO: alpha = " << alpha/M_PI*180. << ", beta = " << beta/M_PI*180. << ", gamma = " << gamma/M_PI*180. << "." << endl; 189 193 if (fabs(M_PI - alpha - beta - gamma) > HULLEPSILON) { 190 eLog() << Verbose(0) << "GetCenterofCircumcircle: Sum of angles " << (alpha+beta+gamma)/M_PI*180. << " > 180 degrees by " << fabs(M_PI - alpha - beta - gamma)/M_PI*180. << "!" << endl; 191 performCriticalExit(); 194 eLog() << Verbose(1) << "GetCenterofCircumcircle: Sum of angles " << (alpha+beta+gamma)/M_PI*180. << " > 180 degrees by " << fabs(M_PI - alpha - beta - gamma)/M_PI*180. << "!" << endl; 192 195 } 193 196 … … 220 223 double GetPathLengthonCircumCircle(const Vector &CircleCenter, const Vector &CirclePlaneNormal, const double CircleRadius, const Vector &NewSphereCenter, const Vector &OldSphereCenter, const Vector &NormalVector, const Vector &SearchDirection) 221 224 { 225 Info FunctionInfo(__func__); 222 226 Vector helper; 223 227 double radius, alpha; 224 225 helper.CopyVector(&NewSphereCenter); 228 Vector RelativeOldSphereCenter; 229 Vector RelativeNewSphereCenter; 230 231 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 232 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 233 RelativeNewSphereCenter.CopyVector(&NewSphereCenter); 234 RelativeNewSphereCenter.SubtractVector(&CircleCenter); 235 helper.CopyVector(&RelativeNewSphereCenter); 226 236 // test whether new center is on the parameter circle's plane 227 237 if (fabs(helper.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { … … 229 239 helper.ProjectOntoPlane(&CirclePlaneNormal); 230 240 } 231 radius = helper. ScalarProduct(&helper);241 radius = helper.NormSquared(); 232 242 // test whether the new center vector has length of CircleRadius 233 243 if (fabs(radius - CircleRadius) > HULLEPSILON) 234 244 eLog() << Verbose(1) << "The projected center of the new sphere has radius " << radius << " instead of " << CircleRadius << "." << endl; 235 alpha = helper.Angle(& OldSphereCenter);245 alpha = helper.Angle(&RelativeOldSphereCenter); 236 246 // make the angle unique by checking the halfplanes/search direction 237 247 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON) // acos is not unique on [0, 2.*M_PI), hence extra check to decide between two half intervals 238 248 alpha = 2.*M_PI - alpha; 239 //Log() << Verbose(2) << "INFO: RelativeNewSphereCenter is " << helper << ", RelativeOldSphereCenter is " <<OldSphereCenter << " and resulting angle is " << alpha << "." << endl;240 radius = helper.Distance(& OldSphereCenter);249 Log() << Verbose(1) << "INFO: RelativeNewSphereCenter is " << helper << ", RelativeOldSphereCenter is " << RelativeOldSphereCenter << " and resulting angle is " << alpha << "." << endl; 250 radius = helper.Distance(&RelativeOldSphereCenter); 241 251 helper.ProjectOntoPlane(&NormalVector); 242 252 // check whether new center is somewhat away or at least right over the current baseline to prevent intersecting triangles 243 253 if ((radius > HULLEPSILON) || (helper.Norm() < HULLEPSILON)) { 244 //Log() << Verbose(2) << "INFO: Distance between old and new center is " << radius << " and between new center and baseline center is " << helper.Norm() << "." << endl;254 Log() << Verbose(1) << "INFO: Distance between old and new center is " << radius << " and between new center and baseline center is " << helper.Norm() << "." << endl; 245 255 return alpha; 246 256 } else { 247 //Log() << Verbose(1) << "INFO: NewSphereCenter " << helper << " is too close to OldSphereCenter" <<OldSphereCenter << "." << endl;257 Log() << Verbose(1) << "INFO: NewSphereCenter " << RelativeNewSphereCenter << " is too close to RelativeOldSphereCenter" << RelativeOldSphereCenter << "." << endl; 248 258 return 2.*M_PI; 249 259 } … … 265 275 double MinIntersectDistance(const gsl_vector * x, void *params) 266 276 { 277 Info FunctionInfo(__func__); 267 278 double retval = 0; 268 279 struct Intersection *I = (struct Intersection *)params; … … 285 296 286 297 retval = HeightA.ScalarProduct(&HeightA) + HeightB.ScalarProduct(&HeightB); 287 //Log() << Verbose( 2) << "MinIntersectDistance called, result: " << retval << endl;298 //Log() << Verbose(1) << "MinIntersectDistance called, result: " << retval << endl; 288 299 289 300 return retval; … … 305 316 bool existsIntersection(const Vector &point1, const Vector &point2, const Vector &point3, const Vector &point4) 306 317 { 318 Info FunctionInfo(__func__); 307 319 bool result; 308 320 … … 352 364 353 365 if (status == GSL_SUCCESS) { 354 Log() << Verbose( 2) << "converged to minimum" << endl;366 Log() << Verbose(1) << "converged to minimum" << endl; 355 367 } 356 368 } while (status == GSL_CONTINUE && iter < 100); … … 377 389 t2 = HeightB.ScalarProduct(&SideB)/SideB.ScalarProduct(&SideB); 378 390 379 Log() << Verbose( 2) << "Intersection " << intersection << " is at "391 Log() << Verbose(1) << "Intersection " << intersection << " is at " 380 392 << t1 << " for (" << point1 << "," << point2 << ") and at " 381 393 << t2 << " for (" << point3 << "," << point4 << "): "; 382 394 383 395 if (((t1 >= 0) && (t1 <= 1)) && ((t2 >= 0) && (t2 <= 1))) { 384 Log() << Verbose( 0) << "true intersection." << endl;396 Log() << Verbose(1) << "true intersection." << endl; 385 397 result = true; 386 398 } else { 387 Log() << Verbose( 0) << "intersection out of region of interest." << endl;399 Log() << Verbose(1) << "intersection out of region of interest." << endl; 388 400 result = false; 389 401 } … … 408 420 double GetAngle(const Vector &point, const Vector &reference, const Vector &OrthogonalVector) 409 421 { 422 Info FunctionInfo(__func__); 410 423 if (reference.IsZero()) 411 424 return M_PI; … … 419 432 } 420 433 421 Log() << Verbose( 4) << "INFO: " << point << " has angle " << phi << " with respect to reference " << reference << "." << endl;434 Log() << Verbose(1) << "INFO: " << point << " has angle " << phi << " with respect to reference " << reference << "." << endl; 422 435 423 436 return phi; … … 434 447 double CalculateVolumeofGeneralTetraeder(const Vector &a, const Vector &b, const Vector &c, const Vector &d) 435 448 { 449 Info FunctionInfo(__func__); 436 450 Vector Point, TetraederVector[3]; 437 451 double volume; … … 457 471 bool CheckLineCriteriaForDegeneratedTriangle(const BoundaryPointSet * const nodes[3]) 458 472 { 473 Info FunctionInfo(__func__); 459 474 bool result = false; 460 475 int counter = 0; … … 483 498 } 484 499 if ((!result) && (counter > 1)) { 485 Log() << Verbose( 2) << "INFO: Degenerate triangle is ok, at least two, here " << counter << ", existing lines are used." << endl;500 Log() << Verbose(1) << "INFO: Degenerate triangle is ok, at least two, here " << counter << ", existing lines are used." << endl; 486 501 result = true; 487 502 } … … 490 505 491 506 492 /** Sort function for the candidate list. 493 */ 494 bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation* candidate2) 495 { 496 Vector BaseLineVector, OrthogonalVector, helper; 497 if (candidate1->BaseLine != candidate2->BaseLine) { // sanity check 498 eLog() << Verbose(1) << "sortCandidates was called for two different baselines: " << candidate1->BaseLine << " and " << candidate2->BaseLine << "." << endl; 499 //return false; 500 exit(1); 501 } 502 // create baseline vector 503 BaseLineVector.CopyVector(candidate1->BaseLine->endpoints[1]->node->node); 504 BaseLineVector.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 505 BaseLineVector.Normalize(); 506 507 // create normal in-plane vector to cope with acos() non-uniqueness on [0,2pi] (note that is pointing in the "right" direction already, hence ">0" test!) 508 helper.CopyVector(candidate1->BaseLine->endpoints[0]->node->node); 509 helper.SubtractVector(candidate1->point->node); 510 OrthogonalVector.CopyVector(&helper); 511 helper.VectorProduct(&BaseLineVector); 512 OrthogonalVector.SubtractVector(&helper); 513 OrthogonalVector.Normalize(); 514 515 // calculate both angles and correct with in-plane vector 516 helper.CopyVector(candidate1->point->node); 517 helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 518 double phi = BaseLineVector.Angle(&helper); 519 if (OrthogonalVector.ScalarProduct(&helper) > 0) { 520 phi = 2.*M_PI - phi; 521 } 522 helper.CopyVector(candidate2->point->node); 523 helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 524 double psi = BaseLineVector.Angle(&helper); 525 if (OrthogonalVector.ScalarProduct(&helper) > 0) { 526 psi = 2.*M_PI - psi; 527 } 528 529 Log() << Verbose(2) << *candidate1->point << " has angle " << phi << endl; 530 Log() << Verbose(2) << *candidate2->point << " has angle " << psi << endl; 531 532 // return comparison 533 return phi < psi; 534 }; 507 ///** Sort function for the candidate list. 508 // */ 509 //bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation* candidate2) 510 //{ 511 // Info FunctionInfo(__func__); 512 // Vector BaseLineVector, OrthogonalVector, helper; 513 // if (candidate1->BaseLine != candidate2->BaseLine) { // sanity check 514 // eLog() << Verbose(1) << "sortCandidates was called for two different baselines: " << candidate1->BaseLine << " and " << candidate2->BaseLine << "." << endl; 515 // //return false; 516 // exit(1); 517 // } 518 // // create baseline vector 519 // BaseLineVector.CopyVector(candidate1->BaseLine->endpoints[1]->node->node); 520 // BaseLineVector.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 521 // BaseLineVector.Normalize(); 522 // 523 // // create normal in-plane vector to cope with acos() non-uniqueness on [0,2pi] (note that is pointing in the "right" direction already, hence ">0" test!) 524 // helper.CopyVector(candidate1->BaseLine->endpoints[0]->node->node); 525 // helper.SubtractVector(candidate1->point->node); 526 // OrthogonalVector.CopyVector(&helper); 527 // helper.VectorProduct(&BaseLineVector); 528 // OrthogonalVector.SubtractVector(&helper); 529 // OrthogonalVector.Normalize(); 530 // 531 // // calculate both angles and correct with in-plane vector 532 // helper.CopyVector(candidate1->point->node); 533 // helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 534 // double phi = BaseLineVector.Angle(&helper); 535 // if (OrthogonalVector.ScalarProduct(&helper) > 0) { 536 // phi = 2.*M_PI - phi; 537 // } 538 // helper.CopyVector(candidate2->point->node); 539 // helper.SubtractVector(candidate1->BaseLine->endpoints[0]->node->node); 540 // double psi = BaseLineVector.Angle(&helper); 541 // if (OrthogonalVector.ScalarProduct(&helper) > 0) { 542 // psi = 2.*M_PI - psi; 543 // } 544 // 545 // Log() << Verbose(1) << *candidate1->point << " has angle " << phi << endl; 546 // Log() << Verbose(1) << *candidate2->point << " has angle " << psi << endl; 547 // 548 // // return comparison 549 // return phi < psi; 550 //}; 535 551 536 552 /** … … 544 560 TesselPoint* FindSecondClosestPoint(const Vector* Point, const LinkedCell* const LC) 545 561 { 562 Info FunctionInfo(__func__); 546 563 TesselPoint* closestPoint = NULL; 547 564 TesselPoint* secondClosestPoint = NULL; … … 554 571 for(int i=0;i<NDIM;i++) // store indices of this cell 555 572 N[i] = LC->n[i]; 556 Log() << Verbose( 2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;573 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 557 574 558 575 LC->GetNeighbourBounds(Nlower, Nupper); 559 //Log() << Verbose( 0) << endl;576 //Log() << Verbose(1) << endl; 560 577 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 561 578 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 562 579 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 563 580 const LinkedNodes *List = LC->GetCurrentCell(); 564 //Log() << Verbose( 3) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl;581 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 565 582 if (List != NULL) { 566 583 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 598 615 TesselPoint* FindClosestPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC) 599 616 { 617 Info FunctionInfo(__func__); 600 618 TesselPoint* closestPoint = NULL; 601 619 SecondPoint = NULL; … … 608 626 for(int i=0;i<NDIM;i++) // store indices of this cell 609 627 N[i] = LC->n[i]; 610 Log() << Verbose( 3) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;628 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 611 629 612 630 LC->GetNeighbourBounds(Nlower, Nupper); 613 //Log() << Verbose( 0) << endl;631 //Log() << Verbose(1) << endl; 614 632 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 615 633 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 616 634 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 617 635 const LinkedNodes *List = LC->GetCurrentCell(); 618 //Log() << Verbose( 3) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl;636 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 619 637 if (List != NULL) { 620 638 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { … … 627 645 distance = currentNorm; 628 646 closestPoint = (*Runner); 629 //Log() << Verbose( 2) << "INFO: New Nearest Neighbour is " << *closestPoint << "." << endl;647 //Log() << Verbose(1) << "INFO: New Nearest Neighbour is " << *closestPoint << "." << endl; 630 648 } else if (currentNorm < secondDistance) { 631 649 secondDistance = currentNorm; 632 650 SecondPoint = (*Runner); 633 //Log() << Verbose( 2) << "INFO: New Second Nearest Neighbour is " << *SecondPoint << "." << endl;651 //Log() << Verbose(1) << "INFO: New Second Nearest Neighbour is " << *SecondPoint << "." << endl; 634 652 } 635 653 } … … 641 659 // output 642 660 if (closestPoint != NULL) { 643 Log() << Verbose( 2) << "Closest point is " << *closestPoint;661 Log() << Verbose(1) << "Closest point is " << *closestPoint; 644 662 if (SecondPoint != NULL) 645 663 Log() << Verbose(0) << " and second closest is " << *SecondPoint; … … 657 675 Vector * GetClosestPointBetweenLine(const BoundaryLineSet * const Base, const BoundaryLineSet * const OtherBase) 658 676 { 677 Info FunctionInfo(__func__); 659 678 // construct the plane of the two baselines (i.e. take both their directional vectors) 660 679 Vector Normal; … … 667 686 Normal.VectorProduct(&OtherBaseline); 668 687 Normal.Normalize(); 669 Log() << Verbose( 4) << "First direction is " << Baseline << ", second direction is " << OtherBaseline << ", normal of intersection plane is " << Normal << "." << endl;688 Log() << Verbose(1) << "First direction is " << Baseline << ", second direction is " << OtherBaseline << ", normal of intersection plane is " << Normal << "." << endl; 670 689 671 690 // project one offset point of OtherBase onto this plane (and add plane offset vector) … … 684 703 Normal.CopyVector(Intersection); 685 704 Normal.SubtractVector(Base->endpoints[0]->node->node); 686 Log() << Verbose( 3) << "Found closest point on " << *Base << " at " << *Intersection << ", factor in line is " << fabs(Normal.ScalarProduct(&Baseline)/Baseline.NormSquared()) << "." << endl;705 Log() << Verbose(1) << "Found closest point on " << *Base << " at " << *Intersection << ", factor in line is " << fabs(Normal.ScalarProduct(&Baseline)/Baseline.NormSquared()) << "." << endl; 687 706 688 707 return Intersection; … … 697 716 double DistanceToTrianglePlane(const Vector *x, const BoundaryTriangleSet * const triangle) 698 717 { 718 Info FunctionInfo(__func__); 699 719 double distance = 0.; 700 720 if (x == NULL) { … … 713 733 void WriteVrmlFile(ofstream * const vrmlfile, const Tesselation * const Tess, const PointCloud * const cloud) 714 734 { 735 Info FunctionInfo(__func__); 715 736 TesselPoint *Walker = NULL; 716 737 int i; … … 756 777 void IncludeSphereinRaster3D(ofstream * const rasterfile, const Tesselation * const Tess, const PointCloud * const cloud) 757 778 { 779 Info FunctionInfo(__func__); 758 780 Vector helper; 759 // include the current position of the virtual sphere in the temporary raster3d file 760 Vector *center = cloud->GetCenter(); 761 // make the circumsphere's center absolute again 762 helper.CopyVector(Tess->LastTriangle->endpoints[0]->node->node); 763 helper.AddVector(Tess->LastTriangle->endpoints[1]->node->node); 764 helper.AddVector(Tess->LastTriangle->endpoints[2]->node->node); 765 helper.Scale(1./3.); 766 helper.SubtractVector(center); 767 // and add to file plus translucency object 768 *rasterfile << "# current virtual sphere\n"; 769 *rasterfile << "8\n 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0\n"; 770 *rasterfile << "2\n " << helper.x[0] << " " << helper.x[1] << " " << helper.x[2] << "\t" << 5. << "\t1 0 0\n"; 771 *rasterfile << "9\n terminating special property\n"; 772 delete(center); 781 782 if (Tess->LastTriangle != NULL) { 783 // include the current position of the virtual sphere in the temporary raster3d file 784 Vector *center = cloud->GetCenter(); 785 // make the circumsphere's center absolute again 786 helper.CopyVector(Tess->LastTriangle->endpoints[0]->node->node); 787 helper.AddVector(Tess->LastTriangle->endpoints[1]->node->node); 788 helper.AddVector(Tess->LastTriangle->endpoints[2]->node->node); 789 helper.Scale(1./3.); 790 helper.SubtractVector(center); 791 // and add to file plus translucency object 792 *rasterfile << "# current virtual sphere\n"; 793 *rasterfile << "8\n 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0\n"; 794 *rasterfile << "2\n " << helper.x[0] << " " << helper.x[1] << " " << helper.x[2] << "\t" << 5. << "\t1 0 0\n"; 795 *rasterfile << "9\n terminating special property\n"; 796 delete(center); 797 } 773 798 }; 774 799 … … 781 806 void WriteRaster3dFile(ofstream * const rasterfile, const Tesselation * const Tess, const PointCloud * const cloud) 782 807 { 808 Info FunctionInfo(__func__); 783 809 TesselPoint *Walker = NULL; 784 810 int i; … … 826 852 void WriteTecplotFile(ofstream * const tecplot, const Tesselation * const TesselStruct, const PointCloud * const cloud, const int N) 827 853 { 854 Info FunctionInfo(__func__); 828 855 if ((tecplot != NULL) && (TesselStruct != NULL)) { 829 856 // write header 830 857 *tecplot << "TITLE = \"3D CONVEX SHELL\"" << endl; 831 858 *tecplot << "VARIABLES = \"X\" \"Y\" \"Z\" \"U\"" << endl; 832 *tecplot << "ZONE T=\"" << N << "-"; 833 for (int i=0;i<3;i++) 834 *tecplot << (i==0 ? "" : "_") << TesselStruct->LastTriangle->endpoints[i]->node->Name; 859 *tecplot << "ZONE T=\""; 860 if (N < 0) { 861 *tecplot << cloud->GetName(); 862 } else { 863 *tecplot << N << "-"; 864 for (int i=0;i<3;i++) 865 *tecplot << (i==0 ? "" : "_") << TesselStruct->LastTriangle->endpoints[i]->node->Name; 866 } 835 867 *tecplot << "\", N=" << TesselStruct->PointsOnBoundary.size() << ", E=" << TesselStruct->TrianglesOnBoundary.size() << ", DATAPACKING=POINT, ZONETYPE=FETRIANGLE" << endl; 836 868 int i=0; … … 841 873 842 874 // print atom coordinates 843 Log() << Verbose(2) << "The following triangles were created:";844 875 int Counter = 1; 845 876 TesselPoint *Walker = NULL; … … 851 882 *tecplot << endl; 852 883 // print connectivity 884 Log() << Verbose(1) << "The following triangles were created:" << endl; 853 885 for (TriangleMap::const_iterator runner = TesselStruct->TrianglesOnBoundary.begin(); runner != TesselStruct->TrianglesOnBoundary.end(); runner++) { 854 Log() << Verbose( 0) << " " << runner->second->endpoints[0]->node->Name << "<->" << runner->second->endpoints[1]->node->Name << "<->" << runner->second->endpoints[2]->node->Name;886 Log() << Verbose(1) << " " << runner->second->endpoints[0]->node->Name << "<->" << runner->second->endpoints[1]->node->Name << "<->" << runner->second->endpoints[2]->node->Name << endl; 855 887 *tecplot << LookupList[runner->second->endpoints[0]->node->nr] << " " << LookupList[runner->second->endpoints[1]->node->nr] << " " << LookupList[runner->second->endpoints[2]->node->nr] << endl; 856 888 } 857 889 delete[] (LookupList); 858 Log() << Verbose(0) << endl;859 890 } 860 891 }; … … 867 898 void CalculateConcavityPerBoundaryPoint(const Tesselation * const TesselStruct) 868 899 { 900 Info FunctionInfo(__func__); 869 901 class BoundaryPointSet *point = NULL; 870 902 class BoundaryLineSet *line = NULL; 871 903 872 //Log() << Verbose(2) << "Begin of CalculateConcavityPerBoundaryPoint" << endl;873 904 // calculate remaining concavity 874 905 for (PointMap::const_iterator PointRunner = TesselStruct->PointsOnBoundary.begin(); PointRunner != TesselStruct->PointsOnBoundary.end(); PointRunner++) { … … 878 909 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 879 910 line = LineRunner->second; 880 //Log() << Verbose( 2) << "INFO: Current line of point " << *point << " is " << *line << "." << endl;911 //Log() << Verbose(1) << "INFO: Current line of point " << *point << " is " << *line << "." << endl; 881 912 if (!line->CheckConvexityCriterion()) 882 913 point->value += 1; 883 914 } 884 915 } 885 //Log() << Verbose(2) << "End of CalculateConcavityPerBoundaryPoint" << endl;886 916 }; 887 917 … … 894 924 bool CheckListOfBaselines(const Tesselation * const TesselStruct) 895 925 { 926 Info FunctionInfo(__func__); 896 927 LineMap::const_iterator testline; 897 928 bool result = false; … … 901 932 for (testline = TesselStruct->LinesOnBoundary.begin(); testline != TesselStruct->LinesOnBoundary.end(); testline++) { 902 933 if (testline->second->triangles.size() != 2) { 903 Log() << Verbose( 1) << *testline->second << "\t" << testline->second->triangles.size() << endl;934 Log() << Verbose(2) << *testline->second << "\t" << testline->second->triangles.size() << endl; 904 935 counter++; 905 936 } … … 912 943 } 913 944 945 /** Counts the number of triangle pairs that contain the given polygon. 946 * \param *P polygon with endpoints to look for 947 * \param *T set of triangles to create pairs from containing \a *P 948 */ 949 int CountTrianglePairContainingPolygon(const BoundaryPolygonSet * const P, const TriangleSet * const T) 950 { 951 Info FunctionInfo(__func__); 952 // check number of endpoints in *P 953 if (P->endpoints.size() != 4) { 954 eLog() << Verbose(1) << "CountTrianglePairContainingPolygon works only on polygons with 4 nodes!" << endl; 955 return 0; 956 } 957 958 // check number of triangles in *T 959 if (T->size() < 2) { 960 eLog() << Verbose(1) << "Not enough triangles to have pairs!" << endl; 961 return 0; 962 } 963 964 Log() << Verbose(0) << "Polygon is " << *P << endl; 965 // create each pair, get the endpoints and check whether *P is contained. 966 int counter = 0; 967 PointSet Trianglenodes; 968 class BoundaryPolygonSet PairTrianglenodes; 969 for(TriangleSet::iterator Walker = T->begin(); Walker != T->end(); Walker++) { 970 for (int i=0;i<3;i++) 971 Trianglenodes.insert((*Walker)->endpoints[i]); 972 973 for(TriangleSet::iterator PairWalker = Walker; PairWalker != T->end(); PairWalker++) { 974 if (Walker != PairWalker) { // skip first 975 PairTrianglenodes.endpoints = Trianglenodes; 976 for (int i=0;i<3;i++) 977 PairTrianglenodes.endpoints.insert((*PairWalker)->endpoints[i]); 978 const int size = PairTrianglenodes.endpoints.size(); 979 if (size == 4) { 980 Log() << Verbose(0) << " Current pair of triangles: " << **Walker << "," << **PairWalker << " with " << size << " distinct endpoints:" << PairTrianglenodes << endl; 981 // now check 982 if (PairTrianglenodes.ContainsPresentTupel(P)) { 983 counter++; 984 Log() << Verbose(0) << " ACCEPT: Matches with " << *P << endl; 985 } else { 986 Log() << Verbose(0) << " REJECT: No match with " << *P << endl; 987 } 988 } else { 989 Log() << Verbose(0) << " REJECT: Less than four endpoints." << endl; 990 } 991 } 992 } 993 Trianglenodes.clear(); 994 } 995 return counter; 996 }; 997 998 /** Checks whether two give polygons have two or more points in common. 999 * \param *P1 first polygon 1000 * \param *P2 second polygon 1001 * \return true - are connected, false = are note 1002 */ 1003 bool ArePolygonsEdgeConnected(const BoundaryPolygonSet * const P1, const BoundaryPolygonSet * const P2) 1004 { 1005 Info FunctionInfo(__func__); 1006 int counter = 0; 1007 for(PointSet::const_iterator Runner = P1->endpoints.begin(); Runner != P1->endpoints.end(); Runner++) { 1008 if (P2->ContainsBoundaryPoint((*Runner))) { 1009 counter++; 1010 Log() << Verbose(1) << *(*Runner) << " of second polygon is found in the first one." << endl; 1011 return true; 1012 } 1013 } 1014 return false; 1015 }; 1016 1017 /** Combines second into the first and deletes the second. 1018 * \param *P1 first polygon, contains all nodes on return 1019 * \param *&P2 second polygon, is deleted. 1020 */ 1021 void CombinePolygons(BoundaryPolygonSet * const P1, BoundaryPolygonSet * &P2) 1022 { 1023 Info FunctionInfo(__func__); 1024 pair <PointSet::iterator, bool> Tester; 1025 for(PointSet::iterator Runner = P2->endpoints.begin(); Runner != P2->endpoints.end(); Runner++) { 1026 Tester = P1->endpoints.insert((*Runner)); 1027 if (Tester.second) 1028 Log() << Verbose(0) << "Inserting endpoint " << *(*Runner) << " into first polygon." << endl; 1029 } 1030 P2->endpoints.clear(); 1031 delete(P2); 1032 }; 1033 -
src/tesselationhelpers.hpp
r482373 r0b2dd2 72 72 bool CheckListOfBaselines(const Tesselation * const TesselStruct); 73 73 74 int CountTrianglePairContainingPolygon(const BoundaryPolygonSet * const P, const TriangleSet * const T); 75 bool ArePolygonsEdgeConnected(const BoundaryPolygonSet * const P1, const BoundaryPolygonSet * const P2); 76 void CombinePolygons(BoundaryPolygonSet * const P1, BoundaryPolygonSet * &P2); 77 74 78 75 79 #endif /* TESSELATIONHELPERS_HPP_ */ -
src/unittests/Makefile.am
r482373 r0b2dd2 4 4 AM_CXXFLAGS = $(CPPUNIT_CFLAGS) 5 5 6 TESTS = ActOnAllUnitTest AnalysisBondsUnitTests AnalysisCorrelationToPointUnitTest AnalysisCorrelationToSurfaceUnitTest AnalysisPairCorrelationUnitTest BondGraphUnitTest ListOfBondsUnitTest LogUnitTest MemoryUsageObserverUnitTest MemoryAllocatorUnitTest StackClassUnitTest VectorUnitTest6 TESTS = ActOnAllUnitTest AnalysisBondsUnitTests AnalysisCorrelationToPointUnitTest AnalysisCorrelationToSurfaceUnitTest AnalysisPairCorrelationUnitTest BondGraphUnitTest InfoUnitTest ListOfBondsUnitTest LogUnitTest MemoryUsageObserverUnitTest MemoryAllocatorUnitTest StackClassUnitTest VectorUnitTest 7 7 check_PROGRAMS = $(TESTS) 8 8 noinst_PROGRAMS = $(TESTS) … … 25 25 BondGraphUnitTest_SOURCES = bondgraphunittest.cpp bondgraphunittest.hpp 26 26 BondGraphUnitTest_LDADD = ../libmolecuilder.a 27 28 InfoUnitTest_SOURCES = infounittest.cpp infounittest.hpp 29 InfoUnitTest_LDADD = ../libmolecuilder.a 27 30 28 31 ListOfBondsUnitTest_SOURCES = listofbondsunittest.cpp listofbondsunittest.hpp -
src/vector.cpp
r482373 r0b2dd2 480 480 else 481 481 return false; 482 }; 483 484 /** Checks whether vector is normal to \a *normal. 485 * @return true - vector is normalized, false - vector is not 486 */ 487 bool Vector::IsEqualTo(const Vector * const a) const 488 { 489 bool status = true; 490 for (int i=0;i<NDIM;i++) { 491 if (fabs(x[i] - a->x[i]) > MYEPSILON) 492 status = false; 493 } 494 return status; 482 495 }; 483 496 -
src/vector.hpp
r482373 r0b2dd2 42 42 bool IsOne() const; 43 43 bool IsNormalTo(const Vector * const normal) const; 44 bool IsEqualTo(const Vector * const a) const; 44 45 45 46 void AddVector(const Vector * const y); -
src/verbose.cpp
r482373 r0b2dd2 1 1 using namespace std; 2 2 3 #include "info.hpp" 3 4 #include "verbose.hpp" 4 5 … … 9 10 ostream& Verbose::print (ostream &ost) const 10 11 { 11 for (int i=Verbosity ;i--;)12 for (int i=Verbosity+Info::verbosity;i--;) 12 13 ost.put('\t'); 13 14 //Log() << Verbose(0) << "Verbose(.) called." << endl; … … 22 23 bool Verbose::DoOutput(int verbosityLevel) const 23 24 { 24 return (verbosityLevel >= Verbosity );25 return (verbosityLevel >= Verbosity+Info::verbosity); 25 26 }; 26 27 -
tests/Tesselations/1_2-dimethoxyethane/NonConvexEnvelope-1_2-dimethoxyethane.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H10_ H15_ H16", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="1_2-dimethoxyethane", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.6489 7.0567 6.6101 2 5 5 6.8975 7.0567 5.9709 2 -
tests/Tesselations/1_2-dimethylbenzene/NonConvexEnvelope-1_2-dimethylbenzene.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C07_ C08_ H09", N=14, E=25, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="1_2-dimethylbenzene", N=14, E=25, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 8.3296 6.7712 6.0321 3 5 5 8.3296 8.1534 6.0305 3 -
tests/Tesselations/2-methylcyclohexanone/NonConvexEnvelope-2-methylcyclohexanone.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H15_ H18_ H19", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="2-methylcyclohexanone", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.2731 9.0957 6.144 1 5 5 10.8392 7.1885 6.8694 0 -
tests/Tesselations/C16_0-Torus/NonConvexEnvelope-C16_0-Torus.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C818_ C1839_ C1904", N=8208, E=16416, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="C16_0-Torus", N=8208, E=16416, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 57.0669 28.4968 10.0318 2 5 5 53.7124 30.5841 10.0363 2 -
tests/Tesselations/Makefile.am
r482373 r0b2dd2 2 2 1_2-dimethylbenzene.test \ 3 3 2-methylcyclohexanone.test \ 4 benzene.test \ 4 5 cholesterol.test \ 5 6 cluster.test \ -
tests/Tesselations/N_N-dimethylacetamide/NonConvexEnvelope-N_N-dimethylacetamide.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C03_ O06_ H12", N=11, E=18, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="N_N-dimethylacetamide", N=11, E=18, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 6.4232 7.1074 8.3151 3 5 5 6.5832 7.8674 9.2351 1 -
tests/Tesselations/cholesterol/NonConvexEnvelope-cholesterol.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H49_ H50_ H51", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="cholesterol", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 19.4519 9.7871 8.0824 1 5 5 12.9054 5.0485 9.284 1 -
tests/Tesselations/cluster/NonConvexEnvelope-cluster.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- O4864_ O4865_ O5836", N=434, E=782, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="cluster", N=434, E=782, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 59.3961 67.9193 74.1709 1 5 5 60.8097 66.4885 71.9891 1 -
tests/Tesselations/cycloheptane/NonConvexEnvelope-cycloheptane.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H12_ H13", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="cycloheptane", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 5 8.6586 6.1486 0 5 5 5.8635 8.4046 7.6783 0 -
tests/Tesselations/dimethyl_bromomalonate/NonConvexEnvelope-dimethyl_bromomalonate.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H12_ H13_ H14", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="dimethyl_bromomalonate", N=12, E=20, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 8.1538 5 6.6665 1 5 5 6.8226 7.583 6.9158 4 -
tests/Tesselations/glucose/NonConvexEnvelope-glucose.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C09_ O12_ H17", N=19, E=34, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="glucose", N=19, E=34, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.5866 5 7.577 1 5 5 8.4149 7.4116 8.4659 1 -
tests/Tesselations/heptan/NonConvexEnvelope-heptan.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H07_ H08_ H11", N=16, E=28, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="heptan", N=16, E=28, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.6377 5 6.78 0 5 5 9.6377 5 5 0 -
tests/Tesselations/isoleucine/NonConvexEnvelope-isoleucine.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H20_ H21_ H22", N=17, E=30, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="isoleucine", N=17, E=30, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 10.8909 7.216 6.6663 5 5 5 9.4763 5.271 6.3191 1 -
tests/Tesselations/neohexane/NonConvexEnvelope-neohexane.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H10_ H15_ H20", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="neohexane", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 7.1525 6.2503 8.0589 1 5 5 7.1525 8.0303 8.0578 1 -
tests/Tesselations/proline/NonConvexEnvelope-proline.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H10_ H13_ H17", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="proline", N=13, E=22, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.2095 7.1856 6.6953 4 5 5 9.3187 7.948 7.6262 2 -
tests/Tesselations/putrescine/NonConvexEnvelope-putrescine.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- N06_ H17_ H18", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="putrescine", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 10.8857 5.9511 6.2964 1 5 5 5.5257 8.9311 6.4164 1 -
tests/Tesselations/round_cluster/NonConvexEnvelope-round_cluster.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- O633_ O960_ O1013", N=467, E=930, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="round_cluster", N=467, E=930, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 41.4883 31.1464 29.9646 2 5 5 35.0153 37.6127 31.0313 4 -
tests/Tesselations/tartaric_acid/NonConvexEnvelope-tartaric_acid.dat
r482373 r0b2dd2 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- C05_ O09_ H12", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="tartaric_acid", N=14, E=24, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 10.156 6.9295 6.2926 4 5 5 8.5078 5.7627 5 1
Note:
See TracChangeset
for help on using the changeset viewer.