Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tesselation.hpp

    r27bd2f rce70970  
    2323#include <list>
    2424#include <set>
     25#include <stack>
    2526
    2627#include "atom_particleinfo.hpp"
     
    4243#define DoTecplotOutput 1
    4344#define DoRaster3DOutput 1
    44 #define DoVRMLOutput 1
     45#define DoVRMLOutput 0
    4546#define TecplotSuffix ".dat"
    4647#define Raster3DSuffix ".r3d"
    4748#define VRMLSUffix ".wrl"
    4849
     50#define ParallelEpsilon 1e-3
     51
    4952// ======================================================= some template functions =========================================
    5053
     54#define IndexToIndex map <int, int>
     55
    5156#define PointMap map < int, class BoundaryPointSet * >
     57#define PointSet set < class BoundaryPointSet * >
     58#define PointList list < class BoundaryPointSet * >
    5259#define PointPair pair < int, class BoundaryPointSet * >
    5360#define PointTestPair pair < PointMap::iterator, bool >
     61
    5462#define CandidateList list <class CandidateForTesselation *>
    5563#define CandidateMap map <class BoundaryLineSet *, class CandidateForTesselation *>
    5664
    5765#define LineMap multimap < int, class BoundaryLineSet * >
     66#define LineSet set < class BoundaryLineSet * >
     67#define LineList list < class BoundaryLineSet * >
    5868#define LinePair pair < int, class BoundaryLineSet * >
    5969#define LineTestPair pair < LineMap::iterator, bool >
    6070
    6171#define TriangleMap map < int, class BoundaryTriangleSet * >
     72#define TriangleSet set < class BoundaryTriangleSet * >
     73#define TriangleList list < class BoundaryTriangleSet * >
    6274#define TrianglePair pair < int, class BoundaryTriangleSet * >
    6375#define TriangleTestPair pair < TrianglePair::iterator, bool >
    6476
     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
    6584#define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> >
    6685#define DistanceMultiMapPair pair <double, pair < PointMap::iterator, PointMap::iterator> >
    6786
    6887#define TesselPointList list <TesselPoint *>
     88#define TesselPointSet set <TesselPoint *>
     89
     90#define ListOfTesselPointList list<list <TesselPoint *> *>
     91
     92enum centers {Opt, OtherOpt};
    6993
    7094/********************************************** declarations *******************************/
     
    86110  public:
    87111    BoundaryPointSet();
    88     BoundaryPointSet(TesselPoint * Walker);
     112    BoundaryPointSet(TesselPoint * const Walker);
    89113    ~BoundaryPointSet();
    90114
    91     void AddLine(class BoundaryLineSet *line);
     115    void AddLine(BoundaryLineSet * const line);
    92116
    93117    LineMap lines;
     
    105129  public:
    106130    BoundaryLineSet();
    107     BoundaryLineSet(class BoundaryPointSet *Point[2], const int number);
     131    BoundaryLineSet(BoundaryPointSet * const Point[2], const int number);
     132    BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number);
    108133    ~BoundaryLineSet();
    109134
    110     void AddTriangle(class BoundaryTriangleSet *triangle);
    111     bool IsConnectedTo(class BoundaryLineSet *line);
    112     bool ContainsBoundaryPoint(class BoundaryPointSet *point);
    113     bool CheckConvexityCriterion();
    114     class BoundaryPointSet *GetOtherEndpoint(class BoundaryPointSet *);
     135    void AddTriangle(BoundaryTriangleSet * const triangle);
     136    bool IsConnectedTo(const BoundaryLineSet * const line) const;
     137    bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
     138    bool CheckConvexityCriterion() const;
     139    class BoundaryPointSet *GetOtherEndpoint(const BoundaryPointSet * const point) const;
    115140
    116141    class BoundaryPointSet *endpoints[2];
     
    127152  public:
    128153    BoundaryTriangleSet();
    129     BoundaryTriangleSet(class BoundaryLineSet *line[3], int number);
     154    BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number);
    130155    ~BoundaryTriangleSet();
    131156
    132     void GetNormalVector(Vector &NormalVector);
    133     void GetCenter(Vector *center);
    134     bool GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection);
    135     bool ContainsBoundaryLine(class BoundaryLineSet *line);
    136     bool ContainsBoundaryPoint(class BoundaryPointSet *point);
    137     bool ContainsBoundaryPoint(class TesselPoint *point);
    138     class BoundaryPointSet *GetThirdEndpoint(class BoundaryLineSet *line);
    139     bool IsPresentTupel(class BoundaryPointSet *Points[3]);
    140     bool IsPresentTupel(class BoundaryTriangleSet *T);
     157    void GetNormalVector(const Vector &NormalVector);
     158    void GetCenter(Vector * const center) const;
     159    bool GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const;
     160    double GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const;
     161    bool ContainsBoundaryLine(const BoundaryLineSet * const line) const;
     162    bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
     163    bool ContainsBoundaryPoint(const TesselPoint * const point) const;
     164    class BoundaryPointSet *GetThirdEndpoint(const BoundaryLineSet * const line) const;
     165    bool IsPresentTupel(const BoundaryPointSet * const Points[3]) const;
     166    bool IsPresentTupel(const BoundaryTriangleSet * const T) const;
    141167
    142168    class BoundaryPointSet *endpoints[3];
    143169    class BoundaryLineSet *lines[3];
    144170    Vector NormalVector;
     171    Vector SphereCenter;
    145172    int Nr;
    146173};
    147174
    148175ostream & operator << (ostream &ost, const BoundaryTriangleSet &a);
     176
     177
     178// ======================================================== class BoundaryTriangleSet =======================================
     179
     180/** Set of BoundaryPointSet.
     181 * This is just meant as a container for a group of endpoints, extending the node, line, triangle concept. However, this has
     182 * only marginally something to do with the tesselation. Hence, there is no incorporation into the bookkeeping of the Tesselation
     183 * class (i.e. no allocation, no deletion).
     184 * \note we assume that the set of endpoints reside (more or less) on a plane.
     185 */
     186class BoundaryPolygonSet {
     187  public:
     188    BoundaryPolygonSet();
     189    ~BoundaryPolygonSet();
     190
     191    Vector * GetNormalVector(const Vector &NormalVector) const;
     192    void GetCenter(Vector *center) const;
     193    bool ContainsBoundaryLine(const BoundaryLineSet * const line) const;
     194    bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const;
     195    bool ContainsBoundaryPoint(const TesselPoint * const point) const;
     196    bool ContainsBoundaryTriangle(const BoundaryTriangleSet * const point) const;
     197    bool ContainsPresentTupel(const BoundaryPointSet * const * Points, const int dim) const;
     198    bool ContainsPresentTupel(const BoundaryPolygonSet * const P) const;
     199    bool ContainsPresentTupel(const PointSet &endpoints) const;
     200    TriangleSet * GetAllContainedTrianglesFromEndpoints() const;
     201    bool FillPolygonFromTrianglesOfLine(const BoundaryLineSet * const line);
     202
     203    PointSet endpoints;
     204    int Nr;
     205};
     206
     207ostream & operator << (ostream &ost, const BoundaryPolygonSet &a);
    149208
    150209// =========================================================== class TESSELPOINT ===========================================
     
    178237  virtual TesselPoint *GetPoint() const { return NULL; };
    179238  virtual TesselPoint *GetTerminalPoint() const { return NULL; };
     239  virtual int GetMaxId() const { return 0; };
    180240  virtual void GoToNext() const {};
    181241  virtual void GoToPrevious() const {};
     
    191251  public :
    192252  CandidateForTesselation(BoundaryLineSet* currentBaseLine);
    193   CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, Vector OptCandidateCenter, Vector OtherOptCandidateCenter);
     253  CandidateForTesselation(TesselPoint* candidate, BoundaryLineSet* currentBaseLine, BoundaryPointSet *point, Vector OptCandidateCenter, Vector OtherOptCandidateCenter);
    194254  ~CandidateForTesselation();
    195255
     256  bool CheckValidity(const double RADIUS, const LinkedCell *LC) const;
     257
    196258  TesselPointList pointlist;
    197   BoundaryLineSet *BaseLine;
     259  const BoundaryLineSet * BaseLine;
     260  const BoundaryPointSet * ThirdPoint;
     261  const BoundaryTriangleSet *T;
     262  Vector OldCenter;
    198263  Vector OptCenter;
    199264  Vector OtherOptCenter;
     
    216281    void AddTesselationPoint(TesselPoint* Candidate, const int n);
    217282    void SetTesselationPoint(TesselPoint* Candidate, const int n) const;
    218     void AddTesselationLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
    219     void AlwaysAddTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
     283    void AddTesselationLine(const Vector * const OptCenter, const BoundaryPointSet * const candidate, class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
     284    void AddNewTesselationTriangleLine(class BoundaryPointSet *a, class BoundaryPointSet *b, const int n);
     285    void AddExistingTesselationTriangleLine(class BoundaryLineSet *FindLine, int n);
    220286    void AddTesselationTriangle();
    221287    void AddTesselationTriangle(const int nr);
    222     void AddCandidateTriangle(CandidateForTesselation CandidateLine);
     288    void AddCandidateTriangle(CandidateForTesselation &CandidateLine, enum centers type);
     289    void AddDegeneratedTriangle(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell *LC);
     290    void AddCandidatePolygon(CandidateForTesselation CandidateLine, const double RADIUS, const LinkedCell *LC);
    223291    void RemoveTesselationTriangle(class BoundaryTriangleSet *triangle);
    224292    void RemoveTesselationLine(class BoundaryLineSet *line);
    225293    void RemoveTesselationPoint(class BoundaryPointSet *point);
     294    bool CheckDegeneracy(CandidateForTesselation &CandidateLine, const double RADIUS, const LinkedCell *LC) const;
    226295
    227296
    228297    // concave envelope
    229     void FindStartingTriangle(const double RADIUS, const LinkedCell *LC);
     298    bool FindStartingTriangle(const double RADIUS, const LinkedCell *LC);
    230299    void FindSecondPointForTesselation(class TesselPoint* a, Vector Oben, class TesselPoint*& OptCandidate, double Storage[3], double RADIUS, const LinkedCell *LC);
    231     void FindThirdPointForTesselation(Vector &NormalVector, Vector &SearchDirection, Vector &OldSphereCenter, CandidateForTesselation &CandidateLine, const class TesselPoint  * const ThirdNode, const double RADIUS, const LinkedCell *LC) const;
    232     bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC);
     300    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;
     301    bool FindNextSuitableTriangle(CandidateForTesselation &CandidateLine, const BoundaryTriangleSet &T, const double& RADIUS, const LinkedCell *LC);
     302    bool FindCandidatesforOpenLines(const double RADIUS, const LinkedCell *&LCList);
    233303    int CheckPresenceOfTriangle(class TesselPoint *Candidates[3]) const;
    234304    class BoundaryTriangleSet * GetPresentTriangle(TesselPoint *Candidates[3]);
     
    242312    double PickFarthestofTwoBaselines(class BoundaryLineSet *Base);
    243313    class BoundaryPointSet *IsConvexRectangle(class BoundaryLineSet *Base);
    244     map<int, int> * FindAllDegeneratedTriangles();
    245     map<int, int> * FindAllDegeneratedLines();
     314    IndexToIndex * FindAllDegeneratedTriangles();
     315    IndexToIndex * FindAllDegeneratedLines();
    246316    void RemoveDegeneratedTriangles();
    247317    void AddBoundaryPointByDegeneratedTriangle(class TesselPoint *point, LinkedCell *LC);
    248 
    249     set<TesselPoint*> * GetAllConnectedPoints(const TesselPoint* const Point) const;
    250     set<BoundaryTriangleSet*> *GetAllTriangles(const BoundaryPointSet * const Point) const;
    251     list<list<TesselPoint*> *> * GetPathsOfConnectedPoints(const TesselPoint* const Point) const;
    252     list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const;
    253     list<TesselPoint*> * GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const;
    254     class BoundaryPointSet *GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const;
    255     list<BoundaryTriangleSet*> *FindTriangles(const TesselPoint* const Points[3]) const;
    256     list<BoundaryTriangleSet*> * FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const;
    257     class BoundaryTriangleSet * FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const;
     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;
    258330    bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const;
    259     bool IsInnerPoint(const TesselPoint * const 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;
    260334    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;
    261337
    262338    // print for debugging
     
    299375
    300376    //bool HasOtherBaselineBetterCandidate(const BoundaryLineSet * const BaseRay, const TesselPoint * const OptCandidate, double ShortestAngle, double RADIUS, const LinkedCell * const LC) const;
     377    void FindDegeneratedCandidatesforOpenLines(TesselPoint * const Sprinter, const Vector * const OptCenter);
    301378};
    302379
Note: See TracChangeset for help on using the changeset viewer.