Changes in / [bd61b41:271e17]
- Files:
-
- 19 added
- 41 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Makefile.am
rbd61b41 r271e17 1 1 ATOMSOURCE = atom.cpp atom_atominfo.cpp atom_bondedparticle.cpp atom_bondedparticleinfo.cpp atom_graphnode.cpp atom_graphnodeinfo.cpp atom_particleinfo.cpp atom_trajectoryparticle.cpp atom_trajectoryparticleinfo.cpp 2 2 ATOMHEADER = atom.hpp atom_atominfo.hpp atom_bondedparticle.hpp atom_bondedparticleinfo.hpp atom_graphnode.hpp atom_graphnodeinfo.hpp atom_particleinfo.hpp atom_trajectoryparticle.hpp atom_trajectoryparticleinfo.hpp 3 4 LINALGSOURCE = gslmatrix.cpp gslvector.cpp linearsystemofequations.cpp 5 LINALGHEADER = gslmatrix.hpp gslvector.hpp linearsystemofequations.hpp 3 6 4 7 ANALYSISSOURCE = analysis_bonds.cpp analysis_correlation.cpp … … 11 14 INCLUDES = -I$(top_srcdir)/src/unittests 12 15 13 noinst_LIBRARIES = libmolecuilder.a 16 noinst_LIBRARIES = libmolecuilder.a libgslwrapper.a 14 17 bin_PROGRAMS = molecuilder joiner analyzer 15 18 molecuilderdir = ${bindir} 16 19 libmolecuilder_a_SOURCES = ${SOURCE} ${HEADER} 20 libgslwrapper_a_SOURCES = ${LINALGSOURCE} ${LINALGHEADER} 17 21 molecuilder_DATA = elements.db valence.db orbitals.db Hbonddistance.db Hbondangle.db 18 22 molecuilder_LDFLAGS = $(BOOST_LIB) 19 23 molecuilder_SOURCES = builder.cpp 20 molecuilder_LDADD = libmolecuilder.a 24 molecuilder_LDADD = libmolecuilder.a libgslwrapper.a 21 25 joiner_SOURCES = joiner.cpp datacreator.cpp parser.cpp datacreator.hpp helpers.hpp parser.hpp periodentafel.hpp 22 26 joiner_LDADD = libmolecuilder.a -
src/analysis_correlation.cpp
rbd61b41 r271e17 267 267 Log() << Verbose(3) << "Current atom is " << *Walker << "." << endl; 268 268 if ((type == NULL) || (Walker->type == type)) { 269 triangle = Surface->FindClosestTriangleTo Point(Walker->node, LC );269 triangle = Surface->FindClosestTriangleToVector(Walker->node, LC ); 270 270 if (triangle != NULL) { 271 271 distance = DistanceToTrianglePlane(Walker->node, triangle); … … 308 308 } 309 309 outmap = new CorrelationToSurfaceMap; 310 double ShortestDistance = 0.; 311 BoundaryTriangleSet *ShortestTriangle = NULL; 310 312 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 311 313 if ((*MolWalker)->ActiveFlag) { … … 321 323 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 322 324 // go through every range in xyz and get distance 325 ShortestDistance = -1.; 323 326 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 324 327 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) … … 327 330 checkX.AddVector(&periodicX); 328 331 checkX.MatrixMultiplication(FullMatrix); 329 triangle = Surface->FindClosestTriangleToPoint(&checkX, LC ); 330 if (triangle != NULL) { 331 distance = DistanceToTrianglePlane(&checkX, triangle); 332 outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(distance, pair<atom *, BoundaryTriangleSet*> (Walker, triangle) ) ); 332 triangle = Surface->FindClosestTriangleToVector(&checkX, LC); 333 distance = Surface->GetDistanceSquaredToTriangle(checkX, triangle); 334 if ((ShortestDistance == -1.) || (distance < ShortestDistance)) { 335 ShortestDistance = distance; 336 ShortestTriangle = triangle; 333 337 } 334 } 338 } 339 // insert 340 ShortestDistance = sqrt(ShortestDistance); 341 outmap->insert ( pair<double, pair<atom *, BoundaryTriangleSet*> >(ShortestDistance, pair<atom *, BoundaryTriangleSet*> (Walker, ShortestTriangle) ) ); 342 //Log() << Verbose(1) << "INFO: Inserting " << Walker << " with distance " << ShortestDistance << " to " << *ShortestTriangle << "." << endl; 335 343 } 336 344 } … … 362 370 { 363 371 Info FunctionInfo(__func__); 364 *file << " #BinStart\tCount" << endl;372 *file << "BinStart\tCount" << endl; 365 373 for (BinPairMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { 366 374 *file << runner->first << "\t" << runner->second << endl; … … 375 383 { 376 384 Info FunctionInfo(__func__); 377 *file << " #BinStart\tAtom1\tAtom2" << endl;385 *file << "BinStart\tAtom1\tAtom2" << endl; 378 386 for (PairCorrelationMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { 379 387 *file << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl; … … 388 396 { 389 397 Info FunctionInfo(__func__); 390 *file << " #BinStart\tAtom::x[i]-point.x[i]" << endl;398 *file << "BinStart\tAtom::x[i]-point.x[i]" << endl; 391 399 for (CorrelationToPointMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { 392 400 *file << runner->first; … … 404 412 { 405 413 Info FunctionInfo(__func__); 406 *file << " #BinStart\tTriangle" << endl;414 *file << "BinStart\tTriangle" << endl; 407 415 for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { 408 *file << runner->first << "\t" << *(runner->second. second) << endl;409 } 410 }; 411 416 *file << runner->first << "\t" << *(runner->second.first) << "\t" << *(runner->second.second) << endl; 417 } 418 }; 419 -
src/analysis_correlation.hpp
rbd61b41 r271e17 53 53 int GetBin ( const double value, const double BinWidth, const double BinStart ); 54 54 void OutputCorrelation( ofstream * const file, const BinPairMap * const map ); 55 void OutputPairCorrelation( ofstream * const file, const BinPairMap * const map );56 void OutputCorrelationToPoint( ofstream * const file, const BinPairMap * const map );57 void OutputCorrelationToSurface( ofstream * const file, const BinPairMap * const map );55 void OutputPairCorrelation( ofstream * const file, const PairCorrelationMap * const map ); 56 void OutputCorrelationToPoint( ofstream * const file, const CorrelationToPointMap * const map ); 57 void OutputCorrelationToSurface( ofstream * const file, const CorrelationToSurfaceMap * const map ); 58 58 59 59 … … 90 90 /** Puts given correlation data into bins of given size (histogramming). 91 91 * Note that BinStart and BinEnd are desired to fill the complete range, even where Bins are zero. If this is 92 * not desired, give equal BinStart and BinEnd and the map will contain only Bins where the count is one or greater. 92 * not desired, give equal BinStart and BinEnd and the map will contain only Bins where the count is one or greater. If a 93 * certain start value is desired, give BinStart and a BinEnd that is smaller than BinStart, then only BinEnd will be 94 * calculated automatically, i.e. BinStart = 0. and BinEnd = -1. . 93 95 * Also note that the range is given inclusive, i.e. [ BinStart, BinEnd ]. 94 96 * \param *map map of doubles to count … … 114 116 if (BinStart == BinEnd) { // if same, find range ourselves 115 117 GetMinMax( map, start, end); 116 } else { // if not, initialise range to zero 118 } else if (BinEnd < BinStart) { // if BinEnd smaller, just look for new max 119 GetMinMax( map, start, end); 120 start = BinStart; 121 } else { // else take both values 117 122 start = BinStart; 118 123 end = BinEnd; -
src/analyzer.cpp
rbd61b41 r271e17 7 7 8 8 //============================ INCLUDES =========================== 9 10 #include <cstring> 9 11 10 12 #include "datacreator.hpp" -
src/bondgraph.cpp
rbd61b41 r271e17 11 11 #include "bondgraph.hpp" 12 12 #include "element.hpp" 13 #include "info.hpp" 13 14 #include "log.hpp" 14 15 #include "molecule.hpp" … … 42 43 bool BondGraph::LoadBondLengthTable(const string &filename) 43 44 { 45 Info FunctionInfo(__func__); 44 46 bool status = true; 45 47 MatrixContainer *TempContainer = NULL; … … 53 55 54 56 // parse in matrix 55 status = TempContainer->ParseMatrix(filename.c_str(), 0, 1, 0); 57 if (status = TempContainer->ParseMatrix(filename.c_str(), 0, 1, 0)) { 58 Log() << Verbose(1) << "Parsing bond length matrix successful." << endl; 59 } else { 60 eLog() << Verbose(1) << "Parsing bond length matrix failed." << endl; 61 } 56 62 57 63 // find greatest distance -
src/boundary.cpp
rbd61b41 r271e17 19 19 20 20 #include<gsl/gsl_poly.h> 21 #include<time.h> 21 22 22 23 // ========================================== F U N C T I O N S ================================= … … 654 655 * \param *out output stream for debugging 655 656 * \param *mol molecule with atoms and bonds 656 * \param * &TesselStruct Tesselation with boundary triangles657 * \param *TesselStruct Tesselation with boundary triangles 657 658 * \param *filename prefix of filename 658 659 * \param *extraSuffix intermediate suffix 659 660 */ 660 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * &TesselStruct, const char *filename, const char *extraSuffix)661 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * const TesselStruct, const char *filename, const char *extraSuffix) 661 662 { 662 663 Info FunctionInfo(__func__); … … 789 790 * \param configuration contains box dimensions 790 791 * \param distance[NDIM] distance between filling molecules in each direction 792 * \param boundary length of boundary zone between molecule and filling mollecules 793 * \param epsilon distance to surface which is not filled 791 794 * \param RandAtomDisplacement maximum distance for random displacement per atom 792 795 * \param RandMolDisplacement maximum distance for random displacement per filler molecule … … 794 797 * \return *mol pointer to new molecule with filled atoms 795 798 */ 796 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandomAtomDisplacement, double RandomMolDisplacement,bool DoRandomRotation)799 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation) 797 800 { 798 801 Info FunctionInfo(__func__); … … 817 820 for (MoleculeList::iterator ListRunner = List->ListOfMolecules.begin(); ListRunner != List->ListOfMolecules.end(); ListRunner++) { 818 821 Log() << Verbose(1) << "Pre-creating linked cell lists for molecule " << *ListRunner << "." << endl; 819 LCList[i] = new LinkedCell((*ListRunner), 5.); // get linked cell list 820 if (TesselStruct[i] == NULL) { 821 Log() << Verbose(1) << "Pre-creating tesselation for molecule " << *ListRunner << "." << endl; 822 FindNonConvexBorder((*ListRunner), TesselStruct[i], (const LinkedCell *&)LCList[i], 5., NULL); 823 } 822 LCList[i] = new LinkedCell((*ListRunner), 10.); // get linked cell list 823 Log() << Verbose(1) << "Pre-creating tesselation for molecule " << *ListRunner << "." << endl; 824 TesselStruct[i] = NULL; 825 FindNonConvexBorder((*ListRunner), TesselStruct[i], (const LinkedCell *&)LCList[i], 5., NULL); 824 826 i++; 825 827 } … … 835 837 FillerDistance.Init(distance[0], distance[1], distance[2]); 836 838 FillerDistance.InverseMatrixMultiplication(M); 837 Log() << Verbose(1) << "INFO: Grid steps are "; 838 for(int i=0;i<NDIM;i++) { 839 for(int i=0;i<NDIM;i++) 839 840 N[i] = (int) ceil(1./FillerDistance.x[i]); 840 Log() << Verbose(1) << N[i]; 841 if (i != NDIM-1) 842 Log() << Verbose(1)<< ", "; 843 else 844 Log() << Verbose(1) << "." << endl; 845 } 841 Log() << Verbose(1) << "INFO: Grid steps are " << N[0] << ", " << N[1] << ", " << N[2] << "." << endl; 842 843 // initialize seed of random number generator to current time 844 srand ( time(NULL) ); 846 845 847 846 // go over [0,1]^3 filler grid … … 859 858 // get linked cell list 860 859 if (TesselStruct[i] == NULL) { 861 eLog() << Verbose( 1) << "TesselStruct of " << (*ListRunner) << " is NULL. Didn't we pre-create it?" << endl;860 eLog() << Verbose(0) << "TesselStruct of " << (*ListRunner) << " is NULL. Didn't we pre-create it?" << endl; 862 861 FillIt = false; 863 862 } else { 864 FillIt = FillIt && (!TesselStruct[i]->IsInnerPoint(CurrentPosition, LCList[i])); 863 const double distance = (TesselStruct[i]->GetDistanceSquaredToSurface(CurrentPosition, LCList[i])); 864 FillIt = FillIt && (distance > boundary*boundary); 865 if (FillIt) { 866 Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is outer point." << endl; 867 } else { 868 Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is inner point or within boundary." << endl; 869 break; 870 } 865 871 i++; 866 872 } … … 931 937 } 932 938 Free(&M); 939 940 // output to file 941 TesselStruct[0]->LastTriangle = NULL; 942 StoreTrianglesinFile(Filling, TesselStruct[0], "Tesselated", ".dat"); 943 933 944 for (size_t i=0;i<List->ListOfMolecules.size();i++) { 934 945 delete(LCList[i]); -
src/boundary.hpp
rbd61b41 r271e17 49 49 50 50 double ConvexizeNonconvexEnvelope(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename); 51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandAtomDisplacement, double RandMolDisplacement,bool DoRandomRotation);51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation); 52 52 void FindConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *LCList, const char *filename); 53 53 Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol); … … 58 58 void PrepareClustersinWater(config *configuration, molecule *mol, double ClusterVolume, double celldensity); 59 59 bool RemoveAllBoundaryPoints(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename); 60 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * &TesselStruct, const char *filename, const char *extraSuffix);60 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * const TesselStruct, const char *filename, const char *extraSuffix); 61 61 double VolumeOfConvexEnvelope(class Tesselation *TesselStruct, class config *configuration); 62 62 -
src/builder.cpp
rbd61b41 r271e17 49 49 50 50 using namespace std; 51 52 #include <cstring> 51 53 52 54 #include "analysis_correlation.hpp" … … 1415 1417 Log() << Verbose(0) << "\t-e <file>\tSets the databases path to be parsed (default: ./)." << endl; 1416 1418 Log() << Verbose(0) << "\t-E <id> <Z>\tChange atom <id>'s element to <Z>, <id> begins at 0." << endl; 1417 Log() << Verbose(0) << "\t-f /F<dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl;1418 Log() << Verbose(0) << "\t-F \tFilling Box with water molecules." << endl;1419 Log() << Verbose(0) << "\t-f <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl; 1420 Log() << Verbose(0) << "\t-F <dist_x> <dist_y> <dist_z> <epsilon> <randatom> <randmol> <DoRotate>\tFilling Box with water molecules." << endl; 1419 1421 Log() << Verbose(0) << "\t-g <file>\tParses a bond length table from the given file." << endl; 1420 1422 Log() << Verbose(0) << "\t-h/-H/-?\tGive this help screen." << endl; … … 1549 1551 if (configuration.BG == NULL) { 1550 1552 configuration.BG = new BondGraph(configuration.GetIsAngstroem()); 1551 if (( BondGraphFileName.empty()) && (configuration.BG->LoadBondLengthTable(BondGraphFileName))) {1553 if ((!BondGraphFileName.empty()) && (configuration.BG->LoadBondLengthTable(BondGraphFileName))) { 1552 1554 Log() << Verbose(0) << "Bond length table loaded successfully." << endl; 1553 1555 } else { … … 1658 1660 Log() << Verbose(1) << "Dissecting molecular system into a set of disconnected subgraphs ... " << endl; 1659 1661 // @TODO rather do the dissection afterwards 1660 molecules->DissectMoleculeIntoConnectedSubgraphs( mol,&configuration);1662 molecules->DissectMoleculeIntoConnectedSubgraphs(periode, &configuration); 1661 1663 mol = NULL; 1662 1664 if (molecules->ListOfMolecules.size() != 0) { … … 1706 1708 int ranges[NDIM] = {1,1,1}; 1707 1709 CorrelationToSurfaceMap *surfacemap = PeriodicCorrelationToSurface( molecules, elemental, TesselStruct, LCList, ranges ); 1710 OutputCorrelationToSurface(&output, surfacemap); 1708 1711 BinPairMap *binmap = BinData( surfacemap, 0.5, 0., 0. ); 1709 1712 OutputCorrelation ( &binoutput, binmap ); … … 1736 1739 if (argptr+6 >=argc) { 1737 1740 ExitFlag = 255; 1738 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> < epsilon> <randatom> <randmol> <DoRotate>" << endl;1741 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> <boundary> <randatom> <randmol> <DoRotate>" << endl; 1739 1742 performCriticalExit(); 1740 1743 } else { … … 1742 1745 Log() << Verbose(1) << "Filling Box with water molecules." << endl; 1743 1746 // construct water molecule 1744 molecule *filler = new molecule(periode); ;1747 molecule *filler = new molecule(periode); 1745 1748 molecule *Filling = NULL; 1746 1749 atom *second = NULL, *third = NULL; 1750 // first = new atom(); 1751 // first->type = periode->FindElement(5); 1752 // first->x.Zero(); 1753 // filler->AddAtom(first); 1747 1754 first = new atom(); 1748 first->type = periode->FindElement( 5);1749 first->x. Zero();1755 first->type = periode->FindElement(1); 1756 first->x.Init(0.441, -0.143, 0.); 1750 1757 filler->AddAtom(first); 1751 // first = new atom(); 1752 // first->type = periode->FindElement(1); 1753 // first->x.Init(0.441, -0.143, 0.); 1754 // filler->AddAtom(first); 1755 // second = new atom(); 1756 // second->type = periode->FindElement(1); 1757 // second->x.Init(-0.464, 1.137, 0.0); 1758 // filler->AddAtom(second); 1759 // third = new atom(); 1760 // third->type = periode->FindElement(8); 1761 // third->x.Init(-0.464, 0.177, 0.); 1762 // filler->AddAtom(third); 1763 // filler->AddBond(first, third, 1); 1764 // filler->AddBond(second, third, 1); 1758 second = new atom(); 1759 second->type = periode->FindElement(1); 1760 second->x.Init(-0.464, 1.137, 0.0); 1761 filler->AddAtom(second); 1762 third = new atom(); 1763 third->type = periode->FindElement(8); 1764 third->x.Init(-0.464, 0.177, 0.); 1765 filler->AddAtom(third); 1766 filler->AddBond(first, third, 1); 1767 filler->AddBond(second, third, 1); 1765 1768 // call routine 1766 1769 double distance[NDIM]; -
src/config.cpp
rbd61b41 r271e17 6 6 7 7 #include <stdio.h> 8 #include <cstring> 8 9 9 10 #include "atom.hpp" … … 27 28 char number1[8]; 28 29 char number2[8]; 29 c har *dummy1, *dummy2;30 const char *dummy1, *dummy2; 30 31 //Log() << Verbose(0) << s1 << " " << s2 << endl; 31 32 dummy1 = strchr(s1, '_')+sizeof(char)*5; // go just after "Ion_Type" … … 2123 2124 } 2124 2125 line++; 2125 } while ( dummy1 != NULL && (dummy1[0] == '#') || (dummy1[0] == '\n'));2126 } while ((dummy1 != NULL) && ((dummy1[0] == '#') || (dummy1[0] == '\n'))); 2126 2127 dummy = dummy1; 2127 2128 } else { // simple int, strings or doubles start in the same line -
src/helpers.hpp
rbd61b41 r271e17 74 74 x = y; 75 75 y = tmp; 76 }; 77 78 /** returns greater of the two values. 79 * \param x first value 80 * \param y second value 81 * \return greater of the two (by operator>()) 82 */ 83 template <typename T> T Max(T x, T y) 84 { 85 if (x > y) 86 return x; 87 else return y; 88 }; 89 90 /** returns smaller of the two values. 91 * \param x first value 92 * \param y second value 93 * \return smaller of the two (by operator<()) 94 */ 95 template <typename T> T Min(T x, T y) 96 { 97 if (x < y) 98 return x; 99 else return y; 76 100 }; 77 101 -
src/joiner.cpp
rbd61b41 r271e17 7 7 8 8 //============================ INCLUDES =========================== 9 10 #include <cstring> 9 11 10 12 #include "datacreator.hpp" -
src/memoryallocator.hpp
rbd61b41 r271e17 16 16 #endif 17 17 18 #include <cstdlib> 18 19 #include <iostream> 19 20 #include <iomanip> -
src/memoryusageobserver.cpp
rbd61b41 r271e17 4 4 * This class represents a Singleton for observing memory usage. 5 5 */ 6 7 #include <cstdlib> 6 8 7 9 #include "log.hpp" -
src/molecule.cpp
rbd61b41 r271e17 4 4 * 5 5 */ 6 7 #include <cstring> 6 8 7 9 #include "atom.hpp" … … 587 589 else 588 590 molname = filename; // contains no slashes 589 c har *endname = strchr(molname, '.');591 const char *endname = strchr(molname, '.'); 590 592 if ((endname == NULL) || (endname < molname)) 591 593 length = strlen(molname); -
src/molecule.hpp
rbd61b41 r271e17 110 110 TesselPoint *GetPoint() const ; 111 111 TesselPoint *GetTerminalPoint() const ; 112 int GetMaxId() const; 112 113 void GoToNext() const ; 113 114 void GoToPrevious() const ; … … 322 323 void Enumerate(ofstream *out); 323 324 void Output(ofstream *out); 324 void DissectMoleculeIntoConnectedSubgraphs( molecule * const mol, config * const configuration);325 void DissectMoleculeIntoConnectedSubgraphs(const periodentafel * const periode, config * const configuration); 325 326 int CountAllAtoms() const; 326 327 -
src/molecule_dynamics.cpp
rbd61b41 r271e17 370 370 371 371 // argument minimise the constrained potential in this injective PermutationMap 372 Log() << Verbose(1) << "Argument minimising the PermutationMap , at current potential " << OldPotential << " ..." << endl;372 Log() << Verbose(1) << "Argument minimising the PermutationMap." << endl; 373 373 OldPotential = 1e+10; 374 374 round = 0; 375 375 do { 376 Log() << Verbose(2) << "Starting round " << ++round << " ... " << endl;376 Log() << Verbose(2) << "Starting round " << ++round << ", at current potential " << OldPotential << " ... " << endl; 377 377 OlderPotential = OldPotential; 378 378 do { -
src/molecule_fragmentation.cpp
rbd61b41 r271e17 5 5 * Author: heber 6 6 */ 7 8 #include <cstring> 7 9 8 10 #include "atom.hpp" -
src/molecule_pointcloud.cpp
rbd61b41 r271e17 50 50 }; 51 51 52 /** Return the greatest index of all atoms in the list. 53 * \return greatest index 54 */ 55 int molecule::GetMaxId() const 56 { 57 return last_atom; 58 }; 59 52 60 /** Go to next atom. 53 61 * Stops at last one. -
src/moleculelist.cpp
rbd61b41 r271e17 4 4 * 5 5 */ 6 7 #include <cstring> 6 8 7 9 #include "atom.hpp" … … 739 741 /** Dissects given \a *mol into connected subgraphs and inserts them as new molecules but with old atoms into \a this. 740 742 * \param *out output stream for debugging 741 * \param * mol molecule with atoms to dissect743 * \param *periode periodentafel 742 744 * \param *configuration config with BondGraph 743 745 */ 744 void MoleculeListClass::DissectMoleculeIntoConnectedSubgraphs(molecule * const mol, config * const configuration) 745 { 746 void MoleculeListClass::DissectMoleculeIntoConnectedSubgraphs(const periodentafel * const periode, config * const configuration) 747 { 748 molecule *mol = new molecule(periode); 749 atom *Walker = NULL; 750 atom *Advancer = NULL; 751 bond *Binder = NULL; 752 bond *Stepper = NULL; 753 // 0. gather all atoms into single molecule 754 for (MoleculeList::iterator MolRunner = ListOfMolecules.begin(); !ListOfMolecules.empty(); MolRunner = ListOfMolecules.begin()) { 755 // shift all atoms to new molecule 756 Advancer = (*MolRunner)->start->next; 757 while (Advancer != (*MolRunner)->end) { 758 Walker = Advancer; 759 Advancer = Advancer->next; 760 Log() << Verbose(3) << "Re-linking " << *Walker << "..." << endl; 761 unlink(Walker); 762 Walker->father = Walker; 763 mol->AddAtom(Walker); // counting starts at 1 764 } 765 // remove all bonds 766 Stepper = (*MolRunner)->first->next; 767 while (Stepper != (*MolRunner)->last) { 768 Binder = Stepper; 769 Stepper = Stepper->next; 770 delete(Binder); 771 } 772 // remove the molecule 773 delete(*MolRunner); 774 ListOfMolecules.erase(MolRunner); 775 } 776 746 777 // 1. dissect the molecule into connected subgraphs 747 778 configuration->BG->ConstructBondGraph(mol); … … 777 808 int *MolMap = Calloc<int>(mol->AtomCount, "config::Load() - *MolMap"); 778 809 MoleculeLeafClass *MolecularWalker = Subgraphs; 779 atom *Walker = NULL;810 Walker = NULL; 780 811 while (MolecularWalker->next != NULL) { 781 812 MolecularWalker = MolecularWalker->next; … … 807 838 } 808 839 // 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 809 bond *Binder = mol->first;840 Binder = mol->first; 810 841 while (mol->first->next != mol->last) { 811 842 Binder = mol->first->next; -
src/parser.cpp
rbd61b41 r271e17 6 6 7 7 // ======================================= INCLUDES ========================================== 8 9 #include <cstring> 8 10 9 11 #include "helpers.hpp" … … 156 158 157 159 input.open(name, ios::in); 158 //Log() << Verbose( 0) << "Opening " << name << " ... " << input << endl;160 //Log() << Verbose(1) << "Opening " << name << " ... " << input << endl; 159 161 if (input == NULL) { 160 162 eLog() << Verbose(1) << endl << "Unable to open " << name << ", is the directory correct?" << endl; … … 179 181 } 180 182 //Log() << Verbose(0) << line.str() << endl; 181 //Log() << Verbose( 0) << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << "." << endl;183 //Log() << Verbose(1) << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << "." << endl; 182 184 if (ColumnCounter[MatrixNr] == 0) { 183 185 eLog() << Verbose(0) << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; … … 195 197 } 196 198 } 197 //Log() << Verbose( 0) << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << "." << endl;199 //Log() << Verbose(1) << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << "." << endl; 198 200 if (RowCounter[MatrixNr] == 0) { 199 201 eLog() << Verbose(0) << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; … … 218 220 input.getline(filename, 1023); 219 221 stringstream lines(filename); 220 //Log() << Verbose( 0) << "Matrix at level " << j << ":";// << filename << endl;222 //Log() << Verbose(2) << "Matrix at level " << j << ":";// << filename << endl; 221 223 for(int k=skipcolumns;k--;) 222 224 lines >> filename; 223 225 for(int k=0;(k<ColumnCounter[MatrixNr]) && (!lines.eof());k++) { 224 226 lines >> Matrix[MatrixNr][j][k]; 225 //Log() << Verbose( 0) << " " << setprecision(2) << Matrix[MatrixNr][j][k];;227 //Log() << Verbose(1) << " " << setprecision(2) << Matrix[MatrixNr][j][k] << endl; 226 228 } 227 //Log() << Verbose(0) << endl;228 229 Matrix[MatrixNr][ RowCounter[MatrixNr] ] = Malloc<double>(ColumnCounter[MatrixNr], "MatrixContainer::ParseMatrix: *Matrix[RowCounter[MatrixNr]][]"); 229 230 for(int j=ColumnCounter[MatrixNr];j--;) -
src/periodentafel.cpp
rbd61b41 r271e17 9 9 #include <iomanip> 10 10 #include <fstream> 11 #include <cstring> 11 12 12 13 #include "element.hpp" -
src/tesselation.cpp
rbd61b41 r271e17 35 35 * \param *Walker TesselPoint this boundary point represents 36 36 */ 37 BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker) :37 BoundaryPointSet::BoundaryPointSet(TesselPoint * const Walker) : 38 38 LinesCount(0), 39 39 node(Walker), … … 61 61 * \param *line line to add 62 62 */ 63 void BoundaryPointSet::AddLine( class BoundaryLineSet *line)63 void BoundaryPointSet::AddLine(BoundaryLineSet * const line) 64 64 { 65 65 Info FunctionInfo(__func__); … … 105 105 * \param number number of the list 106 106 */ 107 BoundaryLineSet::BoundaryLineSet( class BoundaryPointSet *Point[2], const int number)107 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point[2], const int number) 108 108 { 109 109 Info FunctionInfo(__func__); … … 115 115 Point[0]->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 116 116 Point[1]->AddLine(this); // 117 // set skipped to false 118 skipped = false; 119 // clear triangles list 120 Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl; 121 }; 122 123 /** Constructor of BoundaryLineSet with two endpoints. 124 * Adds line automatically to each endpoints' LineMap 125 * \param *Point1 first boundary point 126 * \param *Point2 second boundary point 127 * \param number number of the list 128 */ 129 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number) 130 { 131 Info FunctionInfo(__func__); 132 // set number 133 Nr = number; 134 // set endpoints in ascending order 135 SetEndpointsOrdered(endpoints, Point1, Point2); 136 // add this line to the hash maps of both endpoints 137 Point1->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 138 Point2->AddLine(this); // 117 139 // set skipped to false 118 140 skipped = false; … … 171 193 * \param *triangle to add 172 194 */ 173 void BoundaryLineSet::AddTriangle( class BoundaryTriangleSet *triangle)195 void BoundaryLineSet::AddTriangle(BoundaryTriangleSet * const triangle) 174 196 { 175 197 Info FunctionInfo(__func__); … … 182 204 * \return true - common endpoint present, false - not connected 183 205 */ 184 bool BoundaryLineSet::IsConnectedTo(c lass BoundaryLineSet *line)206 bool BoundaryLineSet::IsConnectedTo(const BoundaryLineSet * const line) const 185 207 { 186 208 Info FunctionInfo(__func__); … … 197 219 * \return true - triangles are convex, false - concave or less than two triangles connected 198 220 */ 199 bool BoundaryLineSet::CheckConvexityCriterion() 221 bool BoundaryLineSet::CheckConvexityCriterion() const 200 222 { 201 223 Info FunctionInfo(__func__); … … 221 243 int i=0; 222 244 class BoundaryPointSet *node = NULL; 223 for(TriangleMap:: iterator runner = triangles.begin(); runner != triangles.end(); runner++) {245 for(TriangleMap::const_iterator runner = triangles.begin(); runner != triangles.end(); runner++) { 224 246 //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl; 225 247 NormalCheck.AddVector(&runner->second->NormalVector); … … 264 286 * \return true - point is of the line, false - is not 265 287 */ 266 bool BoundaryLineSet::ContainsBoundaryPoint(c lass BoundaryPointSet *point)288 bool BoundaryLineSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 267 289 { 268 290 Info FunctionInfo(__func__); … … 277 299 * \return NULL - if endpoint not contained in BoundaryLineSet, or pointer to BoundaryPointSet otherwise 278 300 */ 279 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(c lass BoundaryPointSet *point)301 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(const BoundaryPointSet * const point) const 280 302 { 281 303 Info FunctionInfo(__func__); … … 317 339 * \param number number of triangle 318 340 */ 319 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * line[3],int number) :341 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number) : 320 342 Nr(number) 321 343 { … … 376 398 * \param &OtherVector direction vector to make normal vector unique. 377 399 */ 378 void BoundaryTriangleSet::GetNormalVector( Vector &OtherVector)400 void BoundaryTriangleSet::GetNormalVector(const Vector &OtherVector) 379 401 { 380 402 Info FunctionInfo(__func__); … … 388 410 }; 389 411 390 /** Finds the point on the triangle \a *BTS th e line defined by \a *MolCenter and \a *x crosses through.412 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses. 391 413 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane 392 * Th is we test if it's really on the plane and whether it's inside the triangle on the plane or not.414 * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not. 393 415 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line 394 416 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between … … 400 422 * \return true - \a *Intersection contains intersection on plane defined by triangle, false - zero vector if outside of triangle. 401 423 */ 402 bool BoundaryTriangleSet::GetIntersectionInsideTriangle( Vector *MolCenter, Vector *x, Vector *Intersection)403 { 404 424 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const 425 { 426 Info FunctionInfo(__func__); 405 427 Vector CrossPoint; 406 428 Vector helper; … … 411 433 } 412 434 435 Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl; 436 Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl; 437 Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl; 438 439 if (Intersection->DistanceSquared(endpoints[0]->node->node) < MYEPSILON) { 440 Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl; 441 return true; 442 } else if (Intersection->DistanceSquared(endpoints[1]->node->node) < MYEPSILON) { 443 Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl; 444 return true; 445 } else if (Intersection->DistanceSquared(endpoints[2]->node->node) < MYEPSILON) { 446 Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl; 447 return true; 448 } 413 449 // Calculate cross point between one baseline and the line from the third endpoint to intersection 414 450 int i=0; … … 417 453 helper.CopyVector(endpoints[(i+1)%3]->node->node); 418 454 helper.SubtractVector(endpoints[i%3]->node->node); 455 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 456 const double s = CrossPoint.ScalarProduct(&helper)/helper.NormSquared(); 457 Log() << Verbose(1) << "INFO: Factor s is " << s << "." << endl; 458 if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) { 459 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl; 460 i=4; 461 break; 462 } 463 i++; 419 464 } else 420 i++;421 if (i>2)422 465 break; 423 } while ( CrossPoint.NormSquared() < MYEPSILON);466 } while (i<3); 424 467 if (i==3) { 425 eLog() << Verbose(0) << "Could not find any cross points, something's utterly wrong here!" << endl; 426 } 427 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 428 429 // check whether intersection is inside or not by comparing length of intersection and length of cross point 430 if ((CrossPoint.NormSquared() - helper.NormSquared()) < MYEPSILON) { // inside 468 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl; 431 469 return true; 432 } else { // outside!433 Intersection->Zero();470 } else { 471 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl; 434 472 return false; 435 473 } 474 }; 475 476 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses. 477 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane 478 * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not. 479 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line 480 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between 481 * the first two basepoints) or not. 482 * \param *x point 483 * \param *ClosestPoint desired closest point inside triangle to \a *x, is absolute vector 484 * \return Distance squared between \a *x and closest point inside triangle 485 */ 486 double BoundaryTriangleSet::GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const 487 { 488 Info FunctionInfo(__func__); 489 Vector Direction; 490 491 // 1. get intersection with plane 492 Log() << Verbose(1) << "INFO: Looking for closest point of triangle " << *this << " to " << *x << "." << endl; 493 GetCenter(&Direction); 494 if (!ClosestPoint->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, x, &Direction)) { 495 ClosestPoint->CopyVector(x); 496 } 497 498 // 2. Calculate in plane part of line (x, intersection) 499 Vector InPlane; 500 InPlane.CopyVector(x); 501 InPlane.SubtractVector(ClosestPoint); // points from plane intersection to straight-down point 502 InPlane.ProjectOntoPlane(&NormalVector); 503 InPlane.AddVector(ClosestPoint); 504 505 Log() << Verbose(2) << "INFO: Triangle is " << *this << "." << endl; 506 Log() << Verbose(2) << "INFO: Line is from " << Direction << " to " << *x << "." << endl; 507 Log() << Verbose(2) << "INFO: In-plane part is " << InPlane << "." << endl; 508 509 // Calculate cross point between one baseline and the desired point such that distance is shortest 510 double ShortestDistance = -1.; 511 bool InsideFlag = false; 512 Vector CrossDirection[3]; 513 Vector CrossPoint[3]; 514 Vector helper; 515 for (int i=0;i<3;i++) { 516 // treat direction of line as normal of a (cut)plane and the desired point x as the plane offset, the intersect line with point 517 Direction.CopyVector(endpoints[(i+1)%3]->node->node); 518 Direction.SubtractVector(endpoints[i%3]->node->node); 519 // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal); 520 CrossPoint[i].GetIntersectionWithPlane(&Direction, &InPlane, endpoints[i%3]->node->node, endpoints[(i+1)%3]->node->node); 521 CrossDirection[i].CopyVector(&CrossPoint[i]); 522 CrossDirection[i].SubtractVector(&InPlane); 523 CrossPoint[i].SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 524 const double s = CrossPoint[i].ScalarProduct(&Direction)/Direction.NormSquared(); 525 Log() << Verbose(2) << "INFO: Factor s is " << s << "." << endl; 526 if ((s >= -MYEPSILON) && ((s-1.) <= MYEPSILON)) { 527 CrossPoint[i].AddVector(endpoints[i%3]->node->node); // make cross point absolute again 528 Log() << Verbose(2) << "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << *endpoints[i%3]->node->node << " and " << *endpoints[(i+1)%3]->node->node << "." << endl; 529 const double distance = CrossPoint[i].DistanceSquared(x); 530 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 531 ShortestDistance = distance; 532 ClosestPoint->CopyVector(&CrossPoint[i]); 533 } 534 } else 535 CrossPoint[i].Zero(); 536 } 537 InsideFlag = true; 538 for (int i=0;i<3;i++) { 539 const double sign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+1)%3]); 540 const double othersign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+2)%3]);; 541 if ((sign > -MYEPSILON) && (othersign > -MYEPSILON)) // have different sign 542 InsideFlag = false; 543 } 544 if (InsideFlag) { 545 ClosestPoint->CopyVector(&InPlane); 546 ShortestDistance = InPlane.DistanceSquared(x); 547 } else { // also check endnodes 548 for (int i=0;i<3;i++) { 549 const double distance = x->DistanceSquared(endpoints[i]->node->node); 550 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 551 ShortestDistance = distance; 552 ClosestPoint->CopyVector(endpoints[i]->node->node); 553 } 554 } 555 } 556 Log() << Verbose(1) << "INFO: Closest Point is " << *ClosestPoint << " with shortest squared distance is " << ShortestDistance << "." << endl; 557 return ShortestDistance; 436 558 }; 437 559 … … 440 562 * \return true - line is of the triangle, false - is not 441 563 */ 442 bool BoundaryTriangleSet::ContainsBoundaryLine(c lass BoundaryLineSet *line)564 bool BoundaryTriangleSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const 443 565 { 444 566 Info FunctionInfo(__func__); … … 453 575 * \return true - point is of the triangle, false - is not 454 576 */ 455 bool BoundaryTriangleSet::ContainsBoundaryPoint(c lass BoundaryPointSet *point)577 bool BoundaryTriangleSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 456 578 { 457 579 Info FunctionInfo(__func__); … … 466 588 * \return true - point is of the triangle, false - is not 467 589 */ 468 bool BoundaryTriangleSet::ContainsBoundaryPoint(c lass TesselPoint *point)590 bool BoundaryTriangleSet::ContainsBoundaryPoint(const TesselPoint * const point) const 469 591 { 470 592 Info FunctionInfo(__func__); … … 479 601 * \return true - is the very triangle, false - is not 480 602 */ 481 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3]) 482 { 483 Info FunctionInfo(__func__); 603 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryPointSet * const Points[3]) const 604 { 605 Info FunctionInfo(__func__); 606 Log() << Verbose(1) << "INFO: Checking " << Points[0] << "," << Points[1] << "," << Points[2] << " against " << endpoints[0] << "," << endpoints[1] << "," << endpoints[2] << "." << endl; 484 607 return (((endpoints[0] == Points[0]) 485 608 || (endpoints[0] == Points[1]) … … 501 624 * \return true - is the very triangle, false - is not 502 625 */ 503 bool BoundaryTriangleSet::IsPresentTupel(c lass BoundaryTriangleSet *T)626 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryTriangleSet * const T) const 504 627 { 505 628 Info FunctionInfo(__func__); … … 523 646 * \return pointer third endpoint or NULL if line does not belong to triangle. 524 647 */ 525 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(c lass BoundaryLineSet *line)648 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(const BoundaryLineSet * const line) const 526 649 { 527 650 Info FunctionInfo(__func__); … … 540 663 * \param *center central point on return. 541 664 */ 542 void BoundaryTriangleSet::GetCenter(Vector * center)665 void BoundaryTriangleSet::GetCenter(Vector * const center) const 543 666 { 544 667 Info FunctionInfo(__func__); … … 547 670 center->AddVector(endpoints[i]->node->node); 548 671 center->Scale(1./3.); 672 Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl; 549 673 } 550 674 … … 815 939 TesselPoint::TesselPoint() 816 940 { 817 Info FunctionInfo(__func__);941 //Info FunctionInfo(__func__); 818 942 node = NULL; 819 943 nr = -1; … … 825 949 TesselPoint::~TesselPoint() 826 950 { 827 Info FunctionInfo(__func__);951 //Info FunctionInfo(__func__); 828 952 }; 829 953 … … 852 976 PointCloud::PointCloud() 853 977 { 854 Info FunctionInfo(__func__);978 //Info FunctionInfo(__func__); 855 979 }; 856 980 … … 859 983 PointCloud::~PointCloud() 860 984 { 861 Info FunctionInfo(__func__);985 //Info FunctionInfo(__func__); 862 986 }; 863 987 … … 1050 1174 * \param PointsOnBoundary set of boundary points defining the convex envelope of the cluster 1051 1175 */ 1052 void 1053 Tesselation::GuessStartingTriangle() 1176 void Tesselation::GuessStartingTriangle() 1054 1177 { 1055 1178 Info FunctionInfo(__func__); … … 1422 1545 TesselPoint *Walker = NULL; 1423 1546 Vector *Center = cloud->GetCenter(); 1424 list<BoundaryTriangleSet*>*triangles = NULL;1547 TriangleList *triangles = NULL; 1425 1548 bool AddFlag = false; 1426 1549 LinkedCell *BoundaryPoints = NULL; … … 1437 1560 Log() << Verbose(0) << "Current point is " << *Walker << "." << endl; 1438 1561 // get the next triangle 1439 triangles = FindClosestTrianglesTo Point(Walker->node, BoundaryPoints);1562 triangles = FindClosestTrianglesToVector(Walker->node, BoundaryPoints); 1440 1563 BTS = triangles->front(); 1441 1564 if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) { … … 2338 2461 2339 2462 // fill the set of neighbours 2340 Center.CopyVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2341 Center.SubtractVector(TurningPoint->node); 2342 set<TesselPoint*> SetOfNeighbours; 2463 TesselPointSet SetOfNeighbours; 2343 2464 SetOfNeighbours.insert(CandidateLine.BaseLine->endpoints[1]->node); 2344 2465 for (TesselPointList::iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); Runner++) 2345 2466 SetOfNeighbours.insert(*Runner); 2346 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, &Center);2467 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, CandidateLine.BaseLine->endpoints[1]->node->node); 2347 2468 2348 2469 // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles) 2470 Log() << Verbose(0) << "List of Candidates for Turning Point: " << *TurningPoint << "." << endl; 2471 for (TesselPointList::iterator TesselRunner = connectedClosestPoints->begin(); TesselRunner != connectedClosestPoints->end(); ++TesselRunner) 2472 Log() << Verbose(0) << **TesselRunner << endl; 2349 2473 TesselPointList::iterator Runner = connectedClosestPoints->begin(); 2350 2474 TesselPointList::iterator Sprinter = Runner; … … 2356 2480 AddTesselationPoint((*Sprinter), 2); 2357 2481 2358 2359 2482 // add the lines 2360 2483 AddTesselationLine(TPS[0], TPS[1], 0); … … 2373 2496 Runner = Sprinter; 2374 2497 Sprinter++; 2498 Log() << Verbose(0) << "Current Runner is " << **Runner << "." << endl; 2499 if (Sprinter != connectedClosestPoints->end()) 2500 Log() << Verbose(0) << " There are still more triangles to add." << endl; 2375 2501 } 2376 2502 delete(connectedClosestPoints); … … 2957 3083 const BoundaryLineSet * lines[2] = { line1, line2 }; 2958 3084 class BoundaryPointSet *node = NULL; 2959 map<int, class BoundaryPointSet *>OrderMap;2960 pair<map<int, class BoundaryPointSet *>::iterator, bool>OrderTest;3085 PointMap OrderMap; 3086 PointTestPair OrderTest; 2961 3087 for (int i = 0; i < 2; i++) 2962 3088 // for both lines … … 2978 3104 }; 2979 3105 3106 /** Finds the boundary points that are closest to a given Vector \a *x. 3107 * \param *out output stream for debugging 3108 * \param *x Vector to look from 3109 * \return map of BoundaryPointSet of closest points sorted by squared distance or NULL. 3110 */ 3111 DistanceToPointMap * Tesselation::FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const 3112 { 3113 Info FunctionInfo(__func__); 3114 PointMap::const_iterator FindPoint; 3115 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; 3116 3117 if (LinesOnBoundary.empty()) { 3118 eLog() << Verbose(1) << "There is no tesselation structure to compare the point with, please create one first." << endl; 3119 return NULL; 3120 } 3121 3122 // gather all points close to the desired one 3123 LC->SetIndexToVector(x); // ignore status as we calculate bounds below sensibly 3124 for(int i=0;i<NDIM;i++) // store indices of this cell 3125 N[i] = LC->n[i]; 3126 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 3127 3128 DistanceToPointMap * points = new DistanceToPointMap; 3129 LC->GetNeighbourBounds(Nlower, Nupper); 3130 //Log() << Verbose(1) << endl; 3131 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 3132 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 3133 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 3134 const LinkedNodes *List = LC->GetCurrentCell(); 3135 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 3136 if (List != NULL) { 3137 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { 3138 FindPoint = PointsOnBoundary.find((*Runner)->nr); 3139 if (FindPoint != PointsOnBoundary.end()) { 3140 points->insert(DistanceToPointPair (FindPoint->second->node->node->DistanceSquared(x), FindPoint->second) ); 3141 Log() << Verbose(1) << "INFO: Putting " << *FindPoint->second << " into the list." << endl; 3142 } 3143 } 3144 } else { 3145 eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl; 3146 } 3147 } 3148 3149 // check whether we found some points 3150 if (points->empty()) { 3151 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 3152 delete(points); 3153 return NULL; 3154 } 3155 return points; 3156 }; 3157 3158 /** Finds the boundary line that is closest to a given Vector \a *x. 3159 * \param *out output stream for debugging 3160 * \param *x Vector to look from 3161 * \return closest BoundaryLineSet or NULL in degenerate case. 3162 */ 3163 BoundaryLineSet * Tesselation::FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const 3164 { 3165 Info FunctionInfo(__func__); 3166 3167 // get closest points 3168 DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC); 3169 if (points == NULL) { 3170 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 3171 return NULL; 3172 } 3173 3174 // for each point, check its lines, remember closest 3175 Log() << Verbose(1) << "Finding closest BoundaryLine to " << *x << " ... " << endl; 3176 BoundaryLineSet *ClosestLine = NULL; 3177 double MinDistance = -1.; 3178 Vector helper; 3179 Vector Center; 3180 Vector BaseLine; 3181 for (DistanceToPointMap::iterator Runner = points->begin(); Runner != points->end(); Runner++) { 3182 for (LineMap::iterator LineRunner = Runner->second->lines.begin(); LineRunner != Runner->second->lines.end(); LineRunner++) { 3183 // calculate closest point on line to desired point 3184 helper.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3185 helper.AddVector((LineRunner->second)->endpoints[1]->node->node); 3186 helper.Scale(0.5); 3187 Center.CopyVector(x); 3188 Center.SubtractVector(&helper); 3189 BaseLine.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3190 BaseLine.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3191 Center.ProjectOntoPlane(&BaseLine); 3192 const double distance = Center.NormSquared(); 3193 if ((ClosestLine == NULL) || (distance < MinDistance)) { 3194 // additionally calculate intersection on line (whether it's on the line section or not) 3195 helper.CopyVector(x); 3196 helper.SubtractVector((LineRunner->second)->endpoints[0]->node->node); 3197 helper.SubtractVector(&Center); 3198 const double lengthA = helper.ScalarProduct(&BaseLine); 3199 helper.CopyVector(x); 3200 helper.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3201 helper.SubtractVector(&Center); 3202 const double lengthB = helper.ScalarProduct(&BaseLine); 3203 if (lengthB*lengthA < 0) { // if have different sign 3204 ClosestLine = LineRunner->second; 3205 MinDistance = distance; 3206 Log() << Verbose(1) << "ACCEPT: New closest line is " << *ClosestLine << " with projected distance " << MinDistance << "." << endl; 3207 } else { 3208 Log() << Verbose(1) << "REJECT: Intersection is outside of the line section: " << lengthA << " and " << lengthB << "." << endl; 3209 } 3210 } else { 3211 Log() << Verbose(1) << "REJECT: Point is too further away than present line: " << distance << " >> " << MinDistance << "." << endl; 3212 } 3213 } 3214 } 3215 delete(points); 3216 // check whether closest line is "too close" :), then it's inside 3217 if (ClosestLine == NULL) { 3218 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 3219 return NULL; 3220 } 3221 return ClosestLine; 3222 }; 3223 3224 2980 3225 /** Finds the triangle that is closest to a given Vector \a *x. 2981 3226 * \param *out output stream for debugging 2982 3227 * \param *x Vector to look from 2983 * \return list of BoundaryTriangleSet of nearest triangles or NULL in degenerate case. 2984 */ 2985 list<BoundaryTriangleSet*> * Tesselation::FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const 2986 { 2987 Info FunctionInfo(__func__); 2988 TesselPoint *trianglePoints[3]; 2989 TesselPoint *SecondPoint = NULL; 2990 list<BoundaryTriangleSet*> *triangles = NULL; 2991 2992 if (LinesOnBoundary.empty()) { 2993 eLog() << Verbose(1) << "Error: There is no tesselation structure to compare the point with, please create one first."; 3228 * \return BoundaryTriangleSet of nearest triangle or NULL. 3229 */ 3230 TriangleList * Tesselation::FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const 3231 { 3232 Info FunctionInfo(__func__); 3233 3234 // get closest points 3235 DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC); 3236 if (points == NULL) { 3237 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 2994 3238 return NULL; 2995 3239 } 2996 Log() << Verbose(1) << "Finding closest Tesselpoint to " << *x << " ... " << endl; 2997 trianglePoints[0] = FindClosestPoint(x, SecondPoint, LC); 2998 2999 // check whether closest point is "too close" :), then it's inside 3000 if (trianglePoints[0] == NULL) { 3240 3241 // for each point, check its lines, remember closest 3242 Log() << Verbose(1) << "Finding closest BoundaryTriangle to " << *x << " ... " << endl; 3243 LineSet ClosestLines; 3244 double MinDistance = 1e+16; 3245 Vector BaseLineIntersection; 3246 Vector Center; 3247 Vector BaseLine; 3248 Vector BaseLineCenter; 3249 for (DistanceToPointMap::iterator Runner = points->begin(); Runner != points->end(); Runner++) { 3250 for (LineMap::iterator LineRunner = Runner->second->lines.begin(); LineRunner != Runner->second->lines.end(); LineRunner++) { 3251 3252 BaseLine.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3253 BaseLine.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3254 const double lengthBase = BaseLine.NormSquared(); 3255 3256 BaseLineIntersection.CopyVector(x); 3257 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[0]->node->node); 3258 const double lengthEndA = BaseLineIntersection.NormSquared(); 3259 3260 BaseLineIntersection.CopyVector(x); 3261 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3262 const double lengthEndB = BaseLineIntersection.NormSquared(); 3263 3264 if ((lengthEndA > lengthBase) || (lengthEndB > lengthBase) || ((lengthEndA < MYEPSILON) || (lengthEndB < MYEPSILON))) { // intersection would be outside, take closer endpoint 3265 const double lengthEnd = Min(lengthEndA, lengthEndB); 3266 if (lengthEnd - MinDistance < -MYEPSILON) { // new best line 3267 ClosestLines.clear(); 3268 ClosestLines.insert(LineRunner->second); 3269 MinDistance = lengthEnd; 3270 Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEnd << "." << endl; 3271 } else if (fabs(lengthEnd - MinDistance) < MYEPSILON) { // additional best candidate 3272 ClosestLines.insert(LineRunner->second); 3273 Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is equally good with " << lengthEnd << "." << endl; 3274 } else { // line is worse 3275 Log() << Verbose(1) << "REJECT: Line " << *LineRunner->second << " to either endpoints is further away than present closest line candidate: " << lengthEndA << ", " << lengthEndB << ", and distance is longer than baseline:" << lengthBase << "." << endl; 3276 } 3277 } else { // intersection is closer, calculate 3278 // calculate closest point on line to desired point 3279 BaseLineIntersection.CopyVector(x); 3280 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3281 Center.CopyVector(&BaseLineIntersection); 3282 Center.ProjectOntoPlane(&BaseLine); 3283 BaseLineIntersection.SubtractVector(&Center); 3284 const double distance = BaseLineIntersection.NormSquared(); 3285 if (Center.NormSquared() > BaseLine.NormSquared()) { 3286 eLog() << Verbose(0) << "Algorithmic error: In second case we have intersection outside of baseline!" << endl; 3287 } 3288 if ((ClosestLines.empty()) || (distance < MinDistance)) { 3289 ClosestLines.insert(LineRunner->second); 3290 MinDistance = distance; 3291 Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLines.begin() << " with projected distance " << MinDistance << "." << endl; 3292 } else { 3293 Log() << Verbose(2) << "REJECT: Point is further away from line " << *LineRunner->second << " than present closest line: " << distance << " >> " << MinDistance << "." << endl; 3294 } 3295 } 3296 } 3297 } 3298 delete(points); 3299 3300 // check whether closest line is "too close" :), then it's inside 3301 if (ClosestLines.empty()) { 3001 3302 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 3002 3303 return NULL; 3003 3304 } 3004 if (trianglePoints[0]->node->DistanceSquared(x) < MYEPSILON) { 3005 Log() << Verbose(1) << "Point is right on a tesselation point, no nearest triangle." << endl; 3006 PointMap::const_iterator PointRunner = PointsOnBoundary.find(trianglePoints[0]->nr); 3007 triangles = new list<BoundaryTriangleSet*>; 3008 if (PointRunner != PointsOnBoundary.end()) { 3009 for(LineMap::iterator LineRunner = PointRunner->second->lines.begin(); LineRunner != PointRunner->second->lines.end(); LineRunner++) 3010 for(TriangleMap::iterator TriangleRunner = LineRunner->second->triangles.begin(); TriangleRunner != LineRunner->second->triangles.end(); TriangleRunner++) 3011 triangles->push_back(TriangleRunner->second); 3012 triangles->sort(); 3013 triangles->unique(); 3014 } else { 3015 PointRunner = PointsOnBoundary.find(SecondPoint->nr); 3016 trianglePoints[0] = SecondPoint; 3017 if (PointRunner != PointsOnBoundary.end()) { 3018 for(LineMap::iterator LineRunner = PointRunner->second->lines.begin(); LineRunner != PointRunner->second->lines.end(); LineRunner++) 3019 for(TriangleMap::iterator TriangleRunner = LineRunner->second->triangles.begin(); TriangleRunner != LineRunner->second->triangles.end(); TriangleRunner++) 3020 triangles->push_back(TriangleRunner->second); 3021 triangles->sort(); 3022 triangles->unique(); 3023 } else { 3024 eLog() << Verbose(1) << "I cannot find a boundary point to the tessel point " << *trianglePoints[0] << "." << endl; 3025 return NULL; 3026 } 3027 } 3028 } else { 3029 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(trianglePoints[0]); 3030 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(connectedPoints, trianglePoints[0], x); 3031 delete(connectedPoints); 3032 if (connectedClosestPoints != NULL) { 3033 trianglePoints[1] = connectedClosestPoints->front(); 3034 trianglePoints[2] = connectedClosestPoints->back(); 3035 for (int i=0;i<3;i++) { 3036 if (trianglePoints[i] == NULL) { 3037 eLog() << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl; 3038 } 3039 //Log() << Verbose(1) << "List of triangle points:" << endl; 3040 //Log() << Verbose(2) << *trianglePoints[i] << endl; 3041 } 3042 3043 triangles = FindTriangles(trianglePoints); 3044 Log() << Verbose(1) << "List of possible triangles:" << endl; 3045 for(list<BoundaryTriangleSet*>::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 3046 Log() << Verbose(2) << **Runner << endl; 3047 3048 delete(connectedClosestPoints); 3049 } else { 3050 triangles = NULL; 3051 eLog() << Verbose(2) << "There is no circle of connected points!" << endl; 3052 } 3053 } 3054 3055 if ((triangles == NULL) || (triangles->empty())) { 3056 eLog() << Verbose(1) << "There is no nearest triangle. Please check the tesselation structure."; 3057 delete(triangles); 3058 return NULL; 3059 } else 3060 return triangles; 3305 TriangleList * candidates = new TriangleList; 3306 for (LineSet::iterator LineRunner = ClosestLines.begin(); LineRunner != ClosestLines.end(); LineRunner++) 3307 for (TriangleMap::iterator Runner = (*LineRunner)->triangles.begin(); Runner != (*LineRunner)->triangles.end(); Runner++) { 3308 candidates->push_back(Runner->second); 3309 } 3310 return candidates; 3061 3311 }; 3062 3312 … … 3067 3317 * \return list of BoundaryTriangleSet of nearest triangles or NULL. 3068 3318 */ 3069 class BoundaryTriangleSet * Tesselation::FindClosestTriangleTo Point(const Vector *x, const LinkedCell* LC) const3319 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const 3070 3320 { 3071 3321 Info FunctionInfo(__func__); 3072 3322 class BoundaryTriangleSet *result = NULL; 3073 list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC); 3323 TriangleList *triangles = FindClosestTrianglesToVector(x, LC); 3324 TriangleList candidates; 3074 3325 Vector Center; 3075 3076 if (triangles == NULL) 3326 Vector helper; 3327 3328 if ((triangles == NULL) || (triangles->empty())) 3077 3329 return NULL; 3078 3330 3079 if (triangles->size() == 1) { // there is no degenerate case 3080 result = triangles->front(); 3081 Log() << Verbose(1) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl; 3082 } else { 3083 result = triangles->front(); 3084 result->GetCenter(&Center); 3085 Center.SubtractVector(x); 3086 Log() << Verbose(1) << "Normal Vector of this front side is " << result->NormalVector << "." << endl; 3087 if (Center.ScalarProduct(&result->NormalVector) < 0) { 3088 result = triangles->back(); 3089 Log() << Verbose(1) << "Normal Vector of this back side is " << result->NormalVector << "." << endl; 3090 if (Center.ScalarProduct(&result->NormalVector) < 0) { 3091 eLog() << Verbose(1) << "Front and back side yield NormalVector in wrong direction!" << endl; 3092 } 3331 // go through all and pick the one with the best alignment to x 3332 double MinAlignment = 2.*M_PI; 3333 for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) { 3334 (*Runner)->GetCenter(&Center); 3335 helper.CopyVector(x); 3336 helper.SubtractVector(&Center); 3337 const double Alignment = helper.Angle(&(*Runner)->NormalVector); 3338 if (Alignment < MinAlignment) { 3339 result = *Runner; 3340 MinAlignment = Alignment; 3341 Log() << Verbose(1) << "ACCEPT: Triangle " << *result << " is better aligned with " << MinAlignment << "." << endl; 3342 } else { 3343 Log() << Verbose(1) << "REJECT: Triangle " << *result << " is worse aligned with " << MinAlignment << "." << endl; 3093 3344 } 3094 3345 } 3095 3346 delete(triangles); 3347 3096 3348 return result; 3097 3349 }; 3098 3350 3099 /** Checks whether the provided Vector is within the tesselation structure. 3351 /** Checks whether the provided Vector is within the Tesselation structure. 3352 * Basically calls Tesselation::GetDistanceToSurface() and checks the sign of the return value. 3353 * @param point of which to check the position 3354 * @param *LC LinkedCell structure 3355 * 3356 * @return true if the point is inside the Tesselation structure, false otherwise 3357 */ 3358 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const 3359 { 3360 return (GetDistanceSquaredToSurface(Point, LC) < MYEPSILON); 3361 } 3362 3363 /** Returns the distance to the surface given by the tesselation. 3364 * Calls FindClosestTriangleToVector() and checks whether the resulting triangle's BoundaryTriangleSet#NormalVector points 3365 * towards or away from the given \a &Point. Additionally, we check whether it's normal to the normal vector, i.e. on the 3366 * closest triangle's plane. Then, we have to check whether \a Point is inside the triangle or not to determine whether it's 3367 * an inside or outside point. This is done by calling BoundaryTriangleSet::GetIntersectionInsideTriangle(). 3368 * In the end we additionally find the point on the triangle who was smallest distance to \a Point: 3369 * -# Separate distance from point to center in vector in NormalDirection and on the triangle plane. 3370 * -# Check whether vector on triangle plane points inside the triangle or crosses triangle bounds. 3371 * -# If inside, take it to calculate closest distance 3372 * -# If not, take intersection with BoundaryLine as distance 3373 * 3374 * @note distance is squared despite it still contains a sign to determine in-/outside! 3100 3375 * 3101 3376 * @param point of which to check the position 3102 3377 * @param *LC LinkedCell structure 3103 3378 * 3104 * @return true if the point is inside the tesselation structure, false otherwise 3105 */ 3106 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const 3107 { 3108 Info FunctionInfo(__func__); 3109 class BoundaryTriangleSet *result = FindClosestTriangleToPoint(&Point, LC); 3379 * @return >0 if outside, ==0 if on surface, <0 if inside 3380 */ 3381 double Tesselation::GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const 3382 { 3383 Info FunctionInfo(__func__); 3110 3384 Vector Center; 3111 3112 if (result == NULL) {// is boundary point or only point in point cloud? 3113 Log() << Verbose(1) << Point << " is the only point in vicinity." << endl; 3114 return false; 3115 } 3116 3117 result->GetCenter(&Center); 3385 Vector helper; 3386 Vector DistanceToCenter; 3387 Vector Intersection; 3388 double distance = 0.; 3389 3390 if (triangle == NULL) {// is boundary point or only point in point cloud? 3391 Log() << Verbose(1) << "No triangle given!" << endl; 3392 return -1.; 3393 } else { 3394 Log() << Verbose(1) << "INFO: Closest triangle found is " << *triangle << " with normal vector " << triangle->NormalVector << "." << endl; 3395 } 3396 3397 triangle->GetCenter(&Center); 3118 3398 Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl; 3119 Center.SubtractVector(&Point); 3120 Log() << Verbose(2) << "INFO: Vector from center to point to test is " << Center << "." << endl; 3121 if (Center.ScalarProduct(&result->NormalVector) > -MYEPSILON) { 3122 Log() << Verbose(1) << Point << " is an inner point." << endl; 3123 return true; 3399 DistanceToCenter.CopyVector(&Center); 3400 DistanceToCenter.SubtractVector(&Point); 3401 Log() << Verbose(2) << "INFO: Vector from point to test to center is " << DistanceToCenter << "." << endl; 3402 3403 // check whether we are on boundary 3404 if (fabs(DistanceToCenter.ScalarProduct(&triangle->NormalVector)) < MYEPSILON) { 3405 // calculate whether inside of triangle 3406 DistanceToCenter.CopyVector(&Point); 3407 Center.CopyVector(&Point); 3408 Center.SubtractVector(&triangle->NormalVector); // points towards MolCenter 3409 DistanceToCenter.AddVector(&triangle->NormalVector); // points outside 3410 Log() << Verbose(1) << "INFO: Calling Intersection with " << Center << " and " << DistanceToCenter << "." << endl; 3411 if (triangle->GetIntersectionInsideTriangle(&Center, &DistanceToCenter, &Intersection)) { 3412 Log() << Verbose(1) << Point << " is inner point: sufficiently close to boundary, " << Intersection << "." << endl; 3413 return 0.; 3414 } else { 3415 Log() << Verbose(1) << Point << " is NOT an inner point: on triangle plane but outside of triangle bounds." << endl; 3416 return false; 3417 } 3124 3418 } else { 3125 Log() << Verbose(1) << Point << " is NOT an inner point." << endl; 3126 return false; 3127 } 3128 } 3129 3130 /** Checks whether the provided TesselPoint is within the tesselation structure. 3131 * 3132 * @param *Point of which to check the position 3133 * @param *LC Linked Cell structure 3134 * 3135 * @return true if the point is inside the tesselation structure, false otherwise 3136 */ 3137 bool Tesselation::IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const 3138 { 3139 Info FunctionInfo(__func__); 3140 return IsInnerPoint(*(Point->node), LC); 3141 } 3419 // calculate smallest distance 3420 distance = triangle->GetClosestPointInsideTriangle(&Point, &Intersection); 3421 Log() << Verbose(1) << "Closest point on triangle is " << Intersection << "." << endl; 3422 3423 // then check direction to boundary 3424 if (DistanceToCenter.ScalarProduct(&triangle->NormalVector) > MYEPSILON) { 3425 Log() << Verbose(1) << Point << " is an inner point, " << distance << " below surface." << endl; 3426 return -distance; 3427 } else { 3428 Log() << Verbose(1) << Point << " is NOT an inner point, " << distance << " above surface." << endl; 3429 return +distance; 3430 } 3431 } 3432 }; 3433 3434 /** Calculates distance to a tesselated surface. 3435 * Combines \sa FindClosestTrianglesToVector() and \sa GetDistanceSquaredToTriangle(). 3436 * \param &Point point to calculate distance from 3437 * \param *LC needed for finding closest points fast 3438 * \return distance squared to closest point on surface 3439 */ 3440 double Tesselation::GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const 3441 { 3442 BoundaryTriangleSet *triangle = FindClosestTriangleToVector(&Point, LC); 3443 const double distance = GetDistanceSquaredToTriangle(Point, triangle); 3444 return Min(distance, LC->RADIUS); 3445 }; 3142 3446 3143 3447 /** Gets all points connected to the provided point by triangulation lines. … … 3147 3451 * @return set of the all points linked to the provided one 3148 3452 */ 3149 set<TesselPoint*>* Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const3150 { 3151 Info FunctionInfo(__func__); 3152 set<TesselPoint*> *connectedPoints = new set<TesselPoint*>;3453 TesselPointSet * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const 3454 { 3455 Info FunctionInfo(__func__); 3456 TesselPointSet *connectedPoints = new TesselPointSet; 3153 3457 class BoundaryPointSet *ReferencePoint = NULL; 3154 3458 TesselPoint* current; … … 3191 3495 } 3192 3496 3193 if (connectedPoints-> size() == 0) { // if have not found any points3497 if (connectedPoints->empty()) { // if have not found any points 3194 3498 eLog() << Verbose(1) << "We have not found any connected points to " << *Point<< "." << endl; 3195 3499 return NULL; … … 3212 3516 * @return list of the all points linked to the provided one 3213 3517 */ 3214 list<TesselPoint*> * Tesselation::GetCircleOfSetOfPoints(set<TesselPoint*>*SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const3518 TesselPointList * Tesselation::GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3215 3519 { 3216 3520 Info FunctionInfo(__func__); 3217 3521 map<double, TesselPoint*> anglesOfPoints; 3218 list<TesselPoint*> *connectedCircle = new list<TesselPoint*>; 3219 Vector center; 3522 TesselPointList *connectedCircle = new TesselPointList; 3220 3523 Vector PlaneNormal; 3221 3524 Vector AngleZero; 3222 3525 Vector OrthogonalVector; 3223 3526 Vector helper; 3527 const TesselPoint * const TrianglePoints[3] = {Point, NULL, NULL}; 3528 TriangleList *triangles = NULL; 3224 3529 3225 3530 if (SetOfNeighbours == NULL) { … … 3230 3535 3231 3536 // calculate central point 3232 for (set<TesselPoint*>::const_iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++)3233 center.AddVector((*TesselRunner)->node);3234 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size()3235 // << "; scale factor " << 1.0/connectedPoints.size();3236 center.Scale(1.0/SetOfNeighbours->size());3237 Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center<< "." << endl;3238 3239 // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points3240 PlaneNormal. CopyVector(Point->node);3241 PlaneNormal.SubtractVector(¢er);3537 triangles = FindTriangles(TrianglePoints); 3538 if ((triangles != NULL) && (!triangles->empty())) { 3539 for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 3540 PlaneNormal.AddVector(&(*Runner)->NormalVector); 3541 } else { 3542 eLog() << Verbose(0) << "Could not find any triangles for point " << *Point << "." << endl; 3543 performCriticalExit(); 3544 } 3545 PlaneNormal.Scale(1.0/triangles->size()); 3546 Log() << Verbose(1) << "INFO: Calculated PlaneNormal of all circle points is " << PlaneNormal << "." << endl; 3242 3547 PlaneNormal.Normalize(); 3243 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;3244 3548 3245 3549 // construct one orthogonal vector … … 3267 3571 3268 3572 // go through all connected points and calculate angle 3269 for ( set<TesselPoint*>::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) {3573 for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 3270 3574 helper.CopyVector((*listRunner)->node); 3271 3575 helper.SubtractVector(Point->node); … … 3283 3587 } 3284 3588 3589 /** Gets all points connected to the provided point by triangulation lines, ordered such that we have the circle round the point. 3590 * Maps them down onto the plane designated by the axis \a *Point and \a *Reference. The center of all points 3591 * connected in the tesselation to \a *Point is mapped to spherical coordinates with the zero angle being given 3592 * by the mapped down \a *Reference. Hence, the biggest and the smallest angles are those of the two shanks of the 3593 * triangle we are looking for. 3594 * 3595 * @param *SetOfNeighbours all points for which the angle should be calculated 3596 * @param *Point of which get all connected points 3597 * @param *Reference Reference vector for zero angle or NULL for no preference 3598 * @return list of the all points linked to the provided one 3599 */ 3600 TesselPointList * Tesselation::GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3601 { 3602 Info FunctionInfo(__func__); 3603 map<double, TesselPoint*> anglesOfPoints; 3604 TesselPointList *connectedCircle = new TesselPointList; 3605 Vector center; 3606 Vector PlaneNormal; 3607 Vector AngleZero; 3608 Vector OrthogonalVector; 3609 Vector helper; 3610 3611 if (SetOfNeighbours == NULL) { 3612 eLog() << Verbose(2) << "Could not find any connected points!" << endl; 3613 delete(connectedCircle); 3614 return NULL; 3615 } 3616 3617 // check whether there's something to do 3618 if (SetOfNeighbours->size() < 3) { 3619 for (TesselPointSet::iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++) 3620 connectedCircle->push_back(*TesselRunner); 3621 return connectedCircle; 3622 } 3623 3624 Log() << Verbose(1) << "INFO: Point is " << *Point << " and Reference is " << *Reference << "." << endl; 3625 // calculate central point 3626 3627 TesselPointSet::const_iterator TesselA = SetOfNeighbours->begin(); 3628 TesselPointSet::const_iterator TesselB = SetOfNeighbours->begin(); 3629 TesselPointSet::const_iterator TesselC = SetOfNeighbours->begin(); 3630 TesselB++; 3631 TesselC++; 3632 TesselC++; 3633 int counter = 0; 3634 while (TesselC != SetOfNeighbours->end()) { 3635 helper.MakeNormalVector((*TesselA)->node, (*TesselB)->node, (*TesselC)->node); 3636 Log() << Verbose(0) << "Making normal vector out of " << *(*TesselA) << ", " << *(*TesselB) << " and " << *(*TesselC) << ":" << helper << endl; 3637 counter++; 3638 TesselA++; 3639 TesselB++; 3640 TesselC++; 3641 PlaneNormal.AddVector(&helper); 3642 } 3643 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size() 3644 // << "; scale factor " << counter; 3645 PlaneNormal.Scale(1.0/(double)counter); 3646 // Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl; 3647 // 3648 // // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points 3649 // PlaneNormal.CopyVector(Point->node); 3650 // PlaneNormal.SubtractVector(¢er); 3651 // PlaneNormal.Normalize(); 3652 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl; 3653 3654 // construct one orthogonal vector 3655 if (Reference != NULL) { 3656 AngleZero.CopyVector(Reference); 3657 AngleZero.SubtractVector(Point->node); 3658 AngleZero.ProjectOntoPlane(&PlaneNormal); 3659 } 3660 if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) { 3661 Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl; 3662 AngleZero.CopyVector((*SetOfNeighbours->begin())->node); 3663 AngleZero.SubtractVector(Point->node); 3664 AngleZero.ProjectOntoPlane(&PlaneNormal); 3665 if (AngleZero.NormSquared() < MYEPSILON) { 3666 eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl; 3667 performCriticalExit(); 3668 } 3669 } 3670 Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl; 3671 if (AngleZero.NormSquared() > MYEPSILON) 3672 OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero); 3673 else 3674 OrthogonalVector.MakeNormalVector(&PlaneNormal); 3675 Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl; 3676 3677 // go through all connected points and calculate angle 3678 pair <map<double, TesselPoint*>::iterator, bool > InserterTest; 3679 for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 3680 helper.CopyVector((*listRunner)->node); 3681 helper.SubtractVector(Point->node); 3682 helper.ProjectOntoPlane(&PlaneNormal); 3683 double angle = GetAngle(helper, AngleZero, OrthogonalVector); 3684 if (angle > M_PI) // the correction is of no use here (and not desired) 3685 angle = 2.*M_PI - angle; 3686 Log() << Verbose(0) << "INFO: Calculated angle between " << helper << " and " << AngleZero << " is " << angle << " for point " << **listRunner << "." << endl; 3687 InserterTest = anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 3688 if (!InserterTest.second) { 3689 eLog() << Verbose(0) << "GetCircleOfSetOfPoints() got two atoms with same angle: " << *((InserterTest.first)->second) << " and " << (*listRunner) << endl; 3690 performCriticalExit(); 3691 } 3692 } 3693 3694 for(map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) { 3695 connectedCircle->push_back(AngleRunner->second); 3696 } 3697 3698 return connectedCircle; 3699 } 3700 3285 3701 /** Gets all points connected to the provided point by triangulation lines, ordered such that we walk along a closed path. 3286 3702 * … … 3289 3705 * @return list of the all points linked to the provided one 3290 3706 */ 3291 list<list<TesselPoint*> *>* Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const3707 ListOfTesselPointList * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const 3292 3708 { 3293 3709 Info FunctionInfo(__func__); 3294 3710 map<double, TesselPoint*> anglesOfPoints; 3295 list< list<TesselPoint*> *> *ListOfPaths = new list<list<TesselPoint*>*>;3296 list<TesselPoint*>*connectedPath = NULL;3711 list< TesselPointList *> *ListOfPaths = new list< TesselPointList *>; 3712 TesselPointList *connectedPath = NULL; 3297 3713 Vector center; 3298 3714 Vector PlaneNormal; … … 3331 3747 } else if (!LineRunner->second) { 3332 3748 LineRunner->second = true; 3333 connectedPath = new list<TesselPoint*>;3749 connectedPath = new TesselPointList; 3334 3750 triangle = NULL; 3335 3751 CurrentLine = runner->second; … … 3405 3821 * @return list of the closed paths 3406 3822 */ 3407 list<list<TesselPoint*> *>* Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const3408 { 3409 Info FunctionInfo(__func__); 3410 list< list<TesselPoint*>*> *ListofPaths = GetPathsOfConnectedPoints(Point);3411 list< list<TesselPoint*> *> *ListofClosedPaths = new list<list<TesselPoint*>*>;3412 list<TesselPoint*>*connectedPath = NULL;3413 list<TesselPoint*>*newPath = NULL;3823 ListOfTesselPointList * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const 3824 { 3825 Info FunctionInfo(__func__); 3826 list<TesselPointList *> *ListofPaths = GetPathsOfConnectedPoints(Point); 3827 list<TesselPointList *> *ListofClosedPaths = new list<TesselPointList *>; 3828 TesselPointList *connectedPath = NULL; 3829 TesselPointList *newPath = NULL; 3414 3830 int count = 0; 3415 3831 3416 3832 3417 list<TesselPoint*>::iterator CircleRunner;3418 list<TesselPoint*>::iterator CircleStart;3419 3420 for(list< list<TesselPoint*>*>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) {3833 TesselPointList::iterator CircleRunner; 3834 TesselPointList::iterator CircleStart; 3835 3836 for(list<TesselPointList *>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) { 3421 3837 connectedPath = *ListRunner; 3422 3838 … … 3427 3843 3428 3844 // go through list, look for reappearance of starting Point and create list 3429 list<TesselPoint*>::iterator Marker = CircleStart;3845 TesselPointList::iterator Marker = CircleStart; 3430 3846 for (CircleRunner = CircleStart; CircleRunner != connectedPath->end(); CircleRunner++) { 3431 3847 if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point 3432 3848 // we have a closed circle from Marker to new Marker 3433 3849 Log() << Verbose(1) << count+1 << ". closed path consists of: "; 3434 newPath = new list<TesselPoint*>;3435 list<TesselPoint*>::iterator CircleSprinter = Marker;3850 newPath = new TesselPointList; 3851 TesselPointList::iterator CircleSprinter = Marker; 3436 3852 for (; CircleSprinter != CircleRunner; CircleSprinter++) { 3437 3853 newPath->push_back(*CircleSprinter); … … 3467 3883 * \return pointer to allocated list of triangles 3468 3884 */ 3469 set<BoundaryTriangleSet*>*Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const3470 { 3471 Info FunctionInfo(__func__); 3472 set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>;3885 TriangleSet *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const 3886 { 3887 Info FunctionInfo(__func__); 3888 TriangleSet *connectedTriangles = new TriangleSet; 3473 3889 3474 3890 if (Point == NULL) { … … 3519 3935 } 3520 3936 3521 list< list<TesselPoint*>*> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node);3522 list<TesselPoint*>*connectedPath = NULL;3937 list<TesselPointList *> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node); 3938 TesselPointList *connectedPath = NULL; 3523 3939 3524 3940 // gather all triangles 3525 3941 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) 3526 3942 count+=LineRunner->second->triangles.size(); 3527 map<class BoundaryTriangleSet *, int>Candidates;3943 TriangleMap Candidates; 3528 3944 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 3529 3945 line = LineRunner->second; 3530 3946 for (TriangleMap::iterator TriangleRunner = line->triangles.begin(); TriangleRunner != line->triangles.end(); TriangleRunner++) { 3531 3947 triangle = TriangleRunner->second; 3532 Candidates.insert( pair<class BoundaryTriangleSet *, int> (triangle, triangle->Nr) );3948 Candidates.insert( TrianglePair (triangle->Nr, triangle) ); 3533 3949 } 3534 3950 } … … 3537 3953 count=0; 3538 3954 NormalVector.Zero(); 3539 for ( map<class BoundaryTriangleSet *, int>::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) {3540 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner-> first) << "." << endl;3541 NormalVector.SubtractVector(&Runner-> first->NormalVector); // has to point inward3542 RemoveTesselationTriangle(Runner-> first);3955 for (TriangleMap::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) { 3956 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->second) << "." << endl; 3957 NormalVector.SubtractVector(&Runner->second->NormalVector); // has to point inward 3958 RemoveTesselationTriangle(Runner->second); 3543 3959 count++; 3544 3960 } 3545 3961 Log() << Verbose(1) << count << " triangles were removed." << endl; 3546 3962 3547 list< list<TesselPoint*>*>::iterator ListAdvance = ListOfClosedPaths->begin();3548 list< list<TesselPoint*>*>::iterator ListRunner = ListAdvance;3549 map<class BoundaryTriangleSet *, int>::iterator NumberRunner = Candidates.begin();3550 list<TesselPoint*>::iterator StartNode, MiddleNode, EndNode;3963 list<TesselPointList *>::iterator ListAdvance = ListOfClosedPaths->begin(); 3964 list<TesselPointList *>::iterator ListRunner = ListAdvance; 3965 TriangleMap::iterator NumberRunner = Candidates.begin(); 3966 TesselPointList::iterator StartNode, MiddleNode, EndNode; 3551 3967 double angle; 3552 3968 double smallestangle; … … 3562 3978 3563 3979 // re-create all triangles by going through connected points list 3564 list<class BoundaryLineSet *>NewLines;3980 LineList NewLines; 3565 3981 for (;!connectedPath->empty();) { 3566 3982 // search middle node with widest angle to next neighbours … … 3668 4084 // maximize the inner lines (we preferentially created lines with a huge angle, which is for the tesselation not wanted though useful for the closing) 3669 4085 if (NewLines.size() > 1) { 3670 list<class BoundaryLineSet *>::iterator Candidate;4086 LineList::iterator Candidate; 3671 4087 class BoundaryLineSet *OtherBase = NULL; 3672 4088 double tmp, maxgain; 3673 4089 do { 3674 4090 maxgain = 0; 3675 for( list<class BoundaryLineSet *>::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) {4091 for(LineList::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) { 3676 4092 tmp = PickFarthestofTwoBaselines(*Runner); 3677 4093 if (maxgain < tmp) { … … 3715 4131 * Finds triangles belonging to the three provided points. 3716 4132 * 3717 * @param *Points[3] list, is expected to contain three points 4133 * @param *Points[3] list, is expected to contain three points (NULL means wildcard) 3718 4134 * 3719 4135 * @return triangles which belong to the provided points, will be empty if there are none, 3720 4136 * will usually be one, in case of degeneration, there will be two 3721 4137 */ 3722 list<BoundaryTriangleSet*>*Tesselation::FindTriangles(const TesselPoint* const Points[3]) const3723 { 3724 Info FunctionInfo(__func__); 3725 list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>;4138 TriangleList *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const 4139 { 4140 Info FunctionInfo(__func__); 4141 TriangleList *result = new TriangleList; 3726 4142 LineMap::const_iterator FindLine; 3727 4143 TriangleMap::const_iterator FindTriangle; 3728 4144 class BoundaryPointSet *TrianglePoints[3]; 4145 size_t NoOfWildcards = 0; 3729 4146 3730 4147 for (int i = 0; i < 3; i++) { 3731 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Points[i]->nr);3732 if (FindPoint != PointsOnBoundary.end()) {3733 TrianglePoints[i] = FindPoint->second;4148 if (Points[i] == NULL) { 4149 NoOfWildcards++; 4150 TrianglePoints[i] = NULL; 3734 4151 } else { 3735 TrianglePoints[i] = NULL; 3736 } 3737 } 3738 3739 // checks lines between the points in the Points for their adjacent triangles 3740 for (int i = 0; i < 3; i++) { 3741 if (TrianglePoints[i] != NULL) { 3742 for (int j = i+1; j < 3; j++) { 3743 if (TrianglePoints[j] != NULL) { 3744 for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap! 3745 (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); 3746 FindLine++) { 3747 for (FindTriangle = FindLine->second->triangles.begin(); 3748 FindTriangle != FindLine->second->triangles.end(); 3749 FindTriangle++) { 3750 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 3751 result->push_back(FindTriangle->second); 4152 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Points[i]->nr); 4153 if (FindPoint != PointsOnBoundary.end()) { 4154 TrianglePoints[i] = FindPoint->second; 4155 } else { 4156 TrianglePoints[i] = NULL; 4157 } 4158 } 4159 } 4160 4161 switch (NoOfWildcards) { 4162 case 0: // checks lines between the points in the Points for their adjacent triangles 4163 for (int i = 0; i < 3; i++) { 4164 if (TrianglePoints[i] != NULL) { 4165 for (int j = i+1; j < 3; j++) { 4166 if (TrianglePoints[j] != NULL) { 4167 for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap! 4168 (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); 4169 FindLine++) { 4170 for (FindTriangle = FindLine->second->triangles.begin(); 4171 FindTriangle != FindLine->second->triangles.end(); 4172 FindTriangle++) { 4173 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 4174 result->push_back(FindTriangle->second); 4175 } 4176 } 3752 4177 } 4178 // Is it sufficient to consider one of the triangle lines for this. 4179 return result; 3753 4180 } 3754 4181 } 3755 // Is it sufficient to consider one of the triangle lines for this.3756 return result;3757 4182 } 3758 4183 } 3759 } 4184 break; 4185 case 1: // copy all triangles of the respective line 4186 { 4187 int i=0; 4188 for (; i < 3; i++) 4189 if (TrianglePoints[i] == NULL) 4190 break; 4191 for (FindLine = TrianglePoints[(i+1)%3]->lines.find(TrianglePoints[(i+2)%3]->node->nr); // is a multimap! 4192 (FindLine != TrianglePoints[(i+1)%3]->lines.end()) && (FindLine->first == TrianglePoints[(i+2)%3]->node->nr); 4193 FindLine++) { 4194 for (FindTriangle = FindLine->second->triangles.begin(); 4195 FindTriangle != FindLine->second->triangles.end(); 4196 FindTriangle++) { 4197 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 4198 result->push_back(FindTriangle->second); 4199 } 4200 } 4201 } 4202 break; 4203 } 4204 case 2: // copy all triangles of the respective point 4205 { 4206 int i=0; 4207 for (; i < 3; i++) 4208 if (TrianglePoints[i] != NULL) 4209 break; 4210 for (LineMap::const_iterator line = TrianglePoints[i]->lines.begin(); line != TrianglePoints[i]->lines.end(); line++) 4211 for (TriangleMap::const_iterator triangle = line->second->triangles.begin(); triangle != line->second->triangles.end(); triangle++) 4212 result->push_back(triangle->second); 4213 result->sort(); 4214 result->unique(); 4215 break; 4216 } 4217 case 3: // copy all triangles 4218 { 4219 for (TriangleMap::const_iterator triangle = TrianglesOnBoundary.begin(); triangle != TrianglesOnBoundary.end(); triangle++) 4220 result->push_back(triangle->second); 4221 break; 4222 } 4223 default: 4224 eLog() << Verbose(0) << "Number of wildcards is greater than 3, cannot happen!" << endl; 4225 performCriticalExit(); 4226 break; 3760 4227 } 3761 4228 … … 3800 4267 * in the list, once as key and once as value 3801 4268 */ 3802 map<int, int>* Tesselation::FindAllDegeneratedLines()4269 IndexToIndex * Tesselation::FindAllDegeneratedLines() 3803 4270 { 3804 4271 Info FunctionInfo(__func__); 3805 4272 UniqueLines AllLines; 3806 map<int, int> * DegeneratedLines = new map<int, int>;4273 IndexToIndex * DegeneratedLines = new IndexToIndex; 3807 4274 3808 4275 // sanity check … … 3825 4292 3826 4293 Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl; 3827 map<int,int>::iterator it;4294 IndexToIndex::iterator it; 3828 4295 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) { 3829 4296 const LineMap::const_iterator Line1 = LinesOnBoundary.find((*it).first); … … 3844 4311 * in the list, once as key and once as value 3845 4312 */ 3846 map<int, int>* Tesselation::FindAllDegeneratedTriangles()3847 { 3848 Info FunctionInfo(__func__); 3849 map<int, int>* DegeneratedLines = FindAllDegeneratedLines();3850 map<int, int> * DegeneratedTriangles = new map<int, int>;4313 IndexToIndex * Tesselation::FindAllDegeneratedTriangles() 4314 { 4315 Info FunctionInfo(__func__); 4316 IndexToIndex * DegeneratedLines = FindAllDegeneratedLines(); 4317 IndexToIndex * DegeneratedTriangles = new IndexToIndex; 3851 4318 3852 4319 TriangleMap::iterator TriangleRunner1, TriangleRunner2; … … 3854 4321 class BoundaryLineSet *line1 = NULL, *line2 = NULL; 3855 4322 3856 for ( map<int, int>::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) {4323 for (IndexToIndex::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) { 3857 4324 // run over both lines' triangles 3858 4325 Liner = LinesOnBoundary.find(LineRunner->first); … … 3875 4342 3876 4343 Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl; 3877 map<int,int>::iterator it;4344 IndexToIndex::iterator it; 3878 4345 for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++) 3879 4346 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; … … 3889 4356 { 3890 4357 Info FunctionInfo(__func__); 3891 map<int, int>* DegeneratedTriangles = FindAllDegeneratedTriangles();4358 IndexToIndex * DegeneratedTriangles = FindAllDegeneratedTriangles(); 3892 4359 TriangleMap::iterator finder; 3893 4360 BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL; 3894 4361 int count = 0; 3895 4362 3896 for ( map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles->begin();4363 for (IndexToIndex::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); 3897 4364 TriangleKeyRunner != DegeneratedTriangles->end(); ++TriangleKeyRunner 3898 4365 ) { … … 3982 4449 // find nearest boundary point 3983 4450 class TesselPoint *BackupPoint = NULL; 3984 class TesselPoint *NearestPoint = FindClosest Point(point->node, BackupPoint, LC);4451 class TesselPoint *NearestPoint = FindClosestTesselPoint(point->node, BackupPoint, LC); 3985 4452 class BoundaryPointSet *NearestBoundaryPoint = NULL; 3986 4453 PointMap::iterator PointRunner; … … 4149 4616 4150 4617 /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector 4151 map <int, int>*DegeneratedTriangles = FindAllDegeneratedTriangles();4618 IndexToIndex *DegeneratedTriangles = FindAllDegeneratedTriangles(); 4152 4619 set < BoundaryPointSet *> EndpointCandidateList; 4153 4620 pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester; … … 4301 4768 } 4302 4769 4303 map<int, int>* SimplyDegeneratedTriangles = FindAllDegeneratedTriangles();4770 IndexToIndex * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles(); 4304 4771 Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl; 4305 map<int,int>::iterator it;4772 IndexToIndex::iterator it; 4306 4773 for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++) 4307 4774 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; -
src/tesselation.hpp
rbd61b41 r271e17 52 52 // ======================================================= some template functions ========================================= 53 53 54 #define IndexToIndex map <int, int> 55 54 56 #define PointMap map < int, class BoundaryPointSet * > 55 57 #define PointSet set < class BoundaryPointSet * > … … 77 79 #define PolygonList list < class BoundaryPolygonSet * > 78 80 81 #define DistanceToPointMap multimap <double, class BoundaryPointSet * > 82 #define DistanceToPointPair pair <double, class BoundaryPointSet * > 83 79 84 #define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> > 80 85 #define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> > … … 82 87 #define TesselPointList list <TesselPoint *> 83 88 #define TesselPointSet set <TesselPoint *> 89 90 #define ListOfTesselPointList list<list <TesselPoint *> *> 84 91 85 92 /********************************************** declarations *******************************/ … … 101 108 public: 102 109 BoundaryPointSet(); 103 BoundaryPointSet(TesselPoint * Walker);110 BoundaryPointSet(TesselPoint * const Walker); 104 111 ~BoundaryPointSet(); 105 112 106 void AddLine( class BoundaryLineSet *line);113 void AddLine(BoundaryLineSet * const line); 107 114 108 115 LineMap lines; … … 120 127 public: 121 128 BoundaryLineSet(); 122 BoundaryLineSet(class BoundaryPointSet *Point[2], const int number); 129 BoundaryLineSet(BoundaryPointSet * const Point[2], const int number); 130 BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number); 123 131 ~BoundaryLineSet(); 124 132 125 void AddTriangle( class BoundaryTriangleSet *triangle);126 bool IsConnectedTo(c lass BoundaryLineSet *line);127 bool ContainsBoundaryPoint(c lass BoundaryPointSet *point);128 bool CheckConvexityCriterion() ;129 class BoundaryPointSet *GetOtherEndpoint(c lass BoundaryPointSet *);133 void AddTriangle(BoundaryTriangleSet * const triangle); 134 bool IsConnectedTo(const BoundaryLineSet * const line) const; 135 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 136 bool CheckConvexityCriterion() const; 137 class BoundaryPointSet *GetOtherEndpoint(const BoundaryPointSet * const point) const; 130 138 131 139 class BoundaryPointSet *endpoints[2]; … … 142 150 public: 143 151 BoundaryTriangleSet(); 144 BoundaryTriangleSet(class BoundaryLineSet * line[3],int number);152 BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number); 145 153 ~BoundaryTriangleSet(); 146 154 147 void GetNormalVector(Vector &NormalVector); 148 void GetCenter(Vector *center); 149 bool GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection); 150 bool ContainsBoundaryLine(class BoundaryLineSet *line); 151 bool ContainsBoundaryPoint(class BoundaryPointSet *point); 152 bool ContainsBoundaryPoint(class TesselPoint *point); 153 class BoundaryPointSet *GetThirdEndpoint(class BoundaryLineSet *line); 154 bool IsPresentTupel(class BoundaryPointSet *Points[3]); 155 bool IsPresentTupel(class BoundaryTriangleSet *T); 155 void GetNormalVector(const Vector &NormalVector); 156 void GetCenter(Vector * const center) const; 157 bool GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const; 158 double GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const; 159 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 160 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 161 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 162 class BoundaryPointSet *GetThirdEndpoint(const BoundaryLineSet * const line) const; 163 bool IsPresentTupel(const BoundaryPointSet * const Points[3]) const; 164 bool IsPresentTupel(const BoundaryTriangleSet * const T) const; 156 165 157 166 class BoundaryPointSet *endpoints[3]; … … 226 235 virtual TesselPoint *GetPoint() const { return NULL; }; 227 236 virtual TesselPoint *GetTerminalPoint() const { return NULL; }; 237 virtual int GetMaxId() const { return 0; }; 228 238 virtual void GoToNext() const {}; 229 239 virtual void GoToPrevious() const {}; … … 290 300 double PickFarthestofTwoBaselines(class BoundaryLineSet *Base); 291 301 class BoundaryPointSet *IsConvexRectangle(class BoundaryLineSet *Base); 292 map<int, int>* FindAllDegeneratedTriangles();293 map<int, int>* FindAllDegeneratedLines();302 IndexToIndex * FindAllDegeneratedTriangles(); 303 IndexToIndex * FindAllDegeneratedLines(); 294 304 void RemoveDegeneratedTriangles(); 295 305 void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC); 296 306 int CorrectAllDegeneratedPolygons(); 297 307 298 set<TesselPoint*> * GetAllConnectedPoints(const TesselPoint* const Point) const; 299 set<BoundaryTriangleSet*> *GetAllTriangles(const BoundaryPointSet * const Point) const; 300 list<list<TesselPoint*> *> * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; 301 list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 302 list<TesselPoint*> * GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const; 303 class BoundaryPointSet *GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 304 list<BoundaryTriangleSet*> *FindTriangles(const TesselPoint* const Points[3]) const; 305 list<BoundaryTriangleSet*> * FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const; 306 class BoundaryTriangleSet * FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const; 308 TesselPointSet * GetAllConnectedPoints(const TesselPoint* const Point) const; 309 TriangleSet * GetAllTriangles(const BoundaryPointSet * const Point) const; 310 ListOfTesselPointList * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; 311 ListOfTesselPointList * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 312 TesselPointList * GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const; 313 TesselPointList * GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const; 314 class BoundaryPointSet * GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 315 TriangleList * FindTriangles(const TesselPoint* const Points[3]) const; 316 TriangleList * FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const; 317 BoundaryTriangleSet * FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const; 307 318 bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const; 308 bool IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const; 319 double GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const; 320 double GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const; 309 321 bool AddBoundaryPoint(TesselPoint * Walker, const int n); 322 DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const; 323 BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const; 310 324 311 325 // print for debugging -
src/tesselationhelpers.cpp
rbd61b41 r271e17 143 143 if (fabs(HalfplaneIndicator) < MYEPSILON) 144 144 { 145 if ((TempNormal.ScalarProduct(AlternativeDirection) <0 and AlternativeIndicator >0) or (TempNormal.ScalarProduct(AlternativeDirection) >0 andAlternativeIndicator <0))145 if ((TempNormal.ScalarProduct(AlternativeDirection) <0 && AlternativeIndicator >0) || (TempNormal.ScalarProduct(AlternativeDirection) >0 && AlternativeIndicator <0)) 146 146 { 147 147 TempNormal.Scale(-1); … … 150 150 else 151 151 { 152 if ( TempNormal.ScalarProduct(Direction)<0 && HalfplaneIndicator >0 || TempNormal.ScalarProduct(Direction)>0 && HalfplaneIndicator<0)152 if (((TempNormal.ScalarProduct(Direction)<0) && (HalfplaneIndicator >0)) || ((TempNormal.ScalarProduct(Direction)>0) && (HalfplaneIndicator<0))) 153 153 { 154 154 TempNormal.Scale(-1); … … 558 558 * @return point which is second closest to the provided one 559 559 */ 560 TesselPoint* FindSecondClosest Point(const Vector* Point, const LinkedCell* const LC)560 TesselPoint* FindSecondClosestTesselPoint(const Vector* Point, const LinkedCell* const LC) 561 561 { 562 562 Info FunctionInfo(__func__); … … 613 613 * @return point which is closest to the provided one, NULL if none found 614 614 */ 615 TesselPoint* FindClosest Point(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC)615 TesselPoint* FindClosestTesselPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC) 616 616 { 617 617 Info FunctionInfo(__func__); … … 639 639 helper.CopyVector(Point); 640 640 helper.SubtractVector((*Runner)->node); 641 double currentNorm = helper. Norm();641 double currentNorm = helper.NormSquared(); 642 642 if (currentNorm < distance) { 643 643 secondDistance = distance; … … 866 866 } 867 867 *tecplot << "\", N=" << TesselStruct->PointsOnBoundary.size() << ", E=" << TesselStruct->TrianglesOnBoundary.size() << ", DATAPACKING=POINT, ZONETYPE=FETRIANGLE" << endl; 868 int i=0; 869 for (cloud->GoToFirst(); !cloud->IsEnd(); cloud->GoToNext(), i++); 868 int i=cloud->GetMaxId(); 870 869 int *LookupList = new int[i]; 871 870 for (cloud->GoToFirst(), i=0; !cloud->IsEnd(); cloud->GoToNext(), i++) -
src/tesselationhelpers.hpp
rbd61b41 r271e17 59 59 bool CheckLineCriteriaForDegeneratedTriangle(const BoundaryPointSet * const nodes[3]); 60 60 bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation *candidate2); 61 TesselPoint* FindClosest Point(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC);62 TesselPoint* FindSecondClosest Point(const Vector*, const LinkedCell* const LC);61 TesselPoint* FindClosestTesselPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC); 62 TesselPoint* FindSecondClosestTesselPoint(const Vector*, const LinkedCell* const LC); 63 63 Vector * GetClosestPointBetweenLine(const BoundaryLineSet * const Base, const BoundaryLineSet * const OtherBase); 64 64 -
src/unittests/AnalysisCorrelationToPointUnitTest.cpp
rbd61b41 r271e17 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
src/unittests/AnalysisCorrelationToSurfaceUnitTest.cpp
rbd61b41 r271e17 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
src/unittests/AnalysisPairCorrelationUnitTest.cpp
rbd61b41 r271e17 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
src/unittests/Makefile.am
rbd61b41 r271e17 4 4 AM_CXXFLAGS = $(CPPUNIT_CFLAGS) 5 5 6 TESTS = ActOnAllUnitTest AnalysisBondsUnitTests AnalysisCorrelationToPointUnitTest AnalysisCorrelationToSurfaceUnitTest AnalysisPairCorrelationUnitTest BondGraphUnitTest InfoUnitTest ListOfBondsUnitTest LogUnitTest MemoryUsageObserverUnitTest MemoryAllocatorUnitTest StackClassUnitTest VectorUnitTest 6 TESTS = \ 7 ActOnAllUnitTest \ 8 AnalysisBondsUnitTests \ 9 AnalysisCorrelationToPointUnitTest \ 10 AnalysisCorrelationToSurfaceUnitTest \ 11 AnalysisPairCorrelationUnitTest \ 12 BondGraphUnitTest \ 13 GSLMatrixSymmetricUnitTest \ 14 GSLMatrixUnitTest \ 15 GSLVectorUnitTest \ 16 InfoUnitTest \ 17 LinearSystemOfEquationsUnitTest \ 18 ListOfBondsUnitTest \ 19 LogUnitTest \ 20 MemoryUsageObserverUnitTest \ 21 MemoryAllocatorUnitTest \ 22 StackClassUnitTest \ 23 TesselationUnitTest \ 24 Tesselation_BoundaryTriangleUnitTest \ 25 Tesselation_InOutsideUnitTest \ 26 VectorUnitTest 27 7 28 check_PROGRAMS = $(TESTS) 8 29 noinst_PROGRAMS = $(TESTS) 9 30 10 31 ActOnAllUnitTest_SOURCES = ../test/ActOnAllTest.hpp ActOnAllUnitTest.cpp ActOnAllUnitTest.hpp 11 ActOnAllUnitTest_LDADD = ../libmolecuilder.a 32 ActOnAllUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 12 33 13 34 AnalysisBondsUnitTests_SOURCES = analysisbondsunittest.cpp analysisbondsunittest.hpp 14 AnalysisBondsUnitTests_LDADD = ../libmolecuilder.a 35 AnalysisBondsUnitTests_LDADD = ../libmolecuilder.a ../libgslwrapper.a 15 36 16 37 AnalysisCorrelationToPointUnitTest_SOURCES = analysis_correlation.hpp AnalysisCorrelationToPointUnitTest.cpp AnalysisCorrelationToPointUnitTest.hpp 17 AnalysisCorrelationToPointUnitTest_LDADD = ../libmolecuilder.a 38 AnalysisCorrelationToPointUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 18 39 19 40 AnalysisCorrelationToSurfaceUnitTest_SOURCES = analysis_correlation.hpp AnalysisCorrelationToSurfaceUnitTest.cpp AnalysisCorrelationToSurfaceUnitTest.hpp 20 AnalysisCorrelationToSurfaceUnitTest_LDADD = ../libmolecuilder.a 41 AnalysisCorrelationToSurfaceUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 21 42 22 43 AnalysisPairCorrelationUnitTest_SOURCES = analysis_correlation.hpp AnalysisPairCorrelationUnitTest.cpp AnalysisPairCorrelationUnitTest.hpp 23 AnalysisPairCorrelationUnitTest_LDADD = ../libmolecuilder.a 44 AnalysisPairCorrelationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 24 45 25 46 BondGraphUnitTest_SOURCES = bondgraphunittest.cpp bondgraphunittest.hpp 26 BondGraphUnitTest_LDADD = ../libmolecuilder.a 47 BondGraphUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 48 49 GSLMatrixSymmetricUnitTest_SOURCES = gslmatrixsymmetricunittest.cpp gslmatrixsymmetricunittest.hpp 50 GSLMatrixSymmetricUnitTest_LDADD = ../libgslwrapper.a 51 52 GSLMatrixUnitTest_SOURCES = gslmatrixunittest.cpp gslmatrixunittest.hpp 53 GSLMatrixUnitTest_LDADD = ../libgslwrapper.a 54 55 GSLVectorUnitTest_SOURCES = gslvectorunittest.cpp gslvectorunittest.hpp 56 GSLVectorUnitTest_LDADD = ../libgslwrapper.a 27 57 28 58 InfoUnitTest_SOURCES = infounittest.cpp infounittest.hpp 29 InfoUnitTest_LDADD = ../libmolecuilder.a 59 InfoUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 60 61 LinearSystemOfEquationsUnitTest_SOURCES = linearsystemofequationsunittest.cpp linearsystemofequationsunittest.hpp 62 LinearSystemOfEquationsUnitTest_LDADD = ../libgslwrapper.a ../libmolecuilder.a 30 63 31 64 ListOfBondsUnitTest_SOURCES = listofbondsunittest.cpp listofbondsunittest.hpp 32 ListOfBondsUnitTest_LDADD = ../libmolecuilder.a 65 ListOfBondsUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 33 66 34 67 LogUnitTest_SOURCES = logunittest.cpp logunittest.hpp 35 LogUnitTest_LDADD = ../libmolecuilder.a 68 LogUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 36 69 37 70 MemoryAllocatorUnitTest_SOURCES = memoryallocatorunittest.cpp memoryallocatorunittest.hpp 38 MemoryAllocatorUnitTest_LDADD = ../libmolecuilder.a 71 MemoryAllocatorUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 39 72 40 73 MemoryUsageObserverUnitTest_SOURCES = memoryusageobserverunittest.cpp memoryusageobserverunittest.hpp 41 MemoryUsageObserverUnitTest_LDADD = ../libmolecuilder.a 74 MemoryUsageObserverUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 42 75 43 76 StackClassUnitTest_SOURCES = stackclassunittest.cpp stackclassunittest.hpp 44 StackClassUnitTest_LDADD = ../libmolecuilder.a 77 StackClassUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 78 79 TesselationUnitTest_SOURCES = tesselationunittest.cpp tesselationunittest.hpp 80 TesselationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 81 82 Tesselation_BoundaryTriangleUnitTest_SOURCES = tesselation_boundarytriangleunittest.cpp tesselation_boundarytriangleunittest.hpp 83 Tesselation_BoundaryTriangleUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 84 85 Tesselation_InOutsideUnitTest_SOURCES = tesselation_insideoutsideunittest.cpp tesselation_insideoutsideunittest.hpp 86 Tesselation_InOutsideUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 45 87 46 88 VectorUnitTest_SOURCES = vectorunittest.cpp vectorunittest.hpp 47 VectorUnitTest_LDADD = ../libmolecuilder.a 89 VectorUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 48 90 49 91 -
src/unittests/analysisbondsunittest.cpp
rbd61b41 r271e17 14 14 #include <iostream> 15 15 #include <stdio.h> 16 #include <cstring> 16 17 17 18 #include "analysis_bonds.hpp" -
src/unittests/bondgraphunittest.cpp
rbd61b41 r271e17 14 14 #include <iostream> 15 15 #include <stdio.h> 16 #include <cstring> 16 17 17 18 #include "atom.hpp" -
src/unittests/listofbondsunittest.cpp
rbd61b41 r271e17 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "listofbondsunittest.hpp" -
src/unittests/tesselationunittest.cpp
rbd61b41 r271e17 12 12 #include <cppunit/extensions/TestFactoryRegistry.h> 13 13 #include <cppunit/ui/text/TestRunner.h> 14 15 #include <cstring> 14 16 15 17 #include "defs.hpp" … … 30 32 class TesselPoint *Walker; 31 33 Walker = new TesselPoint; 32 Walker->node = new Vector(1., 0., 0.);33 Walker->Name = new char[3];34 Walker->node = new Vector(1., 0., -1.); 35 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 34 36 strcpy(Walker->Name, "1"); 35 37 Walker->nr = 1; 36 38 Corners.push_back(Walker); 37 39 Walker = new TesselPoint; 38 Walker->node = new Vector(-1., 1., 0.);39 Walker->Name = new char[3];40 Walker->node = new Vector(-1., 1., -1.); 41 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 40 42 strcpy(Walker->Name, "2"); 41 43 Walker->nr = 2; 42 44 Corners.push_back(Walker); 43 45 Walker = new TesselPoint; 44 Walker->node = new Vector(-1., -1., 0.);45 Walker->Name = new char[3];46 Walker->node = new Vector(-1., -1., -1.); 47 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 46 48 strcpy(Walker->Name, "3"); 47 49 Walker->nr = 3; … … 49 51 Walker = new TesselPoint; 50 52 Walker->node = new Vector(-1., 0., 1.); 51 Walker->Name = new char[3];53 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 52 54 strcpy(Walker->Name, "4"); 53 55 Walker->nr = 4; … … 59 61 // create tesselation 60 62 TesselStruct = new Tesselation; 61 TesselStruct->PointsOnBoundary.clear();62 TesselStruct->LinesOnBoundary.clear();63 TesselStruct->TrianglesOnBoundary.clear();63 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->PointsOnBoundary.empty() ); 64 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->LinesOnBoundary.empty() ); 65 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->TrianglesOnBoundary.empty() ); 64 66 TesselStruct->FindStartingTriangle(SPHERERADIUS, LinkedList); 65 bool flag = false;66 67 67 LineMap::iterator baseline = TesselStruct->LinesOnBoundary.begin(); 68 while (baseline != TesselStruct->LinesOnBoundary.end()) { 69 if (baseline->second->triangles.size() == 1) { 70 flag = TesselStruct->FindNextSuitableTriangle(*(baseline->second), *(((baseline->second->triangles.begin()))->second), SPHERERADIUS, LinkedList); //the line is there, so there is a triangle, but only one. 68 CandidateForTesselation *baseline = NULL; 69 BoundaryTriangleSet *T = NULL; 70 bool OneLoopWithoutSuccessFlag = true; 71 bool TesselationFailFlag = false; 72 while ((!TesselStruct->OpenLines.empty()) && (OneLoopWithoutSuccessFlag)) { 73 // 2a. fill all new OpenLines 74 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 75 baseline = Runner->second; 76 if (baseline->pointlist.empty()) { 77 T = (((baseline->BaseLine->triangles.begin()))->second); 78 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*baseline, *T, SPHERERADIUS, LinkedList); //the line is there, so there is a triangle, but only one. 79 } 71 80 } 72 baseline++; 73 if ((baseline == TesselStruct->LinesOnBoundary.end()) && (flag)) { 74 baseline = TesselStruct->LinesOnBoundary.begin(); // restart if we reach end due to newly inserted lines 75 flag = false; 81 82 // 2b. search for smallest ShortestAngle among all candidates 83 double ShortestAngle = 4.*M_PI; 84 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 85 if (Runner->second->ShortestAngle < ShortestAngle) { 86 baseline = Runner->second; 87 ShortestAngle = baseline->ShortestAngle; 88 } 89 } 90 if ((ShortestAngle == 4.*M_PI) || (baseline->pointlist.empty())) 91 OneLoopWithoutSuccessFlag = false; 92 else { 93 TesselStruct->AddCandidateTriangle(*baseline); 76 94 } 77 95 } … … 84 102 delete(TesselStruct); 85 103 for (LinkedNodes::iterator Runner = Corners.begin(); Runner != Corners.end(); Runner++) { 86 delete[]((*Runner)->Name);87 104 delete((*Runner)->node); 88 105 delete(*Runner); 89 106 } 90 107 Corners.clear(); 91 }; 92 93 /** UnitTest for Tesselation::IsInnerPoint() 94 */ 95 void TesselationTest::IsInnerPointTest() 96 { 97 // true inside points 98 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.,0.), LinkedList) ); 99 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.5,0.,0.), LinkedList) ); 100 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.5,0.), LinkedList) ); 101 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.,0.5), LinkedList) ); 102 103 // corners 104 for (LinkedNodes::iterator Runner = Corners.begin(); Runner != Corners.end(); Runner++) 105 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint((*Runner), LinkedList) ); 106 107 // true outside points 108 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(0.,5.,0.), LinkedList) ); 109 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(0.,0.,5.), LinkedList) ); 110 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(1.,1.,1.), LinkedList) ); 111 112 // tricky point, there are three equally close triangles 113 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(5.,0.,0.), LinkedList) ); 114 108 MemoryUsageObserver::purgeInstance(); 109 logger::purgeInstance(); 110 errorLogger::purgeInstance(); 115 111 }; 116 112 -
src/unittests/tesselationunittest.hpp
rbd61b41 r271e17 21 21 { 22 22 CPPUNIT_TEST_SUITE( TesselationTest) ; 23 CPPUNIT_TEST ( IsInnerPointTest );24 23 CPPUNIT_TEST ( GetAllTrianglesTest ); 25 24 CPPUNIT_TEST ( ContainmentTest ); … … 29 28 void setUp(); 30 29 void tearDown(); 31 void IsInnerPointTest();32 30 void GetAllTrianglesTest(); 33 31 void ContainmentTest(); -
src/vector.cpp
rbd61b41 r271e17 8 8 #include "defs.hpp" 9 9 #include "helpers.hpp" 10 #include "memoryallocator.hpp" 10 #include "info.hpp" 11 #include "gslmatrix.hpp" 11 12 #include "leastsquaremin.hpp" 12 13 #include "log.hpp" 14 #include "memoryallocator.hpp" 13 15 #include "vector.hpp" 14 16 #include "verbose.hpp" 17 18 #include <gsl/gsl_linalg.h> 19 #include <gsl/gsl_matrix.h> 20 #include <gsl/gsl_permutation.h> 21 #include <gsl/gsl_vector.h> 15 22 16 23 /************************************ Functions for class vector ************************************/ … … 215 222 * \param *Origin first vector of line 216 223 * \param *LineVector second vector of line 217 * \return true - \a this contains intersection point on return, false - line is parallel to plane 224 * \return true - \a this contains intersection point on return, false - line is parallel to plane (even if in-plane) 218 225 */ 219 226 bool Vector::GetIntersectionWithPlane(const Vector * const PlaneNormal, const Vector * const PlaneOffset, const Vector * const Origin, const Vector * const LineVector) 220 227 { 228 Info FunctionInfo(__func__); 221 229 double factor; 222 230 Vector Direction, helper; … … 226 234 Direction.SubtractVector(Origin); 227 235 Direction.Normalize(); 228 //Log() << Verbose(4) << "INFO: Direction is " << Direction << "." << endl; 236 Log() << Verbose(1) << "INFO: Direction is " << Direction << "." << endl; 237 //Log() << Verbose(1) << "INFO: PlaneNormal is " << *PlaneNormal << " and PlaneOffset is " << *PlaneOffset << "." << endl; 229 238 factor = Direction.ScalarProduct(PlaneNormal); 230 if (fa ctor< MYEPSILON) { // Uniqueness: line parallel to plane?231 eLog() << Verbose(2) << "Line is parallel to plane, no intersection." << endl;239 if (fabs(factor) < MYEPSILON) { // Uniqueness: line parallel to plane? 240 Log() << Verbose(1) << "BAD: Line is parallel to plane, no intersection." << endl; 232 241 return false; 233 242 } … … 235 244 helper.SubtractVector(Origin); 236 245 factor = helper.ScalarProduct(PlaneNormal)/factor; 237 if (fa ctor< MYEPSILON) { // Origin is in-plane238 //Log() << Verbose(2) << "Origin of line is in-plane, simple." << endl;246 if (fabs(factor) < MYEPSILON) { // Origin is in-plane 247 Log() << Verbose(1) << "GOOD: Origin of line is in-plane." << endl; 239 248 CopyVector(Origin); 240 249 return true; … … 243 252 Direction.Scale(factor); 244 253 CopyVector(Origin); 245 //Log() << Verbose(4) << "INFO: Scaled direction is " << Direction << "." << endl;254 Log() << Verbose(1) << "INFO: Scaled direction is " << Direction << "." << endl; 246 255 AddVector(&Direction); 247 256 … … 250 259 helper.SubtractVector(PlaneOffset); 251 260 if (helper.ScalarProduct(PlaneNormal) < MYEPSILON) { 252 //Log() << Verbose(2) << "INFO: Intersection at " << *this << " is good." << endl;261 Log() << Verbose(1) << "GOOD: Intersection is " << *this << "." << endl; 253 262 return true; 254 263 } else { … … 286 295 287 296 /** Calculates the intersection of the two lines that are both on the same plane. 288 * We construct auxiliary plane with its vector normal to one line direction and the PlaneNormal, then a vector 289 * from the first line's offset onto the plane. Finally, scale by factor is 1/cos(angle(line1,line2..)) = 1/SP(...), and 290 * project onto the first line's direction and add its offset. 297 * This is taken from Weisstein, Eric W. "Line-Line Intersection." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Line-LineIntersection.html 291 298 * \param *out output stream for debugging 292 299 * \param *Line1a first vector of first line … … 299 306 bool Vector::GetIntersectionOfTwoLinesOnPlane(const Vector * const Line1a, const Vector * const Line1b, const Vector * const Line2a, const Vector * const Line2b, const Vector *PlaneNormal) 300 307 { 301 bool result = true; 302 Vector Direction, OtherDirection; 303 Vector AuxiliaryNormal; 304 Vector Distance; 305 const Vector *Normal = NULL; 306 Vector *ConstructedNormal = NULL; 307 bool FreeNormal = false; 308 309 // construct both direction vectors 310 Zero(); 311 Direction.CopyVector(Line1b); 312 Direction.SubtractVector(Line1a); 313 if (Direction.IsZero()) 308 Info FunctionInfo(__func__); 309 310 GSLMatrix *M = new GSLMatrix(4,4); 311 312 M->SetAll(1.); 313 for (int i=0;i<3;i++) { 314 M->Set(0, i, Line1a->x[i]); 315 M->Set(1, i, Line1b->x[i]); 316 M->Set(2, i, Line2a->x[i]); 317 M->Set(3, i, Line2b->x[i]); 318 } 319 320 //Log() << Verbose(1) << "Coefficent matrix is:" << endl; 321 //for (int i=0;i<4;i++) { 322 // for (int j=0;j<4;j++) 323 // cout << "\t" << M->Get(i,j); 324 // cout << endl; 325 //} 326 if (fabs(M->Determinant()) > MYEPSILON) { 327 Log() << Verbose(1) << "Determinant of coefficient matrix is NOT zero." << endl; 314 328 return false; 315 OtherDirection.CopyVector(Line2b); 316 OtherDirection.SubtractVector(Line2a); 317 if (OtherDirection.IsZero()) 329 } 330 Log() << Verbose(1) << "INFO: Line1a = " << *Line1a << ", Line1b = " << *Line1b << ", Line2a = " << *Line2a << ", Line2b = " << *Line2b << "." << endl; 331 332 333 // constuct a,b,c 334 Vector a; 335 Vector b; 336 Vector c; 337 Vector d; 338 a.CopyVector(Line1b); 339 a.SubtractVector(Line1a); 340 b.CopyVector(Line2b); 341 b.SubtractVector(Line2a); 342 c.CopyVector(Line2a); 343 c.SubtractVector(Line1a); 344 d.CopyVector(Line2b); 345 d.SubtractVector(Line1b); 346 Log() << Verbose(1) << "INFO: a = " << a << ", b = " << b << ", c = " << c << "." << endl; 347 if ((a.NormSquared() < MYEPSILON) || (b.NormSquared() < MYEPSILON)) { 348 Zero(); 349 Log() << Verbose(1) << "At least one of the lines is ill-defined, i.e. offset equals second vector." << endl; 350 return false; 351 } 352 353 // check for parallelity 354 Vector parallel; 355 double factor = 0.; 356 if (fabs(a.ScalarProduct(&b)*a.ScalarProduct(&b)/a.NormSquared()/b.NormSquared() - 1.) < MYEPSILON) { 357 parallel.CopyVector(Line1a); 358 parallel.SubtractVector(Line2a); 359 factor = parallel.ScalarProduct(&a)/a.Norm(); 360 if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) { 361 CopyVector(Line2a); 362 Log() << Verbose(1) << "Lines conincide." << endl; 363 return true; 364 } else { 365 parallel.CopyVector(Line1a); 366 parallel.SubtractVector(Line2b); 367 factor = parallel.ScalarProduct(&a)/a.Norm(); 368 if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) { 369 CopyVector(Line2b); 370 Log() << Verbose(1) << "Lines conincide." << endl; 371 return true; 372 } 373 } 374 Log() << Verbose(1) << "Lines are parallel." << endl; 375 Zero(); 318 376 return false; 319 320 Direction.Normalize(); 321 OtherDirection.Normalize(); 322 323 //Log() << Verbose(4) << "INFO: Normalized Direction " << Direction << " and OtherDirection " << OtherDirection << "." << endl; 324 325 if (fabs(OtherDirection.ScalarProduct(&Direction) - 1.) < MYEPSILON) { // lines are parallel 326 if ((Line1a == Line2a) || (Line1a == Line2b)) 327 CopyVector(Line1a); 328 else if ((Line1b == Line2b) || (Line1b == Line2b)) 329 CopyVector(Line1b); 330 else 331 return false; 332 Log() << Verbose(4) << "INFO: Intersection is " << *this << "." << endl; 333 return true; 334 } else { 335 // check whether we have a plane normal vector 336 if (PlaneNormal == NULL) { 337 ConstructedNormal = new Vector; 338 ConstructedNormal->MakeNormalVector(&Direction, &OtherDirection); 339 Normal = ConstructedNormal; 340 FreeNormal = true; 341 } else 342 Normal = PlaneNormal; 343 344 AuxiliaryNormal.MakeNormalVector(&OtherDirection, Normal); 345 //Log() << Verbose(4) << "INFO: PlaneNormal is " << *Normal << " and AuxiliaryNormal " << AuxiliaryNormal << "." << endl; 346 347 Distance.CopyVector(Line2a); 348 Distance.SubtractVector(Line1a); 349 //Log() << Verbose(4) << "INFO: Distance is " << Distance << "." << endl; 350 if (Distance.IsZero()) { 351 // offsets are equal, match found 352 CopyVector(Line1a); 353 result = true; 354 } else { 355 CopyVector(Distance.Projection(&AuxiliaryNormal)); 356 //Log() << Verbose(4) << "INFO: Projected Distance is " << *this << "." << endl; 357 double factor = Direction.ScalarProduct(&AuxiliaryNormal); 358 //Log() << Verbose(4) << "INFO: Scaling factor is " << factor << "." << endl; 359 Scale(1./(factor*factor)); 360 //Log() << Verbose(4) << "INFO: Scaled Distance is " << *this << "." << endl; 361 CopyVector(Projection(&Direction)); 362 //Log() << Verbose(4) << "INFO: Distance, projected into Direction, is " << *this << "." << endl; 363 if (this->IsZero()) 364 result = false; 365 else 366 result = true; 367 AddVector(Line1a); 368 } 369 370 if (FreeNormal) 371 delete(ConstructedNormal); 372 } 373 if (result) 374 Log() << Verbose(4) << "INFO: Intersection is " << *this << "." << endl; 375 376 return result; 377 } 378 379 // obtain s 380 double s; 381 Vector temp1, temp2; 382 temp1.CopyVector(&c); 383 temp1.VectorProduct(&b); 384 temp2.CopyVector(&a); 385 temp2.VectorProduct(&b); 386 Log() << Verbose(1) << "INFO: temp1 = " << temp1 << ", temp2 = " << temp2 << "." << endl; 387 if (fabs(temp2.NormSquared()) > MYEPSILON) 388 s = temp1.ScalarProduct(&temp2)/temp2.NormSquared(); 389 else 390 s = 0.; 391 Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(&temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl; 392 393 // construct intersection 394 CopyVector(&a); 395 Scale(s); 396 AddVector(Line1a); 397 Log() << Verbose(1) << "Intersection is at " << *this << "." << endl; 398 399 return true; 377 400 }; 378 401 -
tests/regression/Tesselation/1/post/NonConvexEnvelope.dat
rbd61b41 r271e17 20 20 5 6 8 21 21 6 7 8 22 2 7 8 22 23 1 2 7 23 2 7 824 24 1 2 3 -
tests/regression/Tesselation/1/post/NonConvexEnvelope.r3d
rbd61b41 r271e17 48 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 50 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 51 152 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.53 53 1 54 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. -
tests/regression/Tesselation/2/post/ConvexEnvelope.dat
rbd61b41 r271e17 20 20 5 6 8 21 21 6 7 8 22 2 7 8 22 23 1 2 7 23 2 7 824 24 1 2 3 -
tests/regression/Tesselation/2/post/ConvexEnvelope.r3d
rbd61b41 r271e17 48 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 50 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 51 152 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.53 53 1 54 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. -
tests/regression/Tesselation/2/post/NonConvexEnvelope.dat
rbd61b41 r271e17 20 20 5 6 8 21 21 6 7 8 22 2 7 8 22 23 1 2 7 23 2 7 824 24 1 2 3 -
tests/regression/Tesselation/2/post/NonConvexEnvelope.r3d
rbd61b41 r271e17 48 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 50 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 51 152 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.53 53 1 54 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0.
Note:
See TracChangeset
for help on using the changeset viewer.