pttriang.h

Go to the documentation of this file.
00001 /**
00002  * triangle.h -- Triangulate points with break edges and clipping regions
00003  *
00004  * \if NODOC
00005  * $Id: pttriang.h_v 1.8 2004/05/26 20:30:41 vdronov Exp $
00006  *
00007  * $Log: pttriang.h_v $
00008  * Revision 1.8  2004/05/26 20:30:41  vdronov
00009  * added some methods
00010  *
00011  * Revision 1.7  2004/05/19 21:33:27  vdronov
00012  * handle boundaries
00013  *
00014  * Revision 1.6  2004/05/14 22:33:17  vdronov
00015  * Bondary
00016  *
00017  * Revision 1.5  2004/05/13 19:49:43  vdronov
00018  * many modisfications
00019  *
00020  * Revision 1.4  2004/04/21 22:57:40  vdronov
00021  * added pragma to eliminate warning
00022  *
00023  * Revision 1.3  2004/04/20 20:33:40  vdronov
00024  * added extra methods
00025  *
00026  * Revision 1.2  2004/02/27 20:35:08  vdronov
00027  * added GEOMDLL
00028  *
00029  * Revision 1.1  2004/02/27 01:35:11  vdronov
00030  * Initial revision
00031  *
00032  * \endif
00033 */
00034 
00035 #ifndef  INC_MI32_PTTRIANG_H
00036 #define  INC_MI32_PTTRIANG_H
00037 
00038 #ifndef  INC_MI32_REGION2D_H
00039 #include <mi32/region2d.h>
00040 #endif
00041 
00042 #ifndef  INC_MI32_SIMPLEAR_H
00043 #include <mi32/simplear.h>
00044 #endif
00045 
00046 #ifndef  INC_MI32_DOUBLEAR_H
00047 #include <mi32/doublear.h>
00048 #endif
00049 
00050 #ifndef  INC_MI32_BITSET_H
00051 #include <mi32/bitset.h>
00052 #endif
00053 
00054 #ifndef  INC_MI32_POINT_H
00055 #include <mi32/point.h>
00056 #endif
00057 
00058 
00059 #ifndef  INC_MI32_RVCTIN_H
00060 #include <mi32/rvctin.h>
00061 #endif
00062 
00063 
00064 #ifndef  INC_MI32_QTREE_H
00065 #include <mi32/qtree.h> 
00066 #endif
00067 
00068 #include <set>
00069 #include <map>
00070 #include <vector>
00071 
00072 #ifdef GEOMDLL
00073    #define GEOMLIBEXPORT MI_DLLEXPORT
00074    #define GEOMLIBCLASSEXPORT MI_DLLCLASSEXPORT
00075 #else
00076    #define GEOMLIBEXPORT MI_DLLIMPORT
00077    #define GEOMLIBCLASSEXPORT MI_DLLCLASSIMPORT
00078 #endif
00079 
00080 // PTTRIANGULATOR class provides algorithm of triangulation of points with respect of hard edges and clip regions.
00081 class GEOMLIBCLASSEXPORT PTTRIANGULATOR {
00082 
00083 public:
00084 
00085    //! Rule is used to swap diagonal in quadritlateral
00086    enum RULE {
00087       RULE_Delaunay = 0,
00088       RULE_ShorterEdge = 1
00089       };
00090 
00091    //! Type of point in triangulation
00092    enum POINTTYPE {
00093       POINTTYPE_Regular = 0,
00094       POINTTYPE_Break = 1,
00095       POINTTYPE_Clip = 2,
00096       POINTTYPE_Intersection = 3
00097       };
00098 
00099    //! Type of edge in triangulation
00100    enum EDGETYPE {
00101       EDGETYPE_Regular = 0,
00102       EDGETYPE_Break = 1,
00103       EDGETYPE_Clip = 2
00104       };
00105 
00106    typedef SIMPLE_ARRAY<INT32> BOUNDARY;
00107    typedef MILIST<BOUNDARY> BOUNDARYLIST;
00108 
00109    #ifndef GENERATING_DOXYGEN_OUTPUT
00110    enum FLAGS {
00111       FLAG_ElementBit = 0x01,
00112       FLAG_EdgeBit = 0x02,
00113       FLAG_DiagonalBit = 0x04,
00114       FLAG_Point = 0x00,
00115       FLAG_Edge = 0x01,
00116       FLAG_Clip = 0x00,
00117       FLAG_Hard = 0x02,
00118       FLAG_TLtoBR = 0x00,
00119       FLAG_BLtoTR = 0x04
00120       };
00121    #endif // GENERATING_DOXYGEN_OUTPUT
00122 
00123    //! Add point for triangulation
00124    //! Return index of point added for triangulation
00125    INT32 AddPoint (
00126       const DPOINT2D& point
00127       );
00128 
00129    //! Add points for triangulation
00130    //! Return index of first point added for triangulation
00131    INT32 AddPoints (
00132       const DOUBLE_ARRAY<DPOINT2D>& points
00133       );
00134 
00135    //! Add points for triangulation
00136    //! Return index of first point added for triangulation
00137    INT32 AddPoints (
00138       const DOUBLE_ARRAY<DPOINT3D>& points
00139       );
00140 
00141    //! Add hard edge for triangulation as two DPOINT2Ds
00142    void AddHardEdge (
00143       const DPOINT2D& start, const DPOINT2D& end
00144       );
00145 
00146    //! Add hard edge for triangulation as two indices for added before points
00147    ERRVALUE AddHardEdge (
00148       const INT32& start, 
00149       const INT32& end
00150       );
00151 
00152    //! Add hard line for triangulation as array of points
00153    void AddHardLine (
00154       const DOUBLE_ARRAY<DPOINT2D>& points
00155       );
00156 
00157    //! Add hard line for triangulation as array of points
00158    void AddHardLine (
00159       const DOUBLE_ARRAY<DPOINT3D>& points
00160       );
00161 
00162    //! Add hard line for triangulation as polyline
00163    void AddHardLine (
00164       const POLYLINE& polyline
00165       );
00166 
00167    //! Clear all input data
00168    void ClearAll (
00169       );
00170 
00171    //! Clear all points
00172    void ClearPoints (
00173       );
00174 
00175    //! Clear all hard edges and lines
00176    void ClearHardEdges (
00177       );
00178 
00179    //! Clear clip region
00180    void ClearClipRegion (
00181       ) { m_ClipRegion.Clear(); return; };
00182                               
00183    //! Get number of nodes in triangulation
00184    //! Return number of nodes
00185    INT32 GetNumNodes (
00186       ) const;
00187 
00188    //! Get number of edges in triangulation
00189    //! Return number of edges
00190    INT32 GetNumEdges (
00191       ) const;
00192 
00193    //! Get number of triangles triangulation
00194    //! Return number of triangles
00195    INT32 GetNumTriangles (
00196       ) const;
00197 
00198    //! Get nodes information for given triangle
00199    //! Return true if given triangle exists
00200    bool GetTriangleNodes (
00201       const INT32 triangle, 
00202       TRIANGLENODES& nodes
00203       ) const;
00204 
00205    //! Get edges information for given triangle
00206    //! Return true if given triangle exists
00207    bool GetTriangleEdges (
00208       const INT32 triangle, 
00209       TRIANGLEEDGES& edges
00210       ) const;
00211 
00212    //! Get neighbor triangles information for given triangle
00213    //! Return true if given triangle exists
00214    bool GetTriangleTriangles (
00215       const INT32 triangle, 
00216       TRIANGLETRIANGLES& triangles
00217       ) const;
00218 
00219    //! Get point for given node
00220    //! Return true if given node exists
00221    bool GetPoint (
00222       const INT32 node, 
00223       DPOINT2D& point
00224       ) const;
00225 
00226    //! Get index of node assigned when this node was added for triangulation
00227    //! Return index of node or -1 if node is part of break edge of clip region
00228    INT32 GetIndex (
00229       const INT32 node
00230       ) const;
00231 
00232    INT32 GetNode (
00233       const INT32 index
00234       ) const;
00235 
00236    POINTTYPE GetPointType (
00237       const INT32 node
00238       ) const;
00239 
00240    //! Get edge information for given edge
00241    //! Return true if given edge exists
00242    bool GetEdgeInfo (
00243       const INT32 edge, 
00244       EDGEINFO& edgeinfo
00245       ) const;
00246 
00247    //! Get triangle information for given edge
00248    //! Return true if given triangle exists
00249     bool GetTriangleInfo (
00250       const INT32 triangle, 
00251       TRIANGLEINFO& triangleinfo
00252       ) const;
00253 
00254    void GetBoundaries (
00255       BOUNDARYLIST& boundaries 
00256       ) const;
00257 
00258    void SetBoundaries (
00259       const BOUNDARYLIST& boundaries 
00260       );
00261 
00262    void GetHardEdges (
00263       SIMPLE_ARRAY<INT32>& hardedges 
00264       ) const;
00265 
00266    void ClearAllSelection(
00267       ) { ClearEdgesSelection(); ClearHardEdgesSelection(); ClearTrianglesSelection(); return; };
00268 
00269    void ClearEdgesSelection(
00270       ) { m_SelectedEdges.ClearAll(); return; };
00271 
00272     void ClearHardEdgesSelection(
00273       ) { m_SelectedHardEdges.ClearAll(); return; };
00274 
00275    void ClearTrianglesSelection(
00276       ) { m_SelectedTriangles.ClearAll(); return; };
00277 
00278     INT32 GetNumSelectedEdges(
00279       );
00280 
00281     INT32 GetNumSelectedHardEdges(
00282       );
00283 
00284    INT32 GetNumSelectedTriangles(
00285       );
00286 
00287    INT32 ExtrapolatePointsInExtents (
00288       const DRECT2D& extents,
00289       SIMPLE_ARRAY<DPOINT2D>& points 
00290       );
00291 
00292    INT32 FindNode(
00293       const DPOINT2D& point 
00294       );
00295 
00296    INT32 FindDifferentNode(
00297       const DPOINT2D& point,
00298       const INT32 node
00299       );
00300 
00301     INT32 FindEdge(
00302       const DPOINT2D& point 
00303       );
00304 
00305    INT32 FindHardEdge(
00306       const DPOINT2D& point 
00307       );
00308 
00309    INT32 FindTriangle(
00310       const DPOINT2D& point 
00311       );
00312 
00313    INT32 FindClosestTriangle(
00314       const DPOINT2D& point 
00315       );
00316 
00317     bool IsEdgeSelected (
00318       const INT32 edge 
00319       );
00320 
00321     bool IsTriangleSelected (
00322       const INT32 triangle
00323       );
00324 
00325     bool IsHardEdgeSelected (
00326       const INT32 edge 
00327       );
00328 
00329     bool IsHardEdge (
00330       const INT32 start,
00331       const INT32 end
00332       );
00333 
00334     bool IsSegmentIntersectedByHardEdges (
00335       const INT32 start,
00336       const INT32 end
00337       );
00338 
00339     INT32 RemoveSelectedEdges (
00340       );
00341 
00342     INT32 RemoveSelectedTriangles (
00343       );
00344 
00345     INT32 RemoveSelectedHardEdges (
00346       );
00347 
00348     void SelectEdge (
00349       const INT32 edge 
00350       );
00351 
00352     void SelectTriangle (
00353       const INT32 triangle
00354       );
00355 
00356     void SelectHardEdge (
00357       const INT32 edge 
00358       );
00359 
00360     void UnSelectEdge (
00361       const INT32 edge 
00362       );
00363 
00364     void UnSelectTriangle (
00365       const INT32 triangle
00366       );
00367 
00368     void UnSelectHardEdge (
00369       const INT32 edge 
00370       );
00371 
00372    //! Set clip region
00373    void SetClipRegion (
00374       const REGION2D& region
00375       ) { m_IsTriangulated = false; m_ClipRegion = region; return; };
00376 
00377    //! Get rule used for triangulation
00378    //! Return rule
00379    RULE GetRule (
00380       ) {return m_Rule; };
00381 
00382    //! Get tolerance used for triangulation
00383    //! Return tolerance
00384    double GetTolerance (
00385       ) {return m_Tolerance; };
00386 
00387    //! Get modify stamp
00388    //! Return modify stamp
00389       INT32 GetModifyStamp (
00390       ) { return m_ModifyStamp; };
00391 
00392    //! Is triangulated
00393    //! Return true if it is
00394       bool IsTriangulated (
00395       ) { return m_IsTriangulated; };
00396 
00397    //! Triangulate given set of input data for given rule and tolerance
00398    //! Return error code
00399    ERRVALUE Triangulate (
00400       const double tolerance = 0.0, 
00401       const RULE rule = RULE_Delaunay
00402       );
00403 
00404    //! Constructor
00405    PTTRIANGULATOR (
00406       );
00407 
00408    //! Destructor
00409    ~PTTRIANGULATOR (
00410       );
00411 
00412    //! Assignment operator 
00413    PTTRIANGULATOR& operator= (            
00414       const PTTRIANGULATOR& rhs
00415       );
00416 
00417 
00418 private:
00419 
00420    #ifndef GENERATING_DOXYGEN_OUTPUT
00421 
00422    struct BOUNDSTRUCT {
00423       POLYLINE m_Polyline;
00424       DPOINT2D m_Point;
00425       INT32 m_Parent;
00426       INT32 m_Level;
00427 
00428       BOUNDSTRUCT () : m_Parent(-1), m_Level(-1) {};
00429       };
00430 
00431    struct QUADRUPLE {
00432       QUADRUPLE (
00433          const INT32 n1,
00434          const INT32 n2,
00435          const INT32 n3,
00436          const INT32 n4
00437          ) :
00438          node1(n1),
00439          node2(n2),
00440          node3(n3),
00441          node4(n4)
00442          {
00443          };
00444 
00445       bool operator < (
00446          const QUADRUPLE& q
00447          ) const {
00448          if (node1 < q.node1) return true;
00449          if (node1 > q.node1) return false;
00450          if (node2 < q.node2) return true;
00451          if (node2 > q.node2) return false;
00452          if (node3 < q.node3) return true;
00453          if (node3 > q.node3) return false;
00454          if (node4 < q.node4) return true;
00455          return false; 
00456          };
00457       const INT32 node1;
00458       const INT32 node2;
00459       const INT32 node3;
00460       const INT32 node4;
00461       };
00462 
00463    RULE m_Rule;
00464    bool m_IsTriangulated;
00465    double m_Tolerance;
00466    INT32 m_ModifyStamp;
00467 
00468 #pragma warning (disable:4251)
00469    SIMPLE_ARRAY<DPOINT2D> m_Points;
00470    POLYLINELIST m_HardLines;
00471 #pragma warning (default:4251)
00472 
00473    REGION2D m_ClipRegion;
00474    bool m_AreHardEdgesExist;
00475 
00476    QUADTREE m_ElementQT;
00477 #pragma warning (disable:4251)
00478    SIMPLE_ARRAY<FLAGS> m_ElementStatus;
00479 #pragma warning (default:4251)
00480    INT32 m_NumQTElements;
00481 
00482    QUADTREE m_EdgeQT;
00483    INT32 m_NumQTEdges;
00484 
00485 #pragma warning (disable:4251)
00486    std::set<INT32> m_Index;
00487    
00488    BITSET m_SelectedEdges;
00489    BITSET m_SelectedTriangles;
00490    BITSET m_SelectedHardEdges;
00491    
00492    typedef std::map<double, DPOINT2D> INTERSECTION;
00493    typedef std::pair<double, DPOINT2D> INTERSECTIONPAIR;
00494 
00495    INTERSECTION m_Intersection;
00496    INTERSECTION m_LeftPoints;
00497    INTERSECTION m_RightPoints;
00498 
00499    SIMPLE_ARRAY<DPOINT3D> m_WorkPoints;   // z coordinate is index of point
00500    SIMPLE_ARRAY<EDGEINFO> m_WorkEdges;
00501    SIMPLE_ARRAY<TRIANGLEEDGES> m_WorkTriangles;
00502 
00503    MILIST<INT32> m_WorkHull;      
00504    std::set<INT32> m_DirtyEdges;
00505    std::set<QUADRUPLE> m_Set;       
00506 #pragma warning (default:4251)
00507 
00508    static int ComparePoints(const void *vp1, const void *vp2);
00509 
00510    double ConvexTest (const INT32 n1, const INT32 n2, const INT32 n3);
00511 
00512    ERRVALUE ClearStructures ();
00513    ERRVALUE PrepareQuadTrees ();
00514    ERRVALUE PreparePoints ();
00515    ERRVALUE PrepareClipRegion();
00516    ERRVALUE PrepareHardLines ();
00517    ERRVALUE AddSegment (const DPOINT2D& start, const DPOINT2D& end, const FLAGS flags);
00518    INT32 IntersectSegmentBy (const DPOINT2D& start, const DPOINT2D& end, const INT32 index, double t[2], DPOINT2D point[2]);
00519    ERRVALUE AddQTElement (const DPOINT2D& start, const DPOINT2D& end, const FLAGS flags);
00520    ERRVALUE FindQTElementForEdge (const INT32 edge);
00521 
00522    ERRVALUE UpdateQTElement (const INT32 index, const DPOINT2D& start, const DPOINT2D& end, const FLAGS flags);
00523    ERRVALUE RemoveQTElement (const INT32 index);
00524    ERRVALUE CompressQTElement ();
00525    ERRVALUE UpdateQTEdge ();
00526    ERRVALUE InsertHardEdges ();
00527    ERRVALUE InsertHardEdge(const INT32 start, const INT32 end);
00528    ERRVALUE SplitSegementByNodes (const INT32 start, const INT32 end, SIMPLE_ARRAY<INT32>& array);
00529    bool IsIntersectedByEdge (
00530       const DPOINT2D& start, 
00531       const DPOINT2D& end, 
00532       const INT32 edge, 
00533       double& t, 
00534       DPOINT2D& left,
00535       DPOINT2D& right
00536       );
00537    ERRVALUE TriangulatePolygon (INTERSECTION& Points);
00538    ERRVALUE MakeTriangle (const DPOINT2D& p1, const DPOINT2D& p2, const DPOINT2D& p3);
00539    ERRVALUE FindPrivateNode (const DPOINT2D& p);
00540    ERRVALUE FindPrivateEdge (const DPOINT2D& start, const DPOINT2D& end);
00541 
00542    ERRVALUE SortWorkNodes ();
00543    ERRVALUE FindFirstTriangle ();
00544    ERRVALUE ConstructAllTriangles ();
00545    ERRVALUE RemoveOutsideEdges ();
00546    ERRVALUE CheckDirtyEdges (const bool update = false);
00547 
00548    bool IsSwapNeeded (const INT32 edge);
00549    ERRVALUE SwapEdge (const INT32 edge, const bool update);
00550    INT32 GetLeftNode (const INT32 edge) const;
00551    INT32 GetLeftBottomEdge (const INT32 edge) const;
00552    INT32 GetLeftTopEdge (const INT32 edge) const;
00553    INT32 GetRightBottomEdge (const INT32 edge) const;
00554    INT32 GetRightTopEdge (const INT32 edge) const;
00555    INT32 GetRightNode (const INT32 edge) const;
00556    bool CircleTest (const INT32 bottomnode, const INT32 leftnode, const INT32 topnode, const INT32 rightnode); 
00557    void RemovePrivateEdge (const INT32 edge);
00558    void RemovePrivateTriangle (const INT32 triangle);
00559    bool FillGapEdge (const INT32 edge);
00560    void FillGapTriangle (const INT32 triangle);
00561    void SetSelection();
00562 
00563    double DistanceSquaredFromPointToSegement (const DPOINT2D& point, const DPOINT2D& start, const DPOINT2D& end);
00564    INT32 FindAnyEdge(const DPOINT2D& point);
00565 
00566    ERRVALUE CheckTopologyIsValid();
00567    ERRVALUE CheckEdgeIsValid(const INT32 edge);
00568    ERRVALUE CheckTriangleIsValid(const INT32 triangle);
00569 
00570    bool AContainsB (std::vector<PTTRIANGULATOR::BOUNDSTRUCT>& bounds, INT32 A, INT32 B);
00571    bool IsPointInside(const std::vector<PTTRIANGULATOR::BOUNDSTRUCT>& bounds, const INT32 maxlevels, const DPOINT2D& point);
00572 
00573    #endif // GENERATING_DOXYGEN_OUTPUT
00574    };
00575 
00576 DEFINE_ENUM_OPERATORS(PTTRIANGULATOR::FLAGS);
00577 
00578 #endif   //!< INC_MI32_PTTRIANG_H

Generated on Tue Dec 14 13:18:32 2004 for TNTsdk by  doxygen 1.3.8-20040913