| 1 | /* | 
|---|
| 2 | * tesselation.hpp | 
|---|
| 3 | * | 
|---|
| 4 | *  The tesselation class is meant to contain the envelope (concave, convex or neither) of a set of Vectors. | 
|---|
| 5 | *  As we actually mean this stuff for atoms, we have to encapsulate it all a bit. | 
|---|
| 6 | * | 
|---|
| 7 | *  Created on: Aug 3, 2009 | 
|---|
| 8 | *      Author: heber | 
|---|
| 9 | */ | 
|---|
| 10 |  | 
|---|
| 11 | #ifndef TESSELATION_HPP_ | 
|---|
| 12 | #define TESSELATION_HPP_ | 
|---|
| 13 |  | 
|---|
| 14 | using namespace std; | 
|---|
| 15 |  | 
|---|
| 16 | /*********************************************** includes ***********************************/ | 
|---|
| 17 |  | 
|---|
| 18 | // include config.h | 
|---|
| 19 | #ifdef HAVE_CONFIG_H | 
|---|
| 20 | #include <config.h> | 
|---|
| 21 | #endif | 
|---|
| 22 |  | 
|---|
| 23 | #include <map> | 
|---|
| 24 | #include <list> | 
|---|
| 25 | #include <set> | 
|---|
| 26 | #include <stack> | 
|---|
| 27 |  | 
|---|
| 28 | #include "Atom/atom_particleinfo.hpp" | 
|---|
| 29 | #include "BoundaryMaps.hpp" | 
|---|
| 30 | #include "BoundaryPointSet.hpp" | 
|---|
| 31 | #include "LinearAlgebra/Vector.hpp" | 
|---|
| 32 | #include "Atom/TesselPoint.hpp" | 
|---|
| 33 |  | 
|---|
| 34 |  | 
|---|
| 35 | /****************************************** forward declarations *****************************/ | 
|---|
| 36 |  | 
|---|
| 37 | class BoundaryPointSet; | 
|---|
| 38 | class BoundaryLineSet; | 
|---|
| 39 | class BoundaryTriangleSet; | 
|---|
| 40 | class CandidateForTesselation; | 
|---|
| 41 | class IPointCloud; | 
|---|
| 42 | class LinkedCell_deprecated; | 
|---|
| 43 | class Plane; | 
|---|
| 44 | class Tesselation; | 
|---|
| 45 |  | 
|---|
| 46 | /********************************************** definitions *********************************/ | 
|---|
| 47 |  | 
|---|
| 48 | enum { DoTecplotOutput=1 }; | 
|---|
| 49 | enum { DoRaster3DOutput=1 }; | 
|---|
| 50 | enum { DoVRMLOutput=0 }; | 
|---|
| 51 |  | 
|---|
| 52 | extern "C" const char *TecplotSuffix; | 
|---|
| 53 | extern "C" const char *Raster3DSuffix; | 
|---|
| 54 | extern "C" const char *VRMLSUffix; | 
|---|
| 55 |  | 
|---|
| 56 | extern "C" const double ParallelEpsilon; | 
|---|
| 57 |  | 
|---|
| 58 | // ======================================================= some template functions ========================================= | 
|---|
| 59 |  | 
|---|
| 60 | /********************************************** declarations *******************************/ | 
|---|
| 61 |  | 
|---|
| 62 | // =========================================================== class TESSELATION =========================================== | 
|---|
| 63 |  | 
|---|
| 64 | /** Is iterable container of TesselPoints. | 
|---|
| 65 | */ | 
|---|
| 66 | class Tesselation { | 
|---|
| 67 | public: | 
|---|
| 68 |  | 
|---|
| 69 | Tesselation(); | 
|---|
| 70 | virtual ~Tesselation(); | 
|---|
| 71 |  | 
|---|
| 72 | void operator()(IPointCloud & cloud, const double SPHERERADIUS); | 
|---|
| 73 | double getVolumeOfConvexEnvelope(const bool IsAngstroem) const; | 
|---|
| 74 | double getAreaOfEnvelope(const bool IsAngstroem) const; | 
|---|
| 75 |  | 
|---|
| 76 | void AddTesselationPoint(TesselPoint* Candidate, const int n); | 
|---|
| 77 | void SetTesselationPoint(TesselPoint* Candidate, const int n) const; | 
|---|
| 78 | void AddTesselationLine(const Vector * OptCenter, const BoundaryPointSet * const candidate, class BoundaryPointSet *a, class BoundaryPointSet *b, const int n); | 
|---|
| 79 | void AddNewTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n); | 
|---|
| 80 | void AddExistingTesselationTriangleLine(class BoundaryLineSet *FindLine, int n); | 
|---|
| 81 | void AddTesselationTriangle(); | 
|---|
| 82 | void AddTesselationTriangle(const int nr); | 
|---|
| 83 | void AddCandidateTriangle(CandidateForTesselation &CandidateLine, enum centers type); | 
|---|
| 84 | void AddDegeneratedTriangle(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell_deprecated *LC); | 
|---|
| 85 | void AddCandidatePolygon(CandidateForTesselation CandidateLine, const double RADIUS, const LinkedCell_deprecated *LC); | 
|---|
| 86 | void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle); | 
|---|
| 87 | void RemoveTesselationLine(class BoundaryLineSet *line); | 
|---|
| 88 | void RemoveTesselationPoint(class BoundaryPointSet *point); | 
|---|
| 89 | bool CheckDegeneracy(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell_deprecated *LC) const; | 
|---|
| 90 |  | 
|---|
| 91 |  | 
|---|
| 92 | // concave envelope | 
|---|
| 93 | bool FindStartingTriangle(const double RADIUS, const LinkedCell_deprecated *LC); | 
|---|
| 94 | void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell_deprecated *LC); | 
|---|
| 95 | void FindThirdPointForTesselation(const Vector &NormalVector, const Vector &SearchDirection, const Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class BoundaryPointSet  * const ThirdNode, const double RADIUS, const LinkedCell_deprecated *LC) const; | 
|---|
| 96 | bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, const BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell_deprecated *LC); | 
|---|
| 97 | bool FindCandidatesforOpenLines(const double RADIUS, const LinkedCell_deprecated *&LCList); | 
|---|
| 98 | int CheckPresenceOfTriangle(class TesselPoint *Candidates[3]) const; | 
|---|
| 99 | class BoundaryTriangleSet * GetPresentTriangle(TesselPoint *Candidates[3]); | 
|---|
| 100 |  | 
|---|
| 101 | // convex envelope | 
|---|
| 102 | void TesselateOnBoundary(IPointCloud & cloud); | 
|---|
| 103 | void GuessStartingTriangle(); | 
|---|
| 104 | bool InsertStraddlingPoints(IPointCloud & cloud, const LinkedCell_deprecated *LC); | 
|---|
| 105 | double RemovePointFromTesselatedSurface(class BoundaryPointSet *point); | 
|---|
| 106 | class BoundaryLineSet * FlipBaseline(class BoundaryLineSet *Base); | 
|---|
| 107 | double PickFarthestofTwoBaselines(class BoundaryLineSet *Base); | 
|---|
| 108 | class BoundaryPointSet *IsConvexRectangle(class BoundaryLineSet *Base); | 
|---|
| 109 | IndexToIndex * FindAllDegeneratedTriangles(); | 
|---|
| 110 | IndexToIndex * FindAllDegeneratedLines(); | 
|---|
| 111 | void RemoveDegeneratedTriangles(); | 
|---|
| 112 | void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell_deprecated *LC); | 
|---|
| 113 | int CorrectAllDegeneratedPolygons(); | 
|---|
| 114 |  | 
|---|
| 115 | TesselPointSet * GetAllConnectedPoints(const TesselPoint* const Point) const; | 
|---|
| 116 | TriangleSet * GetAllTriangles(const BoundaryPointSet * const Point) const; | 
|---|
| 117 | ListOfTesselPointList * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; | 
|---|
| 118 | ListOfTesselPointList * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; | 
|---|
| 119 | TesselPointList * GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector &Reference) const; | 
|---|
| 120 | TesselPointList * GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector &Reference) const; | 
|---|
| 121 | class BoundaryPointSet * GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; | 
|---|
| 122 | TriangleList * FindTriangles(const TesselPoint* const Points[3]) const; | 
|---|
| 123 | TriangleList * FindClosestTrianglesToVector(const Vector &x, const LinkedCell_deprecated* LC) const; | 
|---|
| 124 | BoundaryTriangleSet * FindClosestTriangleToVector(const Vector &x, const LinkedCell_deprecated* LC) const; | 
|---|
| 125 | bool IsInnerPoint(const Vector &Point, const LinkedCell_deprecated* const LC) const; | 
|---|
| 126 | Vector getNormal(const Vector &Point, const LinkedCell_deprecated* const LC) const; | 
|---|
| 127 | double GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const; | 
|---|
| 128 | double GetDistanceToSurface(const Vector &Point, const LinkedCell_deprecated* const LC) const; | 
|---|
| 129 | BoundaryTriangleSet * GetClosestTriangleOnSurface(const Vector &Point, const LinkedCell_deprecated* const LC) const; | 
|---|
| 130 | bool AddBoundaryPoint(TesselPoint * Walker, const int n); | 
|---|
| 131 | DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector &x, const LinkedCell_deprecated* LC) const; | 
|---|
| 132 | BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector &x, const LinkedCell_deprecated* LC) const; | 
|---|
| 133 |  | 
|---|
| 134 | // print for debugging | 
|---|
| 135 | void PrintAllBoundaryPoints(ofstream *out) const; | 
|---|
| 136 | void PrintAllBoundaryLines(ofstream *out) const; | 
|---|
| 137 | void PrintAllBoundaryTriangles(ofstream *out) const; | 
|---|
| 138 |  | 
|---|
| 139 | // store envelope in file | 
|---|
| 140 | void Output(const char *filename, IPointCloud & cloud); | 
|---|
| 141 |  | 
|---|
| 142 | PointMap PointsOnBoundary; | 
|---|
| 143 | LineMap LinesOnBoundary; | 
|---|
| 144 | CandidateMap OpenLines; | 
|---|
| 145 | TriangleMap TrianglesOnBoundary; | 
|---|
| 146 | int PointsOnBoundaryCount; | 
|---|
| 147 | int LinesOnBoundaryCount; | 
|---|
| 148 | int TrianglesOnBoundaryCount; | 
|---|
| 149 |  | 
|---|
| 150 | typedef PointMap::iterator iterator; | 
|---|
| 151 | typedef PointMap::const_iterator const_iterator; | 
|---|
| 152 | iterator begin() { return PointsOnBoundary.begin(); } | 
|---|
| 153 | const_iterator begin() const { return PointsOnBoundary.begin(); } | 
|---|
| 154 | iterator end() { return PointsOnBoundary.end(); } | 
|---|
| 155 | const_iterator end() const { return PointsOnBoundary.end(); } | 
|---|
| 156 |  | 
|---|
| 157 | class BoundaryPointSet *BPS[2]; | 
|---|
| 158 | class BoundaryLineSet *BLS[3]; | 
|---|
| 159 | class BoundaryTriangleSet *BTS; | 
|---|
| 160 | class BoundaryTriangleSet *LastTriangle; | 
|---|
| 161 | int TriangleFilesWritten; | 
|---|
| 162 |  | 
|---|
| 163 | private: | 
|---|
| 164 | static const double HULLEPSILON; //!< TODO: Get rid of HULLEPSILON, points to numerical instabilities | 
|---|
| 165 |  | 
|---|
| 166 | mutable class BoundaryPointSet *TPS[3]; //this is a Storage for pointers to triangle points, this and BPS[2] needed due to AddLine restrictions | 
|---|
| 167 |  | 
|---|
| 168 | mutable PointMap::const_iterator InternalPointer; | 
|---|
| 169 |  | 
|---|
| 170 | //bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell_deprecated * const LC) const; | 
|---|
| 171 | void FindDegeneratedCandidatesforOpenLines(TesselPoint * const Sprinter, const Vector * const OptCenter); | 
|---|
| 172 | }; | 
|---|
| 173 |  | 
|---|
| 174 | #endif /* TESSELATION_HPP_ */ | 
|---|