Changes in src/tesselation.hpp [d74077:952f38]
- File:
-
- 1 edited
-
src/tesselation.hpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/tesselation.hpp
rd74077 r952f38 2 2 * tesselation.hpp 3 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. 4 * The tesselation class is meant to contain the envelope (concave, convex or neither) of a set of Vectors. As we actually mean this stuff for atoms, we have to encapsulate it all a bit. 6 5 * 7 6 * Created on: Aug 3, 2009 … … 26 25 #include <stack> 27 26 28 #include "BoundaryMaps.hpp"29 #include "PointCloud.hpp"30 #include "TesselPoint.hpp"31 27 #include "atom_particleinfo.hpp" 32 #include "helpers.hpp" 33 #include "vector.hpp" 34 28 #include "Helpers/helpers.hpp" 29 #include "LinearAlgebra/Vector.hpp" 35 30 36 31 /****************************************** forward declarations *****************************/ … … 39 34 class BoundaryLineSet; 40 35 class BoundaryTriangleSet; 41 class CandidateForTesselation;42 36 class LinkedCell; 37 class TesselPoint; 38 class PointCloud; 43 39 class Tesselation; 44 40 class Plane; … … 57 53 // ======================================================= some template functions ========================================= 58 54 55 #define IndexToIndex map <int, int> 56 57 #define PointMap map < int, class BoundaryPointSet * > 58 #define PointSet set < class BoundaryPointSet * > 59 #define PointList list < class BoundaryPointSet * > 60 #define PointPair pair < int, class BoundaryPointSet * > 61 #define PointTestPair pair < PointMap::iterator, bool > 62 63 #define CandidateList list <class CandidateForTesselation *> 64 #define CandidateMap map <class BoundaryLineSet *, class CandidateForTesselation *> 65 66 #define LineMap multimap < int, class BoundaryLineSet * > 67 #define LineSet set < class BoundaryLineSet * > 68 #define LineList list < class BoundaryLineSet * > 69 #define LinePair pair < int, class BoundaryLineSet * > 70 #define LineTestPair pair < LineMap::iterator, bool > 71 72 #define TriangleMap map < int, class BoundaryTriangleSet * > 73 #define TriangleSet set < class BoundaryTriangleSet * > 74 #define TriangleList list < class BoundaryTriangleSet * > 75 #define TrianglePair pair < int, class BoundaryTriangleSet * > 76 #define TriangleTestPair pair < TrianglePair::iterator, bool > 77 78 #define PolygonMap map < int, class BoundaryPolygonSet * > 79 #define PolygonSet set < class BoundaryPolygonSet * > 80 #define PolygonList list < class BoundaryPolygonSet * > 81 82 #define DistanceToPointMap multimap <double, class BoundaryPointSet * > 83 #define DistanceToPointPair pair <double, class BoundaryPointSet * > 84 85 #define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> > 86 #define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> > 87 88 #define TesselPointList list <TesselPoint *> 89 #define TesselPointSet set <TesselPoint *> 90 91 #define ListOfTesselPointList list<list <TesselPoint *> *> 92 93 enum centers {Opt, OtherOpt}; 94 59 95 /********************************************** declarations *******************************/ 96 97 template <typename T> void SetEndpointsOrdered(T endpoints[2], T endpoint1, T endpoint2) 98 { 99 if (endpoint1->Nr < endpoint2->Nr) { 100 endpoints[0] = endpoint1; 101 endpoints[1] = endpoint2; 102 } else { 103 endpoints[0] = endpoint2; 104 endpoints[1] = endpoint1; 105 } 106 }; 107 108 // ======================================================== class BoundaryPointSet ========================================= 109 110 class BoundaryPointSet { 111 public: 112 BoundaryPointSet(); 113 BoundaryPointSet(TesselPoint * const Walker); 114 ~BoundaryPointSet(); 115 116 void AddLine(BoundaryLineSet * const line); 117 118 LineMap lines; 119 int LinesCount; 120 TesselPoint *node; 121 double value; 122 int Nr; 123 }; 124 125 ostream & operator << (ostream &ost, const BoundaryPointSet &a); 126 127 // ======================================================== class BoundaryLineSet ========================================== 128 129 class BoundaryLineSet { 130 public: 131 BoundaryLineSet(); 132 BoundaryLineSet(BoundaryPointSet * const Point[2], const int number); 133 BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number); 134 ~BoundaryLineSet(); 135 136 void AddTriangle(BoundaryTriangleSet * const triangle); 137 bool IsConnectedTo(const BoundaryLineSet * const line) const; 138 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 139 bool CheckConvexityCriterion() const; 140 double CalculateConvexity() const; 141 class BoundaryPointSet *GetOtherEndpoint(const BoundaryPointSet * const point) const; 142 class BoundaryTriangleSet *GetOtherTriangle(const BoundaryTriangleSet * const triangle) const; 143 144 class BoundaryPointSet *endpoints[2]; 145 TriangleMap triangles; 146 int Nr; 147 bool skipped; 148 }; 149 150 ostream & operator << (ostream &ost, const BoundaryLineSet &a); 151 152 // ======================================================== class BoundaryTriangleSet ======================================= 153 154 class BoundaryTriangleSet { 155 public: 156 BoundaryTriangleSet(); 157 BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number); 158 ~BoundaryTriangleSet(); 159 160 void GetNormalVector(const Vector &NormalVector); 161 void GetCenter(Vector * const center) const; 162 bool GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const; 163 double GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const; 164 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 165 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 166 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 167 class BoundaryPointSet *GetThirdEndpoint(const BoundaryLineSet * const line) const; 168 class BoundaryLineSet *GetThirdLine(const BoundaryPointSet * const point) const; 169 bool IsPresentTupel(const BoundaryPointSet * const Points[3]) const; 170 bool IsPresentTupel(const BoundaryTriangleSet * const T) const; 171 172 Plane getPlane() const; 173 Vector getEndpoint(int) const; 174 std::string getEndpointName(int) const; 175 176 class BoundaryPointSet *endpoints[3]; 177 class BoundaryLineSet *lines[3]; 178 Vector NormalVector; 179 Vector SphereCenter; 180 int Nr; 181 182 private: 183 184 }; 185 186 ostream & operator << (ostream &ost, const BoundaryTriangleSet &a); 187 188 189 // ======================================================== class BoundaryTriangleSet ======================================= 190 191 /** Set of BoundaryPointSet. 192 * This is just meant as a container for a group of endpoints, extending the node, line, triangle concept. However, this has 193 * only marginally something to do with the tesselation. Hence, there is no incorporation into the bookkeeping of the Tesselation 194 * class (i.e. no allocation, no deletion). 195 * \note we assume that the set of endpoints reside (more or less) on a plane. 196 */ 197 class BoundaryPolygonSet { 198 public: 199 BoundaryPolygonSet(); 200 ~BoundaryPolygonSet(); 201 202 Vector * GetNormalVector(const Vector &NormalVector) const; 203 void GetCenter(Vector *center) const; 204 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 205 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 206 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 207 bool ContainsBoundaryTriangle(const BoundaryTriangleSet * const point) const; 208 bool ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const; 209 bool ContainsPresentTupel(const BoundaryPolygonSet * const P) const; 210 bool ContainsPresentTupel(const PointSet &endpoints) const; 211 TriangleSet * GetAllContainedTrianglesFromEndpoints() const; 212 bool FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line); 213 214 PointSet endpoints; 215 int Nr; 216 }; 217 218 ostream & operator << (ostream &ost, const BoundaryPolygonSet &a); 219 220 // =========================================================== class TESSELPOINT =========================================== 221 222 /** Is a single point of the set of Vectors, also a super-class to be inherited and and its functions to be implemented. 223 */ 224 class TesselPoint : virtual public ParticleInfo { 225 public: 226 TesselPoint(); 227 virtual ~TesselPoint(); 228 229 Vector *node; // pointer to position of the dot in space 230 231 virtual ostream & operator << (ostream &ost); 232 }; 233 234 ostream & operator << (ostream &ost, const TesselPoint &a); 235 236 // =========================================================== class POINTCLOUD ============================================ 237 238 /** Super-class for all point clouds structures, also molecules. They have to inherit this structure and implement the virtual function to access the Vectors. 239 * This basically encapsulates a list structure. 240 */ 241 class PointCloud { 242 public: 243 PointCloud(); 244 virtual ~PointCloud(); 245 246 virtual const char * const GetName() const { return "unknown"; }; 247 virtual Vector *GetCenter() const { return NULL; }; 248 virtual TesselPoint *GetPoint() const { return NULL; }; 249 virtual int GetMaxId() const { return 0; }; 250 virtual void GoToNext() const {}; 251 virtual void GoToFirst() const {}; 252 virtual bool IsEmpty() const { return true; }; 253 virtual bool IsEnd() const { return true; }; 254 }; 255 256 // ======================================================== class CandidateForTesselation ========================================= 257 258 class CandidateForTesselation { 259 public : 260 CandidateForTesselation(BoundaryLineSet* currentBaseLine); 261 CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, BoundaryPointSet *point, Vector OptCandidateCenter, Vector OtherOptCandidateCenter); 262 ~CandidateForTesselation(); 263 264 bool CheckValidity(const double RADIUS, const LinkedCell *LC) const; 265 266 TesselPointList pointlist; 267 const BoundaryLineSet * BaseLine; 268 const BoundaryPointSet * ThirdPoint; 269 const BoundaryTriangleSet *T; 270 Vector OldCenter; 271 Vector OptCenter; 272 Vector OtherOptCenter; 273 double ShortestAngle; 274 double OtherShortestAngle; 275 }; 276 277 ostream & operator <<(ostream &ost, const CandidateForTesselation &a); 60 278 61 279 // =========================================================== class TESSELATION =========================================== … … 71 289 void AddTesselationPoint(TesselPoint* Candidate, const int n); 72 290 void SetTesselationPoint(TesselPoint* Candidate, const int n) const; 73 void AddTesselationLine(const Vector * OptCenter, const BoundaryPointSet * const candidate, class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);291 void AddTesselationLine(const Vector * const OptCenter, const BoundaryPointSet * const candidate, class BoundaryPointSet *a, class BoundaryPointSet *b, const int n); 74 292 void AddNewTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n); 75 293 void AddExistingTesselationTriangleLine(class BoundaryLineSet *FindLine, int n); … … 112 330 ListOfTesselPointList * GetPathsOfConnectedPoints(const TesselPoint* const Point) const; 113 331 ListOfTesselPointList * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 114 TesselPointList * GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector &Reference) const;115 TesselPointList * GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector &Reference) const;332 TesselPointList * GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const; 333 TesselPointList * GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const; 116 334 class BoundaryPointSet * GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 117 335 TriangleList * FindTriangles(const TesselPoint* const Points[3]) const; 118 TriangleList * FindClosestTrianglesToVector(const Vector &x, const LinkedCell* LC) const;119 BoundaryTriangleSet * FindClosestTriangleToVector(const Vector &x, const LinkedCell* LC) const;336 TriangleList * FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const; 337 BoundaryTriangleSet * FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const; 120 338 bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const; 121 339 double GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const; … … 123 341 BoundaryTriangleSet * GetClosestTriangleOnSurface(const Vector &Point, const LinkedCell* const LC) const; 124 342 bool AddBoundaryPoint(TesselPoint * Walker, const int n); 125 DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector &x, const LinkedCell* LC) const;126 BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector &x, const LinkedCell* LC) const;343 DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const; 344 BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const; 127 345 128 346 // print for debugging
Note:
See TracChangeset
for help on using the changeset viewer.
