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
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 #ifndef INC_RVC_TIN_H
00174 #define INC_RVC_TIN_H
00175
00176 #ifndef INC_RVC_GEOMETRC_H
00177 #include <rvc/geometrc.h>
00178 #endif
00179
00180 #ifndef INC_MI32_RVCTIN_H
00181 #include <mi32/rvctin.h>
00182 #endif
00183
00184 #ifndef INC_MI32_SIMPLEAR_H
00185 #include <mi32/simplear.h>
00186 #endif
00187
00188 namespace RVC {
00189
00190 #ifndef GENERATING_DOXYGEN_OUTPUT
00191
00192 class QSEARCHTREE;
00193 #endif // GENERATING_DOXYGEN_OUTPUT
00194
00195 class TIN : public GEOMETRIC {
00196 public:
00197
00198 #ifndef GENERATING_DOXYGEN_OUTPUT
00199 class MAKEPARMS;
00200 #endif // GENERATING_DOXYGEN_OUTPUT
00201
00202
00203
00204
00205
00206 template <class _ELEM>
00207 class ELEMITERATOR {
00208 public:
00209
00210
00211
00212
00213 ELEMITERATOR (
00214 ) :
00215 m_ElemNum(-1),
00216 m_CurrentObj(0)
00217 {}
00218
00219
00220 ELEMITERATOR (
00221 int WorthlessValue
00222 ) :
00223 m_ElemNum(-1),
00224 m_CurrentObj(0)
00225 {}
00226
00227
00228 ELEMITERATOR (
00229 const RVC::TIN* tin,
00230 INT32 ElemNum
00231 ) :
00232 m_ElemNum(ElemNum),
00233 m_CurrentObj(tin)
00234 {}
00235
00236
00237 ELEMITERATOR (
00238 const ELEMITERATOR<_ELEM>& rhs
00239 ) :
00240 m_ElemNum(rhs.m_ElemNum),
00241 m_CurrentObj(rhs.m_CurrentObj),
00242 m_Element(rhs.m_Element)
00243 {}
00244
00245
00246 ELEMITERATOR (
00247 const RVC::TIN* tin
00248 ) :
00249 m_ElemNum(-1),
00250 m_CurrentObj(tin)
00251 {
00252 ERRVALUE err = 0;
00253 do {
00254 m_ElemNum ++;
00255 ERRORPOSNDISABLE disable;
00256 err = m_CurrentObj->Read(m_ElemNum, m_Element);
00257 if (err < 0) m_ElemNum = -1;
00258 } while (err >= 0 && !m_Element.IsValid());
00259 }
00260
00261
00262 virtual ~ELEMITERATOR (
00263 ) {}
00264
00265
00266 ELEMITERATOR<_ELEM>& operator= (
00267 const ELEMITERATOR<_ELEM>& rhs
00268 ) {
00269 if (this != &rhs) {
00270 m_ElemNum = rhs.m_ElemNum;
00271 m_CurrentObj = rhs.m_CurrentObj;
00272 m_Element = rhs.m_Element;
00273 }
00274 return (*this);
00275 }
00276
00277
00278 const _ELEM& operator* (
00279 ) const { return (m_Element); }
00280
00281
00282 const _ELEM* operator-> (
00283 ) const { return (&**this); }
00284
00285
00286 ELEMITERATOR<_ELEM>& operator++ (
00287 ) {
00288 ERRVALUE err = 0;
00289 do {
00290 m_ElemNum ++;
00291 ERRORPOSNDISABLE disable;
00292 err = m_CurrentObj->Read(m_ElemNum, m_Element);
00293 if (err < 0) m_ElemNum = -1;
00294 } while (err >= 0 && !m_Element.IsValid());
00295 return (*this);
00296 }
00297
00298
00299 bool operator== (
00300 const ELEMITERATOR<_ELEM>& rhs
00301 ) const { return (m_ElemNum == rhs.m_ElemNum && m_CurrentObj == rhs.m_CurrentObj); }
00302
00303
00304 bool operator!= (
00305 const ELEMITERATOR<_ELEM>& rhs
00306 ) const { return (!(*this == rhs)); }
00307
00308 INT32 GetElementNumber (
00309 ) const { return (m_ElemNum); }
00310
00311 protected:
00312 INT32 m_ElemNum;
00313 const TIN *m_CurrentObj;
00314 _ELEM m_Element;
00315 };
00316
00317 typedef ELEMITERATOR<RVCTINEDGE> EDGEITERATOR;
00318 typedef ELEMITERATOR<RVCTINHULL> HULLITERATOR;
00319 typedef ELEMITERATOR<RVCTINNODE> NODEITERATOR;
00320 typedef ELEMITERATOR<RVCTINTRIANGLE> TRIANGLEITERATOR;
00321
00322
00323 TIN (
00324 );
00325
00326
00327 TIN (
00328 const RVC::TIN& rhs
00329 );
00330
00331
00332 virtual ~TIN (
00333 );
00334
00335
00336 RVC::TIN& operator= (
00337 const RVC::TIN& rhs
00338 );
00339
00340
00341
00342 INT32 Add (
00343 const RVCTINEDGE& edge
00344 );
00345
00346
00347
00348 INT32 Add (
00349 const RVCTINHULL& hull
00350 );
00351
00352
00353
00354 INT32 Add (
00355 const RVCTINNODE& node
00356 );
00357
00358
00359
00360 INT32 Add (
00361 const RVCTINTRIANGLE& triangle
00362 );
00363
00364
00365
00366 int ComputeElevation (
00367 DPOINT3D& pt
00368 );
00369
00370
00371 ERRVALUE ComputePlaneCoefficients (
00372 INT32 TriangleNum,
00373 double& A,
00374 double& B,
00375 double& C,
00376 double& D
00377 );
00378
00379
00380 template <class _ELEM> ELEMITERATOR<_ELEM> ElementBegin (
00381 ELEMITERATOR<_ELEM> item
00382 ) const {
00383 return (ELEMITERATOR<_ELEM>(this));
00384 }
00385
00386
00387 template <class _ELEM> ELEMITERATOR<_ELEM> ElementEnd (
00388 ELEMITERATOR<_ELEM> item
00389 ) const {
00390 return (ELEMITERATOR<_ELEM>(this, -1));
00391 }
00392
00393
00394 ERRVALUE GetMakeParms (
00395 RVC::TIN::MAKEPARMS& MakeParms
00396 ) const;
00397
00398
00399
00400 INT32 GetNextEdgeID (
00401 ) const;
00402
00403
00404
00405 INT32 GetNextNodeID (
00406 ) const;
00407
00408
00409
00410 INT32 GetNextTriangleID (
00411 ) const;
00412
00413
00414
00415 INT32 GetNumEdges (
00416 ) const;
00417
00418
00419
00420 INT32 GetNumHullEdges (
00421 INT32 hullnum
00422 ) const;
00423
00424
00425
00426 INT32 GetNumHullIslands (
00427 INT32 hullnum
00428 ) const;
00429
00430
00431
00432 INT32 GetNumHulls (
00433 ) const;
00434
00435
00436
00437 INT32 GetNumNodeEdges (
00438 INT32 NodeNum
00439 ) const;
00440
00441
00442
00443 INT32 GetNumNodes (
00444 ) const;
00445
00446
00447
00448 INT32 GetNumTriangles (
00449 ) const;
00450
00451
00452
00453 double GetTolerance (
00454 ) const;
00455
00456
00457 ERRVALUE Make (
00458 const RVC::OBJECT& parent,
00459 const RVC::OBJECTNAME& name,
00460 const RVC::OBJECTDESC& desc,
00461 const MAKEPARMS& MakeParms,
00462 const char* Source = 0
00463 );
00464
00465
00466 ERRVALUE Make (
00467 const RVC::OBJITEM& ObjItem,
00468 const MAKEPARMS& MakeParms,
00469 const char* Source = 0
00470 );
00471
00472
00473 ERRVALUE Read (
00474 INT32 EdgeNum,
00475 RVCTINEDGE& Edge
00476 ) const;
00477
00478
00479 ERRVALUE Read (
00480 INT32 hullnum,
00481 RVCTINHULL& hull
00482 ) const;
00483
00484
00485 ERRVALUE Read (
00486 INT32 nodenum,
00487 RVCTINNODE& node
00488 ) const;
00489
00490
00491 ERRVALUE Read (
00492 INT32 trinum,
00493 RVCTINTRIANGLE& triangle
00494 ) const;
00495
00496
00497 ERRVALUE ReadHullEdges (
00498 INT32 hullnum,
00499 INT32 start,
00500 INT32 count,
00501 SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00502 ) const;
00503
00504
00505 ERRVALUE ReadHullIslands (
00506 INT32 hullnum,
00507 INT32 start,
00508 INT32 count,
00509 SIMPLE_ARRAY<INT32>& islands
00510 ) const;
00511
00512
00513 ERRVALUE ReadNodeEdges (
00514 INT32 nodenum,
00515 SIMPLE_ARRAY<INT32>& EdgeList
00516 ) const;
00517
00518
00519 ERRVALUE ReadNodeEdges (
00520 INT32 nodenum,
00521 INT32 start,
00522 INT32 count,
00523 SIMPLE_ARRAY<INT32>& Edges
00524 ) const;
00525
00526
00527 ERRVALUE SetNextEdgeID (
00528 INT32 NextEdgeID
00529 );
00530
00531
00532 ERRVALUE SetNextNodeID (
00533 INT32 NextNodeID
00534 );
00535
00536
00537 ERRVALUE SetNextTriangleID (
00538 INT32 NextTriangleID
00539 );
00540
00541
00542 ERRVALUE SetTolerance (
00543 double tolerance
00544 );
00545
00546
00547 ERRVALUE SwapHullEdges (
00548 INT32 hullnum1,
00549 INT32 hullnum2
00550 );
00551
00552
00553 ERRVALUE SwapNodeEdges (
00554 INT32 node1,
00555 INT32 node2
00556 );
00557
00558
00559
00560 ERRVALUE Write (
00561 INT32 edgenum,
00562 const RVCTINEDGE& edge
00563 );
00564
00565
00566
00567 ERRVALUE Write (
00568 INT32 hullnum,
00569 const RVCTINHULL& hull
00570 );
00571
00572
00573
00574 ERRVALUE Write (
00575 INT32 nodenum,
00576 const RVCTINNODE& node
00577 );
00578
00579
00580
00581 ERRVALUE Write (
00582 INT32 TriangleNum,
00583 const RVCTINTRIANGLE& triangle
00584 );
00585
00586
00587
00588 ERRVALUE WriteHullEdges (
00589 INT32 hullnum,
00590 const SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00591 );
00592
00593
00594
00595 ERRVALUE WriteHullEdges (
00596 INT32 hullnum,
00597 INT32 total,
00598 INT32 start,
00599 INT32 count,
00600 const SIMPLE_ARRAY<RVCTINHULLEDGE>& edges
00601 );
00602
00603
00604
00605 ERRVALUE WriteHullIslands (
00606 INT32 hullnum,
00607 INT32 total,
00608 INT32 start,
00609 INT32 count,
00610 const INT32 *islands
00611 );
00612
00613
00614
00615 ERRVALUE WriteNodeEdges (
00616 INT32 nodenum,
00617 const SIMPLE_ARRAY<INT32>& EdgeList
00618 );
00619
00620
00621
00622 ERRVALUE WriteNodeEdges (
00623 INT32 nodenum,
00624 INT32 NumEdges,
00625 INT32 start,
00626 INT32 count,
00627 const SIMPLE_ARRAY<INT32>& EdgeList
00628 );
00629
00630 protected:
00631
00632 ERRVALUE ClearNodeEdgeList ();
00633 ERRVALUE SetNumEdges (INT32 NewNumEdges);
00634 ERRVALUE SetNumHulls (INT32 NewNumHulls);
00635 ERRVALUE SetNumNodes (INT32 NewNumNodes);
00636 ERRVALUE SetNumTriangles (INT32 NewNumTriangles);
00637
00638 private:
00639 #ifndef GENERATING_DOXYGEN_OUTPUT
00640
00641
00642 virtual ERRVALUE v_CloseObject ();
00643 virtual OBJTYPE v_GetDftObjectType () const;
00644 virtual bool v_IsObjectOpen () const;
00645 virtual ERRVALUE v_OpenObject (OPENMODE OpenFlags, MDLGPARENT parent);
00646
00647
00648 virtual void v_GetExtents (DRECT3D &extents) const;
00649 virtual void v_GetScale (double& xscale, double& yscale) const;
00650 virtual double v_GetZScale () const;
00651 virtual double v_GetZOffset () const;
00652 virtual bool v_HasCapability (int Capability) const;
00653 virtual void v_SetScale (double xscale, double yscale);
00654 virtual void v_SetZOffset (double zoffset);
00655 virtual void v_SetZScale (double zscale);
00656
00657
00658 virtual ERRVALUE v_AddSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType, const DRECT2D& Extents);
00659 virtual ERRVALUE v_BuildSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00660 virtual ERRVALUE v_ClearSearchTree (INT32 InitialNumElements, ELEMTYPE ElemType, const DRECT2D& Extents);
00661 virtual ERRVALUE v_CopySearchTreeElement (INT32 SourceElement, INT32 DestElement, ELEMTYPE ElemType, const DRECT2D& Extents);
00662 virtual ERRVALUE v_DeleteSearchTreeElement (INT32 elemnum, ELEMTYPE ElemType);
00663 virtual ERRVALUE v_ExtractTo (RVC::GEOMETRIC& DestObj, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, const TRANS2D_MAPGEN& tmg, RVC::GEOMETRIC::EXTRACTFLAGS ExtractFlags) const;
00664 virtual INT32 v_FindClosestElementLow (ELEMTYPE ElemType, const DPOINT2D& SearchPt, GEOMETRIC::SEARCHFILTER* SearchFilter, double SearchDist, double* DistFromElem) const;
00665 virtual ERRVALUE v_FindElementDrawSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00666 virtual ERRVALUE v_FindElementSearchSet (ELEMTYPE ElemType, const DRECT2D& SearchExtents, SEARCHRESULT& SearchResult) const;
00667 virtual ERRVALUE v_GetElementExtents (ELEMTYPE ElemType, INT32 ElemNum, DRECT3D& Extents) const;
00668 virtual INT32 v_GetNextElementID (ELEMTYPE ElemType) const;
00669 virtual INT32 v_GetNumElements (ELEMTYPE ElemType) const;
00670 virtual POINTTYPE v_GetPointType () const {return (POINTTYPE_3DXYZ);}
00671 virtual INT32 v_GetPointSize () const {return (sizeof(DPOINT3D));}
00672 virtual bool v_IsElementDeleted (const RVC::ELEMENT& Element) const;
00673 virtual bool v_IsEmpty () const;
00674 virtual ERRVALUE v_SaveSearchTrees ();
00675 virtual ERRVALUE v_SetExtents (const DRECT3D &extents);
00676 virtual ERRVALUE v_SetNextElementID (ELEMTYPE ElemType, INT32 NextElementID);
00677 virtual bool v_SetSearchTree (ELEMTYPE ElemType, RVC::QSEARCHTREE* SearchTree, bool ReplaceExisting);
00678 virtual int v_SetupElemTransList (const RVC::GEOMETRIC::ELEMSELECTPARMS& SelectParms, RVC::GEOMETRIC::ELEMTRANSLIST& TransList, RVC::GEOMETRIC::ELEMSELECTFILTER* SelectFilter) const;
00679 virtual bool v_TestElementAgainstRegion (const RVC::ELEMENT& Element, const REGION2D& region, TESTCRITERIA TestMode) const;
00680 virtual bool v_TestElementAgainstRegion (ELEMTYPE ElemType, INT32 ElemNum, const GEOREGION& region, GEOREGION::TESTMODE TestMode) const;
00681 virtual ERRVALUE v_UpdateExtents (const DRECT3D &extents);
00682
00683
00684
00685 int m_TinID;
00686 mutable QSEARCHTREE *m_NodeQTree;
00687 mutable QSEARCHTREE *m_EdgeQTree;
00688 mutable QSEARCHTREE *m_TriQTree;
00689 #endif // GENERATING_DOXYGEN_OUTPUT
00690 };
00691
00692
00693
00694 class TIN::MAKEPARMS : public RVC::GEOMETRIC::MAKEPARMSBASE {
00695 public:
00696
00697 MAKEPARMS (
00698 ) :
00699 GEOMETRIC::MAKEPARMSBASE(GEOMETRIC::POINTTYPE_3DXYZ),
00700 m_ZOffset(0.0),
00701 m_NextEdgeID(1),
00702 m_NextNodeID(10),
00703 m_NextTriangleID(1),
00704 m_tolerance(0.0)
00705 {}
00706
00707
00708 MAKEPARMS (
00709 const RVC::TIN& Object
00710 );
00711
00712
00713
00714 INT32 GetNextEdgeID (
00715 ) const {return (m_NextEdgeID);}
00716
00717
00718
00719 INT32 GetNextNodeID (
00720 ) const {return (m_NextNodeID);}
00721
00722
00723
00724 INT32 GetNextTriangleID (
00725 ) const {return (m_NextTriangleID);}
00726
00727
00728
00729 double GetTolerance (
00730 ) const { return (m_tolerance); }
00731
00732
00733
00734 double GetZOffset (
00735 ) const {return (m_ZOffset);}
00736
00737
00738 void SetNextEdgeID (
00739 INT32 NextEdgeID
00740 ) {m_NextEdgeID = NextEdgeID;}
00741
00742
00743 void SetNextNodeID (
00744 INT32 NextNodeID
00745 ) {m_NextNodeID = NextNodeID;}
00746
00747
00748 void SetNextTriangleID (
00749 INT32 NextTriangleID
00750 ) {m_NextTriangleID = NextTriangleID;}
00751
00752
00753 void SetTolerance (
00754 double tolerance
00755 ) { m_tolerance = tolerance; }
00756
00757
00758 void SetZOffset (
00759 double zoffset
00760 ) {m_ZOffset = zoffset;}
00761
00762 private:
00763 #ifndef GENERATING_DOXYGEN_OUTPUT
00764 double m_ZOffset;
00765 INT32 m_NextEdgeID;
00766 INT32 m_NextNodeID;
00767 INT32 m_NextTriangleID;
00768 double m_tolerance;
00769 #endif // GENERATING_DOXYGEN_OUTPUT
00770 };
00771
00772 }
00773
00774 #endif