source: src/tesselation.hpp@ 70ff32

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 70ff32 was 6b919f8, checked in by Frederik Heber <heber@…>, 15 years ago

Refactored atom.cpp into multiple files.

After the class atom was refactored into multiple base classes that are inherited, these base classes are also all put into separate files. This is basically a preparatory step for the like-wise refactoring of class molecule into inherited base classes and splitting up (that is there done already). Finally, we will also separate the relations, i.e. not have "atom.hpp" included everywhere and use class atom, but rather the subclasses such as TrajectoryParticle and its header files only.
Signed-off-by: Frederik Heber <heber@…>

  • Property mode set to 100644
File size: 10.9 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
26#include "atom_particleinfo.hpp"
27#include "helpers.hpp"
28#include "vector.hpp"
29
30/****************************************** forward declarations *****************************/
31
32class BoundaryPointSet;
33class BoundaryLineSet;
34class BoundaryTriangleSet;
35class LinkedCell;
36class TesselPoint;
37class PointCloud;
38class Tesselation;
39
40/********************************************** definitions *********************************/
41
42#define DoTecplotOutput 1
43#define DoRaster3DOutput 1
44#define DoVRMLOutput 1
45#define TecplotSuffix ".dat"
46#define Raster3DSuffix ".r3d"
47#define VRMLSUffix ".wrl"
48
49// ======================================================= some template functions =========================================
50
51#define PointMap map < int, class BoundaryPointSet * >
52#define PointPair pair < int, class BoundaryPointSet * >
53#define PointTestPair pair < PointMap::iterator, bool >
54#define CandidateList list <class CandidateForTesselation *>
55
56#define LineMap multimap < int, class BoundaryLineSet * >
57#define LinePair pair < int, class BoundaryLineSet * >
58#define LineTestPair pair < LineMap::iterator, bool >
59
60#define TriangleMap map < int, class BoundaryTriangleSet * >
61#define TrianglePair pair < int, class BoundaryTriangleSet * >
62#define TriangleTestPair pair < TrianglePair::iterator, bool >
63
64#define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> >
65#define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> >
66
67/********************************************** declarations *******************************/
68
69template <typename T> void SetEndpointsOrdered(T endpoints[2], T endpoint1, T endpoint2)
70{
71 if (endpoint1->Nr < endpoint2->Nr) {
72 endpoints[0] = endpoint1;
73 endpoints[1] = endpoint2;
74 } else {
75 endpoints[0] = endpoint2;
76 endpoints[1] = endpoint1;
77 }
78};
79
80// ======================================================== class BoundaryPointSet =========================================
81
82class BoundaryPointSet {
83 public:
84 BoundaryPointSet();
85 BoundaryPointSet(TesselPoint *Walker);
86 ~BoundaryPointSet();
87
88 void AddLine(class BoundaryLineSet *line);
89
90 LineMap lines;
91 int LinesCount;
92 TesselPoint *node;
93 double value;
94 int Nr;
95};
96
97ostream & operator << (ostream &ost, BoundaryPointSet &a);
98
99// ======================================================== class BoundaryLineSet ==========================================
100
101class BoundaryLineSet {
102 public:
103 BoundaryLineSet();
104 BoundaryLineSet(class BoundaryPointSet *Point[2], int number);
105 ~BoundaryLineSet();
106
107 void AddTriangle(class BoundaryTriangleSet *triangle);
108 bool IsConnectedTo(class BoundaryLineSet *line);
109 bool ContainsBoundaryPoint(class BoundaryPointSet *point);
110 bool CheckConvexityCriterion(ofstream *out);
111 class BoundaryPointSet *GetOtherEndpoint(class BoundaryPointSet *);
112
113 class BoundaryPointSet *endpoints[2];
114 TriangleMap triangles;
115 int Nr;
116};
117
118ostream & operator << (ostream &ost, BoundaryLineSet &a);
119
120// ======================================================== class BoundaryTriangleSet =======================================
121
122class BoundaryTriangleSet {
123 public:
124 BoundaryTriangleSet();
125 BoundaryTriangleSet(class BoundaryLineSet *line[3], int number);
126 ~BoundaryTriangleSet();
127
128 void GetNormalVector(Vector &NormalVector);
129 void GetCenter(Vector *center);
130 bool GetIntersectionInsideTriangle(ofstream *out, Vector *MolCenter, Vector *x, Vector *Intersection);
131 bool ContainsBoundaryLine(class BoundaryLineSet *line);
132 bool ContainsBoundaryPoint(class BoundaryPointSet *point);
133 bool ContainsBoundaryPoint(class TesselPoint *point);
134 class BoundaryPointSet *GetThirdEndpoint(class BoundaryLineSet *line);
135 bool IsPresentTupel(class BoundaryPointSet *Points[3]);
136 bool IsPresentTupel(class BoundaryTriangleSet *T);
137
138 class BoundaryPointSet *endpoints[3];
139 class BoundaryLineSet *lines[3];
140 Vector NormalVector;
141 int Nr;
142};
143
144ostream & operator << (ostream &ost, BoundaryTriangleSet &a);
145
146// =========================================================== class TESSELPOINT ===========================================
147
148/** Is a single point of the set of Vectors, also a super-class to be inherited and and its functions to be implemented.
149 */
150class TesselPoint : virtual public ParticleInfo {
151public:
152 TesselPoint();
153 virtual ~TesselPoint();
154
155 Vector *node; // pointer to position of the dot in space
156
157 virtual ostream & operator << (ostream &ost);
158};
159
160ostream & operator << (ostream &ost, const TesselPoint &a);
161
162// =========================================================== class POINTCLOUD ============================================
163
164/** Super-class for all point clouds structures, also molecules. They have to inherit this structure and implement the virtual function to access the Vectors.
165 * This basically encapsulates a list structure.
166 */
167class PointCloud {
168public:
169 PointCloud();
170 virtual ~PointCloud();
171
172 virtual Vector *GetCenter(ofstream *out) { return NULL; };
173 virtual TesselPoint *GetPoint() { return NULL; };
174 virtual TesselPoint *GetTerminalPoint() { return NULL; };
175 virtual void GoToNext() {};
176 virtual void GoToPrevious() {};
177 virtual void GoToFirst() {};
178 virtual void GoToLast() {};
179 virtual bool IsEmpty() { return false; };
180 virtual bool IsEnd() { return false; };
181};
182
183// ======================================================== class CandidateForTesselation =========================================
184
185class CandidateForTesselation {
186 public :
187 CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, Vector OptCandidateCenter, Vector OtherOptCandidateCenter);
188 ~CandidateForTesselation();
189
190 TesselPoint *point;
191 BoundaryLineSet *BaseLine;
192 Vector OptCenter;
193 Vector OtherOptCenter;
194};
195
196// =========================================================== class TESSELATION ===========================================
197
198/** Contains the envelope to a PointCloud.
199 */
200class Tesselation : public PointCloud {
201 public:
202
203 Tesselation();
204 virtual ~Tesselation();
205
206 void AddTesselationPoint(TesselPoint* Candidate, int n);
207 void AddTesselationLine(class BoundaryPointSet *a, class BoundaryPointSet *b, int n);
208 void AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, int n);
209 void AddTesselationTriangle();
210 void AddTesselationTriangle(int nr);
211 void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle);
212 void RemoveTesselationLine(class BoundaryLineSet *line);
213 void RemoveTesselationPoint(class BoundaryPointSet *point);
214
215 class BoundaryPointSet *GetCommonEndpoint(class BoundaryLineSet * line1, class BoundaryLineSet * line2);
216
217 // concave envelope
218 void FindStartingTriangle(ofstream *out, const double RADIUS, class LinkedCell *LC);
219 void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, class LinkedCell *LC);
220 void FindThirdPointForTesselation(Vector NormalVector, Vector SearchDirection, Vector OldSphereCenter, class BoundaryLineSet *BaseLine, class TesselPoint *ThirdNode, CandidateList* &candidates, double *ShortestAngle, const double RADIUS, class LinkedCell *LC);
221 bool FindNextSuitableTriangle(ofstream *out, BoundaryLineSet &Line, BoundaryTriangleSet &T, const double& RADIUS, LinkedCell *LC);
222 int CheckPresenceOfTriangle(ofstream *out, class TesselPoint *Candidates[3]);
223 class BoundaryTriangleSet * GetPresentTriangle(ofstream *out, TesselPoint *Candidates[3]);
224
225 // convex envelope
226 void TesselateOnBoundary(ofstream *out, PointCloud *cloud);
227 void GuessStartingTriangle(ofstream *out);
228 bool InsertStraddlingPoints(ofstream *out, PointCloud *cloud, LinkedCell *LC);
229 double RemovePointFromTesselatedSurface(ofstream *out, class BoundaryPointSet *point);
230 class BoundaryLineSet * FlipBaseline(ofstream *out, class BoundaryLineSet *Base);
231 double PickFarthestofTwoBaselines(ofstream *out, class BoundaryLineSet *Base);
232 class BoundaryPointSet *IsConvexRectangle(ofstream *out, class BoundaryLineSet *Base);
233 map<int, int> * FindAllDegeneratedTriangles();
234 map<int, int> * FindAllDegeneratedLines();
235 void RemoveDegeneratedTriangles();
236 void AddBoundaryPointByDegeneratedTriangle(ofstream *out, class TesselPoint *point, LinkedCell *LC);
237
238 set<TesselPoint*> * GetAllConnectedPoints(ofstream *out, TesselPoint* Point);
239 set<BoundaryTriangleSet*> *GetAllTriangles(ofstream *out, class BoundaryPointSet *Point);
240 list<list<TesselPoint*> *> * GetPathsOfConnectedPoints(ofstream *out, TesselPoint* Point);
241 list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(ofstream *out, TesselPoint* Point);
242 list<TesselPoint*> * GetCircleOfConnectedPoints(ofstream *out, TesselPoint* Point, Vector *Reference = NULL);
243 list<BoundaryTriangleSet*> *FindTriangles(TesselPoint* Points[3]);
244 list<BoundaryTriangleSet*> * FindClosestTrianglesToPoint(ofstream *out, Vector *x, LinkedCell* LC);
245 class BoundaryTriangleSet * FindClosestTriangleToPoint(ofstream *out, Vector *x, LinkedCell* LC);
246 bool IsInnerPoint(ofstream *out, Vector Point, LinkedCell* LC);
247 bool IsInnerPoint(ofstream *out, TesselPoint *Point, LinkedCell* LC);
248 bool AddBoundaryPoint(TesselPoint *Walker, int n);
249
250 // print for debugging
251 void PrintAllBoundaryPoints(ofstream *out);
252 void PrintAllBoundaryLines(ofstream *out);
253 void PrintAllBoundaryTriangles(ofstream *out);
254
255 // store envelope in file
256 void Output(ofstream *out, const char *filename, PointCloud *cloud);
257
258 PointMap PointsOnBoundary;
259 LineMap LinesOnBoundary;
260 TriangleMap TrianglesOnBoundary;
261 int PointsOnBoundaryCount;
262 int LinesOnBoundaryCount;
263 int TrianglesOnBoundaryCount;
264
265 // PointCloud implementation for PointsOnBoundary
266 virtual Vector *GetCenter(ofstream *out);
267 virtual TesselPoint *GetPoint();
268 virtual TesselPoint *GetTerminalPoint();
269 virtual void GoToNext();
270 virtual void GoToPrevious();
271 virtual void GoToFirst();
272 virtual void GoToLast();
273 virtual bool IsEmpty();
274 virtual bool IsEnd();
275
276 class BoundaryPointSet *BPS[2];
277 class BoundaryLineSet *BLS[3];
278 class BoundaryTriangleSet *BTS;
279 class BoundaryTriangleSet *LastTriangle;
280 int TriangleFilesWritten;
281
282 private:
283 class BoundaryPointSet *TPS[3]; //this is a Storage for pointers to triangle points, this and BPS[2] needed due to AddLine restrictions
284
285 PointMap::iterator InternalPointer;
286};
287
288
289#endif /* TESSELATION_HPP_ */
Note: See TracBrowser for help on using the repository browser.