00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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
00081 class GEOMLIBCLASSEXPORT PTTRIANGULATOR {
00082
00083 public:
00084
00085
00086 enum RULE {
00087 RULE_Delaunay = 0,
00088 RULE_ShorterEdge = 1
00089 };
00090
00091
00092 enum POINTTYPE {
00093 POINTTYPE_Regular = 0,
00094 POINTTYPE_Break = 1,
00095 POINTTYPE_Clip = 2,
00096 POINTTYPE_Intersection = 3
00097 };
00098
00099
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
00124
00125 INT32 AddPoint (
00126 const DPOINT2D& point
00127 );
00128
00129
00130
00131 INT32 AddPoints (
00132 const DOUBLE_ARRAY<DPOINT2D>& points
00133 );
00134
00135
00136
00137 INT32 AddPoints (
00138 const DOUBLE_ARRAY<DPOINT3D>& points
00139 );
00140
00141
00142 void AddHardEdge (
00143 const DPOINT2D& start, const DPOINT2D& end
00144 );
00145
00146
00147 ERRVALUE AddHardEdge (
00148 const INT32& start,
00149 const INT32& end
00150 );
00151
00152
00153 void AddHardLine (
00154 const DOUBLE_ARRAY<DPOINT2D>& points
00155 );
00156
00157
00158 void AddHardLine (
00159 const DOUBLE_ARRAY<DPOINT3D>& points
00160 );
00161
00162
00163 void AddHardLine (
00164 const POLYLINE& polyline
00165 );
00166
00167
00168 void ClearAll (
00169 );
00170
00171
00172 void ClearPoints (
00173 );
00174
00175
00176 void ClearHardEdges (
00177 );
00178
00179
00180 void ClearClipRegion (
00181 ) { m_ClipRegion.Clear(); return; };
00182
00183
00184
00185 INT32 GetNumNodes (
00186 ) const;
00187
00188
00189
00190 INT32 GetNumEdges (
00191 ) const;
00192
00193
00194
00195 INT32 GetNumTriangles (
00196 ) const;
00197
00198
00199
00200 bool GetTriangleNodes (
00201 const INT32 triangle,
00202 TRIANGLENODES& nodes
00203 ) const;
00204
00205
00206
00207 bool GetTriangleEdges (
00208 const INT32 triangle,
00209 TRIANGLEEDGES& edges
00210 ) const;
00211
00212
00213
00214 bool GetTriangleTriangles (
00215 const INT32 triangle,
00216 TRIANGLETRIANGLES& triangles
00217 ) const;
00218
00219
00220
00221 bool GetPoint (
00222 const INT32 node,
00223 DPOINT2D& point
00224 ) const;
00225
00226
00227
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
00241
00242 bool GetEdgeInfo (
00243 const INT32 edge,
00244 EDGEINFO& edgeinfo
00245 ) const;
00246
00247
00248
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
00373 void SetClipRegion (
00374 const REGION2D& region
00375 ) { m_IsTriangulated = false; m_ClipRegion = region; return; };
00376
00377
00378
00379 RULE GetRule (
00380 ) {return m_Rule; };
00381
00382
00383
00384 double GetTolerance (
00385 ) {return m_Tolerance; };
00386
00387
00388
00389 INT32 GetModifyStamp (
00390 ) { return m_ModifyStamp; };
00391
00392
00393
00394 bool IsTriangulated (
00395 ) { return m_IsTriangulated; };
00396
00397
00398
00399 ERRVALUE Triangulate (
00400 const double tolerance = 0.0,
00401 const RULE rule = RULE_Delaunay
00402 );
00403
00404
00405 PTTRIANGULATOR (
00406 );
00407
00408
00409 ~PTTRIANGULATOR (
00410 );
00411
00412
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;
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