source: molecuilder/src/tesselation.hpp@ ff4611

Last change on this file since ff4611 was ff4611, checked in by Frederik Heber <heber@…>, 16 years ago

Attempt to fix the embedding.

Basically it would be working, but there was some failures with the FindClosestTriangleToPoint() routines.
We get triangles wrong if we start looking for the closest point. Actually, we should really look at each
triangle and check the distance. Now, we look at least at each line, but code is unfinished and crashes at the end
unexplainedly.

  • Property mode set to 100644
File size: 14.4 KB
Line 
1/*
2 * tesselation.hpp
3 *
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.
5 *
6 * Created on: Aug 3, 2009
7 * Author: heber
8 */
9
10#ifndef TESSELATION_HPP_
11#define TESSELATION_HPP_
12
13using namespace std;
14
15/*********************************************** includes ***********************************/
16
17// include config.h
18#ifdef HAVE_CONFIG_H
19#include <config.h>
20#endif
21
22#include <map>
23#include <list>
24#include <set>
25#include <stack>
26
27#include "atom_particleinfo.hpp"
28#include "helpers.hpp"
29#include "vector.hpp"
30
31/****************************************** forward declarations *****************************/
32
33class BoundaryPointSet;
34class BoundaryLineSet;
35class BoundaryTriangleSet;
36class LinkedCell;
37class TesselPoint;
38class PointCloud;
39class Tesselation;
40
41/********************************************** definitions *********************************/
42
43#define DoTecplotOutput 1
44#define DoRaster3DOutput 1
45#define DoVRMLOutput 1
46#define TecplotSuffix ".dat"
47#define Raster3DSuffix ".r3d"
48#define VRMLSUffix ".wrl"
49
50#define ParallelEpsilon 1e-3
51
52// ======================================================= some template functions =========================================
53
54#define PointMap map < int, class BoundaryPointSet * >
55#define PointSet set < class BoundaryPointSet * >
56#define PointList list < class BoundaryPointSet * >
57#define PointPair pair < int, class BoundaryPointSet * >
58#define PointTestPair pair < PointMap::iterator, bool >
59
60#define CandidateList list <class CandidateForTesselation *>
61#define CandidateMap map <class BoundaryLineSet *, class CandidateForTesselation *>
62
63#define LineMap multimap < int, class BoundaryLineSet * >
64#define LineSet set < class BoundaryLineSet * >
65#define LineList list < class BoundaryLineSet * >
66#define LinePair pair < int, class BoundaryLineSet * >
67#define LineTestPair pair < LineMap::iterator, bool >
68
69#define TriangleMap map < int, class BoundaryTriangleSet * >
70#define TriangleSet set < class BoundaryTriangleSet * >
71#define TriangleList list < class BoundaryTriangleSet * >
72#define TrianglePair pair < int, class BoundaryTriangleSet * >
73#define TriangleTestPair pair < TrianglePair::iterator, bool >
74
75#define PolygonMap map < int, class BoundaryPolygonSet * >
76#define PolygonSet set < class BoundaryPolygonSet * >
77#define PolygonList list < class BoundaryPolygonSet * >
78
79#define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> >
80#define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> >
81
82#define TesselPointList list <TesselPoint *>
83#define TesselPointSet set <TesselPoint *>
84
85/********************************************** declarations *******************************/
86
87template <typename T> void SetEndpointsOrdered(T endpoints[2], T endpoint1, T endpoint2)
88{
89 if (endpoint1->Nr < endpoint2->Nr) {
90 endpoints[0] = endpoint1;
91 endpoints[1] = endpoint2;
92 } else {
93 endpoints[0] = endpoint2;
94 endpoints[1] = endpoint1;
95 }
96};
97
98// ======================================================== class BoundaryPointSet =========================================
99
100class BoundaryPointSet {
101 public:
102 BoundaryPointSet();
103 BoundaryPointSet(TesselPoint * Walker);
104 ~BoundaryPointSet();
105
106 void AddLine(class BoundaryLineSet *line);
107
108 LineMap lines;
109 int LinesCount;
110 TesselPoint *node;
111 double value;
112 int Nr;
113};
114
115ostream & operator << (ostream &ost, const BoundaryPointSet &a);
116
117// ======================================================== class BoundaryLineSet ==========================================
118
119class BoundaryLineSet {
120 public:
121 BoundaryLineSet();
122 BoundaryLineSet(class BoundaryPointSet *Point[2], const int number);
123 ~BoundaryLineSet();
124
125 void AddTriangle(class BoundaryTriangleSet *triangle);
126 bool IsConnectedTo(class BoundaryLineSet *line);
127 bool ContainsBoundaryPoint(class BoundaryPointSet *point);
128 bool CheckConvexityCriterion();
129 class BoundaryPointSet *GetOtherEndpoint(class BoundaryPointSet *);
130
131 class BoundaryPointSet *endpoints[2];
132 TriangleMap triangles;
133 int Nr;
134 bool skipped;
135};
136
137ostream & operator << (ostream &ost, const BoundaryLineSet &a);
138
139// ======================================================== class BoundaryTriangleSet =======================================
140
141class BoundaryTriangleSet {
142 public:
143 BoundaryTriangleSet();
144 BoundaryTriangleSet(class BoundaryLineSet *line[3], int number);
145 ~BoundaryTriangleSet();
146
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);
156
157 class BoundaryPointSet *endpoints[3];
158 class BoundaryLineSet *lines[3];
159 Vector NormalVector;
160 Vector SphereCenter;
161 int Nr;
162};
163
164ostream & operator << (ostream &ost, const BoundaryTriangleSet &a);
165
166
167// ======================================================== class BoundaryTriangleSet =======================================
168
169/** Set of BoundaryPointSet.
170 * This is just meant as a container for a group of endpoints, extending the node, line, triangle concept. However, this has
171 * only marginally something to do with the tesselation. Hence, there is no incorporation into the bookkeeping of the Tesselation
172 * class (i.e. no allocation, no deletion).
173 * \note we assume that the set of endpoints reside (more or less) on a plane.
174 */
175class BoundaryPolygonSet {
176 public:
177 BoundaryPolygonSet();
178 ~BoundaryPolygonSet();
179
180 Vector * GetNormalVector(const Vector &NormalVector) const;
181 void GetCenter(Vector *center) const;
182 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const;
183 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
184 bool ContainsBoundaryPoint(const TesselPoint * const point) const;
185 bool ContainsBoundaryTriangle(const BoundaryTriangleSet * const point) const;
186 bool ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const;
187 bool ContainsPresentTupel(const BoundaryPolygonSet * const P) const;
188 bool ContainsPresentTupel(const PointSet &endpoints) const;
189 TriangleSet * GetAllContainedTrianglesFromEndpoints() const;
190 bool FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line);
191
192 PointSet endpoints;
193 int Nr;
194};
195
196ostream & operator << (ostream &ost, const BoundaryPolygonSet &a);
197
198// =========================================================== class TESSELPOINT ===========================================
199
200/** Is a single point of the set of Vectors, also a super-class to be inherited and and its functions to be implemented.
201 */
202class TesselPoint : virtual public ParticleInfo {
203public:
204 TesselPoint();
205 virtual ~TesselPoint();
206
207 Vector *node; // pointer to position of the dot in space
208
209 virtual ostream & operator << (ostream &ost);
210};
211
212ostream & operator << (ostream &ost, const TesselPoint &a);
213
214// =========================================================== class POINTCLOUD ============================================
215
216/** Super-class for all point clouds structures, also molecules. They have to inherit this structure and implement the virtual function to access the Vectors.
217 * This basically encapsulates a list structure.
218 */
219class PointCloud {
220public:
221 PointCloud();
222 virtual ~PointCloud();
223
224 virtual const char * const GetName() const { return "unknown"; };
225 virtual Vector *GetCenter() const { return NULL; };
226 virtual TesselPoint *GetPoint() const { return NULL; };
227 virtual TesselPoint *GetTerminalPoint() const { return NULL; };
228 virtual int GetMaxId() const { return 0; };
229 virtual void GoToNext() const {};
230 virtual void GoToPrevious() const {};
231 virtual void GoToFirst() const {};
232 virtual void GoToLast() const {};
233 virtual bool IsEmpty() const { return true; };
234 virtual bool IsEnd() const { return true; };
235};
236
237// ======================================================== class CandidateForTesselation =========================================
238
239class CandidateForTesselation {
240 public :
241 CandidateForTesselation(BoundaryLineSet* currentBaseLine);
242 CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, Vector OptCandidateCenter, Vector OtherOptCandidateCenter);
243 ~CandidateForTesselation();
244
245 TesselPointList pointlist;
246 BoundaryLineSet *BaseLine;
247 Vector OptCenter;
248 Vector OtherOptCenter;
249 double ShortestAngle;
250 double OtherShortestAngle;
251};
252
253ostream & operator <<(ostream &ost, const CandidateForTesselation &a);
254
255// =========================================================== class TESSELATION ===========================================
256
257/** Contains the envelope to a PointCloud.
258 */
259class Tesselation : public PointCloud {
260 public:
261
262 Tesselation();
263 virtual ~Tesselation();
264
265 void AddTesselationPoint(TesselPoint* Candidate, const int n);
266 void SetTesselationPoint(TesselPoint* Candidate, const int n) const;
267 void AddTesselationLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
268 void AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
269 void AddTesselationTriangle();
270 void AddTesselationTriangle(const int nr);
271 void AddCandidateTriangle(CandidateForTesselation CandidateLine);
272 void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle);
273 void RemoveTesselationLine(class BoundaryLineSet *line);
274 void RemoveTesselationPoint(class BoundaryPointSet *point);
275
276
277 // concave envelope
278 void FindStartingTriangle(const double RADIUS, const LinkedCell *LC);
279 void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC);
280 void FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint * const ThirdNode, const double RADIUS, const LinkedCell *LC) const;
281 bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC);
282 int CheckPresenceOfTriangle(class TesselPoint *Candidates[3]) const;
283 class BoundaryTriangleSet * GetPresentTriangle(TesselPoint *Candidates[3]);
284
285 // convex envelope
286 void TesselateOnBoundary(const PointCloud * const cloud);
287 void GuessStartingTriangle();
288 bool InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC);
289 double RemovePointFromTesselatedSurface(class BoundaryPointSet *point);
290 class BoundaryLineSet * FlipBaseline(class BoundaryLineSet *Base);
291 double PickFarthestofTwoBaselines(class BoundaryLineSet *Base);
292 class BoundaryPointSet *IsConvexRectangle(class BoundaryLineSet *Base);
293 map<int, int> * FindAllDegeneratedTriangles();
294 map<int, int> * FindAllDegeneratedLines();
295 void RemoveDegeneratedTriangles();
296 void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC);
297 int CorrectAllDegeneratedPolygons();
298
299 set<TesselPoint*> * GetAllConnectedPoints(const TesselPoint* const Point) const;
300 set<BoundaryTriangleSet*> *GetAllTriangles(const BoundaryPointSet * const Point) const;
301 list<list<TesselPoint*> *> * GetPathsOfConnectedPoints(const TesselPoint* const Point) const;
302 list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const;
303 list<TesselPoint*> * GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const;
304 list<TesselPoint*> * GetCircleOfConnectedTriangles(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const;
305 class BoundaryPointSet *GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const;
306 list<BoundaryTriangleSet*> *FindTriangles(const TesselPoint* const Points[3]) const;
307 list<BoundaryTriangleSet*> * FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const;
308 class BoundaryTriangleSet * FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const;
309 bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC, const double epsilon = -MYEPSILON) const;
310 bool IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC, const double epsilon = -MYEPSILON) const;
311 bool AddBoundaryPoint(TesselPoint * Walker, const int n);
312 TesselPoint* FindSecondClosestBoundaryPoint(const Vector* Point, const LinkedCell* const LC) const;
313 TesselPoint* FindClosestBoundaryPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC) const;
314
315 // print for debugging
316 void PrintAllBoundaryPoints(ofstream *out) const;
317 void PrintAllBoundaryLines(ofstream *out) const;
318 void PrintAllBoundaryTriangles(ofstream *out) const;
319
320 // store envelope in file
321 void Output(const char *filename, const PointCloud * const cloud);
322
323 PointMap PointsOnBoundary;
324 LineMap LinesOnBoundary;
325 CandidateMap OpenLines;
326 TriangleMap TrianglesOnBoundary;
327 int PointsOnBoundaryCount;
328 int LinesOnBoundaryCount;
329 int TrianglesOnBoundaryCount;
330
331 // PointCloud implementation for PointsOnBoundary
332 virtual Vector *GetCenter(ofstream *out) const;
333 virtual TesselPoint *GetPoint() const;
334 virtual TesselPoint *GetTerminalPoint() const;
335 virtual void GoToNext() const;
336 virtual void GoToPrevious() const;
337 virtual void GoToFirst() const;
338 virtual void GoToLast() const;
339 virtual bool IsEmpty() const;
340 virtual bool IsEnd() const;
341
342 class BoundaryPointSet *BPS[2];
343 class BoundaryLineSet *BLS[3];
344 class BoundaryTriangleSet *BTS;
345 class BoundaryTriangleSet *LastTriangle;
346 int TriangleFilesWritten;
347
348 private:
349 mutable class BoundaryPointSet *TPS[3]; //this is a Storage for pointers to triangle points, this and BPS[2] needed due to AddLine restrictions
350
351 mutable PointMap::const_iterator InternalPointer;
352
353 //bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const;
354};
355
356
357#endif /* TESSELATION_HPP_ */
Note: See TracBrowser for help on using the repository browser.