Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tesselation.hpp

    rd74077 r952f38  
    22 * tesselation.hpp
    33 *
    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.
    65 *
    76 *  Created on: Aug 3, 2009
     
    2625#include <stack>
    2726
    28 #include "BoundaryMaps.hpp"
    29 #include "PointCloud.hpp"
    30 #include "TesselPoint.hpp"
    3127#include "atom_particleinfo.hpp"
    32 #include "helpers.hpp"
    33 #include "vector.hpp"
    34 
     28#include "Helpers/helpers.hpp"
     29#include "LinearAlgebra/Vector.hpp"
    3530
    3631/****************************************** forward declarations *****************************/
     
    3934class BoundaryLineSet;
    4035class BoundaryTriangleSet;
    41 class CandidateForTesselation;
    4236class LinkedCell;
     37class TesselPoint;
     38class PointCloud;
    4339class Tesselation;
    4440class Plane;
     
    5753// ======================================================= some template functions =========================================
    5854
     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
     93enum centers {Opt, OtherOpt};
     94
    5995/********************************************** declarations *******************************/
     96
     97template <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
     110class 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
     125ostream & operator << (ostream &ost, const BoundaryPointSet &a);
     126
     127// ======================================================== class BoundaryLineSet ==========================================
     128
     129class 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
     150ostream & operator << (ostream &ost, const BoundaryLineSet &a);
     151
     152// ======================================================== class BoundaryTriangleSet =======================================
     153
     154class 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
     186ostream & 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 */
     197class 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
     218ostream & 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 */
     224class TesselPoint : virtual public ParticleInfo {
     225public:
     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
     234ostream & 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 */
     241class PointCloud {
     242public:
     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
     258class 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
     277ostream & operator <<(ostream &ost, const  CandidateForTesselation &a);
    60278
    61279// =========================================================== class TESSELATION ===========================================
     
    71289    void AddTesselationPoint(TesselPoint* Candidate, const int n);
    72290    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);
    74292    void AddNewTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
    75293    void AddExistingTesselationTriangleLine(class BoundaryLineSet *FindLine, int n);
     
    112330    ListOfTesselPointList * GetPathsOfConnectedPoints(const TesselPoint* const Point) const;
    113331    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;
    116334    class BoundaryPointSet * GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const;
    117335    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;
    120338    bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const;
    121339    double GetDistanceSquaredToTriangle(const Vector &Point, const BoundaryTriangleSet* const triangle) const;
     
    123341    BoundaryTriangleSet * GetClosestTriangleOnSurface(const Vector &Point, const LinkedCell* const LC) const;
    124342    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;
    127345
    128346    // print for debugging
Note: See TracChangeset for help on using the changeset viewer.