source: src/tesselation.hpp@ f07f86d

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since f07f86d was f07f86d, checked in by Frederik Heber <heber@…>, 15 years ago

Rewrite of tesselation procedure: treatment of degenerated triangles.

The central idea is that when matching open lines are present, then we have to check whether candidate matches desired ThirdPoint and that the calculated OptCenter matches as well. The latter is essential for degenerated triangles, that can only be decerned by their (Other)OptCenter.

Asparagine is now tesselated correctly from radius 1.5 up to 25.

  • Property mode set to 100644
File size: 16.0 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 0
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 IndexToIndex map <int, int>
55
56#define PointMap map < int, class BoundaryPointSet * >
57#define PointSet set < class BoundaryPointSet * >
58#define PointList list < class BoundaryPointSet * >
59#define PointPair pair < int, class BoundaryPointSet * >
60#define PointTestPair pair < PointMap::iterator, bool >
61
62#define CandidateList list <class CandidateForTesselation *>
63#define CandidateMap map <class BoundaryLineSet *, class CandidateForTesselation *>
64
65#define LineMap multimap < int, class BoundaryLineSet * >
66#define LineSet set < class BoundaryLineSet * >
67#define LineList list < class BoundaryLineSet * >
68#define LinePair pair < int, class BoundaryLineSet * >
69#define LineTestPair pair < LineMap::iterator, bool >
70
71#define TriangleMap map < int, class BoundaryTriangleSet * >
72#define TriangleSet set < class BoundaryTriangleSet * >
73#define TriangleList list < class BoundaryTriangleSet * >
74#define TrianglePair pair < int, class BoundaryTriangleSet * >
75#define TriangleTestPair pair < TrianglePair::iterator, bool >
76
77#define PolygonMap map < int, class BoundaryPolygonSet * >
78#define PolygonSet set < class BoundaryPolygonSet * >
79#define PolygonList list < class BoundaryPolygonSet * >
80
81#define DistanceToPointMap multimap <double, class BoundaryPointSet * >
82#define DistanceToPointPair pair <double, class BoundaryPointSet * >
83
84#define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> >
85#define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> >
86
87#define TesselPointList list <TesselPoint *>
88#define TesselPointSet set <TesselPoint *>
89
90#define ListOfTesselPointList list<list <TesselPoint *> *>
91
92/********************************************** declarations *******************************/
93
94template <typename T> void SetEndpointsOrdered(T endpoints[2], T endpoint1, T endpoint2)
95{
96 if (endpoint1->Nr < endpoint2->Nr) {
97 endpoints[0] = endpoint1;
98 endpoints[1] = endpoint2;
99 } else {
100 endpoints[0] = endpoint2;
101 endpoints[1] = endpoint1;
102 }
103};
104
105// ======================================================== class BoundaryPointSet =========================================
106
107class BoundaryPointSet {
108 public:
109 BoundaryPointSet();
110 BoundaryPointSet(TesselPoint * const Walker);
111 ~BoundaryPointSet();
112
113 void AddLine(BoundaryLineSet * const line);
114
115 LineMap lines;
116 int LinesCount;
117 TesselPoint *node;
118 double value;
119 int Nr;
120};
121
122ostream & operator << (ostream &ost, const BoundaryPointSet &a);
123
124// ======================================================== class BoundaryLineSet ==========================================
125
126class BoundaryLineSet {
127 public:
128 BoundaryLineSet();
129 BoundaryLineSet(BoundaryPointSet * const Point[2], const int number);
130 BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number);
131 ~BoundaryLineSet();
132
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;
138
139 class BoundaryPointSet *endpoints[2];
140 TriangleMap triangles;
141 int Nr;
142 bool skipped;
143};
144
145ostream & operator << (ostream &ost, const BoundaryLineSet &a);
146
147// ======================================================== class BoundaryTriangleSet =======================================
148
149class BoundaryTriangleSet {
150 public:
151 BoundaryTriangleSet();
152 BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number);
153 ~BoundaryTriangleSet();
154
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;
165 void SetTopNode(const BoundaryTriangleSet * const topnode);
166
167 class BoundaryPointSet *endpoints[3];
168 class BoundaryLineSet *lines[3];
169 const BoundaryTriangleSet *top; //!< triangle was instantiated during tesselation from this triangle
170 double AngleFromTop;
171 Vector NormalVector;
172 Vector SphereCenter;
173 int Nr;
174};
175
176ostream & operator << (ostream &ost, const BoundaryTriangleSet &a);
177
178
179// ======================================================== class BoundaryTriangleSet =======================================
180
181/** Set of BoundaryPointSet.
182 * This is just meant as a container for a group of endpoints, extending the node, line, triangle concept. However, this has
183 * only marginally something to do with the tesselation. Hence, there is no incorporation into the bookkeeping of the Tesselation
184 * class (i.e. no allocation, no deletion).
185 * \note we assume that the set of endpoints reside (more or less) on a plane.
186 */
187class BoundaryPolygonSet {
188 public:
189 BoundaryPolygonSet();
190 ~BoundaryPolygonSet();
191
192 Vector * GetNormalVector(const Vector &NormalVector) const;
193 void GetCenter(Vector *center) const;
194 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const;
195 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
196 bool ContainsBoundaryPoint(const TesselPoint * const point) const;
197 bool ContainsBoundaryTriangle(const BoundaryTriangleSet * const point) const;
198 bool ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const;
199 bool ContainsPresentTupel(const BoundaryPolygonSet * const P) const;
200 bool ContainsPresentTupel(const PointSet &endpoints) const;
201 TriangleSet * GetAllContainedTrianglesFromEndpoints() const;
202 bool FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line);
203
204 PointSet endpoints;
205 int Nr;
206};
207
208ostream & operator << (ostream &ost, const BoundaryPolygonSet &a);
209
210// =========================================================== class TESSELPOINT ===========================================
211
212/** Is a single point of the set of Vectors, also a super-class to be inherited and and its functions to be implemented.
213 */
214class TesselPoint : virtual public ParticleInfo {
215public:
216 TesselPoint();
217 virtual ~TesselPoint();
218
219 Vector *node; // pointer to position of the dot in space
220
221 virtual ostream & operator << (ostream &ost);
222};
223
224ostream & operator << (ostream &ost, const TesselPoint &a);
225
226// =========================================================== class POINTCLOUD ============================================
227
228/** Super-class for all point clouds structures, also molecules. They have to inherit this structure and implement the virtual function to access the Vectors.
229 * This basically encapsulates a list structure.
230 */
231class PointCloud {
232public:
233 PointCloud();
234 virtual ~PointCloud();
235
236 virtual const char * const GetName() const { return "unknown"; };
237 virtual Vector *GetCenter() const { return NULL; };
238 virtual TesselPoint *GetPoint() const { return NULL; };
239 virtual TesselPoint *GetTerminalPoint() const { return NULL; };
240 virtual int GetMaxId() const { return 0; };
241 virtual void GoToNext() const {};
242 virtual void GoToPrevious() const {};
243 virtual void GoToFirst() const {};
244 virtual void GoToLast() const {};
245 virtual bool IsEmpty() const { return true; };
246 virtual bool IsEnd() const { return true; };
247};
248
249// ======================================================== class CandidateForTesselation =========================================
250
251class CandidateForTesselation {
252 public :
253 CandidateForTesselation(BoundaryLineSet* currentBaseLine);
254 CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, BoundaryPointSet *point, Vector OptCandidateCenter, Vector OtherOptCandidateCenter);
255 ~CandidateForTesselation();
256
257 bool CheckValidity(const double RADIUS, const LinkedCell *LC) const;
258
259 TesselPointList pointlist;
260 const BoundaryLineSet * BaseLine;
261 const BoundaryPointSet * ThirdPoint;
262 const BoundaryTriangleSet *T;
263 Vector OldCenter;
264 Vector OptCenter;
265 Vector OtherOptCenter;
266 double ShortestAngle;
267 double OtherShortestAngle;
268};
269
270ostream & operator <<(ostream &ost, const CandidateForTesselation &a);
271
272// =========================================================== class TESSELATION ===========================================
273
274/** Contains the envelope to a PointCloud.
275 */
276class Tesselation : public PointCloud {
277 public:
278
279 Tesselation();
280 virtual ~Tesselation();
281
282 void AddTesselationPoint(TesselPoint* Candidate, const int n);
283 void SetTesselationPoint(TesselPoint* Candidate, const int n) const;
284 void AddTesselationLine(const Vector * const OptCenter, const BoundaryPointSet * const candidate, class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
285 void AddNewTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
286 void AddExistingTesselationTriangleLine(class BoundaryLineSet *FindLine, int n);
287 void AddTesselationTriangle();
288 void AddTesselationTriangle(const int nr);
289 void AddCandidateTriangle(CandidateForTesselation &CandidateLine);
290 BoundaryTriangleSet * const AddDegeneratedTriangle(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell *LC);
291 void AddCandidatePolygon(CandidateForTesselation CandidateLine, const double RADIUS, const LinkedCell *LC);
292 void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle);
293 void RemoveTesselationLine(class BoundaryLineSet *line);
294 void RemoveTesselationPoint(class BoundaryPointSet *point);
295 bool CheckDegeneracy(Vector *OtherOptCenter, const double RADIUS, const LinkedCell *LC) const;
296
297
298 // concave envelope
299 void FindStartingTriangle(const double RADIUS, const LinkedCell *LC);
300 void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC);
301 void FindThirdPointForTesselation(const Vector &NormalVector, const Vector &SearchDirection, const Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class BoundaryPointSet * const ThirdNode, const double RADIUS, const LinkedCell *LC) const;
302 bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, const BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC);
303 int CheckPresenceOfTriangle(class TesselPoint *Candidates[3]) const;
304 class BoundaryTriangleSet * GetPresentTriangle(TesselPoint *Candidates[3]);
305
306 // convex envelope
307 void TesselateOnBoundary(const PointCloud * const cloud);
308 void GuessStartingTriangle();
309 bool InsertStraddlingPoints(const PointCloud *cloud, const LinkedCell *LC);
310 double RemovePointFromTesselatedSurface(class BoundaryPointSet *point);
311 class BoundaryLineSet * FlipBaseline(class BoundaryLineSet *Base);
312 double PickFarthestofTwoBaselines(class BoundaryLineSet *Base);
313 class BoundaryPointSet *IsConvexRectangle(class BoundaryLineSet *Base);
314 IndexToIndex * FindAllDegeneratedTriangles();
315 IndexToIndex * FindAllDegeneratedLines();
316 void RemoveDegeneratedTriangles();
317 void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC);
318 int CorrectAllDegeneratedPolygons();
319
320 TesselPointSet * GetAllConnectedPoints(const TesselPoint* const Point) const;
321 TriangleSet * GetAllTriangles(const BoundaryPointSet * const Point) const;
322 ListOfTesselPointList * GetPathsOfConnectedPoints(const TesselPoint* const Point) const;
323 ListOfTesselPointList * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const;
324 TesselPointList * GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const;
325 TesselPointList * GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const;
326 class BoundaryPointSet * GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const;
327 TriangleList * FindTriangles(const TesselPoint* const Points[3]) const;
328 TriangleList * FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const;
329 BoundaryTriangleSet * FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const;
330 bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const;
331 double GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const;
332 double GetDistanceToSurface(const Vector &Point, const LinkedCell* const LC) const;
333 BoundaryTriangleSet * GetClosestTriangleOnSurface(const Vector &Point, const LinkedCell* const LC) const;
334 bool AddBoundaryPoint(TesselPoint * Walker, const int n);
335 DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const;
336 BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const;
337
338 // print for debugging
339 void PrintAllBoundaryPoints(ofstream *out) const;
340 void PrintAllBoundaryLines(ofstream *out) const;
341 void PrintAllBoundaryTriangles(ofstream *out) const;
342
343 // store envelope in file
344 void Output(const char *filename, const PointCloud * const cloud);
345
346 PointMap PointsOnBoundary;
347 LineMap LinesOnBoundary;
348 CandidateMap OpenLines;
349 TriangleMap TrianglesOnBoundary;
350 int PointsOnBoundaryCount;
351 int LinesOnBoundaryCount;
352 int TrianglesOnBoundaryCount;
353
354 // PointCloud implementation for PointsOnBoundary
355 virtual Vector *GetCenter(ofstream *out) const;
356 virtual TesselPoint *GetPoint() const;
357 virtual TesselPoint *GetTerminalPoint() const;
358 virtual void GoToNext() const;
359 virtual void GoToPrevious() const;
360 virtual void GoToFirst() const;
361 virtual void GoToLast() const;
362 virtual bool IsEmpty() const;
363 virtual bool IsEnd() const;
364
365 class BoundaryPointSet *BPS[2];
366 class BoundaryLineSet *BLS[3];
367 class BoundaryTriangleSet *BTS;
368 class BoundaryTriangleSet *LastTriangle;
369 int TriangleFilesWritten;
370
371 private:
372 mutable class BoundaryPointSet *TPS[3]; //this is a Storage for pointers to triangle points, this and BPS[2] needed due to AddLine restrictions
373
374 mutable PointMap::const_iterator InternalPointer;
375
376 //bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const;
377};
378
379
380#endif /* TESSELATION_HPP_ */
Note: See TracBrowser for help on using the repository browser.