00001
00026 #ifndef INC_MI32_DELAUNAY_H
00027 #define INC_MI32_DELAUNAY_H
00028
00029 #ifndef INC_MI32_PTTRIANG_H
00030 #include <mi32/pttriang.h>
00031 #endif
00032
00033 #ifndef INC_MI32_ARRAYCACHE_H
00034 #include <mi32/arraycache.h>
00035 #endif
00036
00037 #ifndef INC_MI32_BALANCEDTREE_H
00038 #include <mi32/balancedtree.h>
00039 #endif
00040
00041 #ifndef INC_SET
00042 #include <set>
00043 #define INC_SET
00044 #endif
00045
00046
00048 class DELAUNAY {
00049 public:
00050
00052 DELAUNAY (const double MaximumMemory = 128.0);
00053
00055 ~DELAUNAY ();
00056
00059 INT32 AddPoint2D (
00060 const DPOINT2D& point
00061 );
00062
00065 INT32 AddPoint3D (
00066 const DPOINT3D& point
00067 );
00068
00071 INT32 AddPoints (
00072 const DOUBLE_ARRAY<DPOINT2D>& points
00073 );
00074
00077 INT32 AddPoints (
00078 const DOUBLE_ARRAY<DPOINT3D>& points
00079 );
00080
00083 INT32 AddPoints (
00084 const POLYLINE& polyline
00085 );
00086
00088 void Free (
00089 );
00090
00093 INT32 GetNumNodes (
00094 ) const;
00095
00098 INT32 GetNumEdges (
00099 ) const;
00100
00103 INT32 GetNumTriangles (
00104 ) const;
00105
00108 bool GetPoint2D (
00109 const INT32 node,
00110 DPOINT2D& point
00111 );
00112
00115 bool GetPoint3D (
00116 const INT32 node,
00117 DPOINT3D& point
00118 );
00119
00122 INT32 GetIndex (
00123 const INT32 node
00124 );
00125
00126 INT32 GetNode (
00127 const INT32 index
00128 );
00129
00132 bool GetEdgeInfo (
00133 const INT32 edge,
00134 EDGEINFO& edgeinfo
00135 );
00136
00139 bool GetTriangleInfo (
00140 const INT32 triangle,
00141 TRIANGLEINFO& triangleinfo
00142 );
00143
00146 double GetTolerance (
00147 ) const { return m_Tolerance; };
00148
00151 bool IsTriangulated (
00152 ) const { return m_IsTriangulated; };
00153
00155 ERRVALUE Triangulate (
00156 const double tolerance
00157 );
00158
00159 private:
00160
00161 #ifndef GENERATING_DOXYGEN_OUTPUT
00162
00163 struct QUADRUPLE {
00164 QUADRUPLE (
00165 const INT32 n1,
00166 const INT32 n2,
00167 const INT32 n3,
00168 const INT32 n4
00169 ) :
00170 node1(n1),
00171 node2(n2),
00172 node3(n3),
00173 node4(n4)
00174 {
00175 };
00176
00177 bool operator < (
00178 const QUADRUPLE& q
00179 ) const {
00180 if (node1 < q.node1) return true;
00181 if (node1 > q.node1) return false;
00182 if (node2 < q.node2) return true;
00183 if (node2 > q.node2) return false;
00184 if (node3 < q.node3) return true;
00185 if (node3 > q.node3) return false;
00186 if (node4 < q.node4) return true;
00187 return false;
00188 };
00189 const INT32 node1;
00190 const INT32 node2;
00191 const INT32 node3;
00192 const INT32 node4;
00193 };
00194
00195 class TEST : public BALANCEDTREE<DPOINT3D>::TEST {
00196 public:
00197 TEST () { }
00198 virtual int v_TestItems (const DPOINT3D& p1, const DPOINT3D& pt);
00199 };
00200
00201 class DUMP : public BALANCEDTREE<DPOINT3D>::DUMP {
00202 public:
00203 DUMP (DELAUNAY& delaunay) : m_Delaunay(delaunay), m_Count(0) { }
00204 INT32 GetCount () { return m_Count; }
00205 virtual ERRVALUE v_DumpItem (const DPOINT3D& p, INT32 tagnum);
00206 private:
00207 DELAUNAY& m_Delaunay;
00208 INT32 m_Count;
00209 };
00210
00211 friend class DUMP;
00212
00213 const INT32 m_NumOfPointsInMemoryLimit;
00214
00215 bool m_IsTriangulated;
00216 double m_Tolerance;
00217
00218 DOUBLE_ARRAY<DPOINT3D> m_Points;
00219
00220 MILIST<INT32> m_WorkHull;
00221
00222 std::set<INT32> m_DirtyEdges;
00223 std::set<QUADRUPLE> m_Set;
00224
00225 RVC::OBJECT m_File;
00226
00227 RVC::ARRAY m_PointsArray;
00228 RVC::ARRAY m_WorkPointsArray;
00229 RVC::ARRAY m_WorkZArray;
00230 RVC::ARRAY m_WorkNodesArray;
00231 RVC::ARRAY m_WorkIndicesArray;
00232 RVC::ARRAY m_WorkEdgesArray;
00233 RVC::ARRAY m_WorkTrianglesArray;
00234
00235 ARRAYCACHE<DPOINT2D> m_WorkPointsCache;
00236 ARRAYCACHE<double> m_WorkZCache;
00237 ARRAYCACHE<INT32> m_WorkNodesCache;
00238 ARRAYCACHE<INT32> m_WorkIndicesCache;
00239 ARRAYCACHE<EDGEINFO> m_WorkEdgesCache;
00240 ARRAYCACHE<TRIANGLEEDGES> m_WorkTrianglesCache;
00241
00242 PTTRIANGULATOR m_Triangulator;
00243 bool m_Hard;
00244
00245 static int ComparePoints(void*, void*, void*);
00246
00248 DELAUNAY (
00249 const DELAUNAY& rhs
00250 );
00251
00253 DELAUNAY& operator= (
00254 const DELAUNAY& rhs
00255 );
00256
00257 ERRVALUE Init ();
00258
00259 double ConvexTest (const INT32 n1, const INT32 n2, const INT32 n3);
00260
00261 INT32 GetUncommonNode (const INT32 edge, const EDGEINFO& edgeinfo, const INT32 tedge);
00262 INT32 GetSideNode (const INT32 edge, const bool side);
00263
00264 INT32 GetFrontEdge (const INT32 edge, const EDGEINFO& edgeinfo, const INT32 tedge, const bool front);
00265 INT32 GetSideFrontEdge (const INT32 edge, const bool side, const bool front);
00266
00267 ERRVALUE ClearStructures ();
00268 ERRVALUE SortWorkNodes ();
00269 ERRVALUE FindFirstTriangle ();
00270 ERRVALUE ConstructAllTriangles ();
00271
00272 ERRVALUE CheckDirtyEdges ();
00273 bool IsSwapNeeded (const INT32 edge);
00274 ERRVALUE SwapEdge (const INT32 edge);
00275 bool CircleTest (const INT32 bottomnode, const INT32 leftnode, const INT32 topnode, const INT32 rightnode);
00276
00277 #endif // GENERATING_DOXYGEN_OUTPUT
00278 };
00279
00280 #endif // MI32_DELAUNAY_H