00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef INC_RVC_TINTOOL_H
00021 #define INC_RVC_TINTOOL_H
00022
00023 #ifndef INC_RVC_TIN_H
00024 #include <rvc/tin.h>
00025 #endif
00026
00027 #ifndef INC_RVC_DBTNODE_H
00028 #include <rvc/dbtnode.h>
00029 #endif
00030
00031 #ifndef INC_RVC_DBTEDGE_H
00032 #include <rvc/dbtedge.h>
00033 #endif
00034
00035 #ifndef INC_RVC_DBTTRI_H
00036 #include <rvc/dbttri.h>
00037 #endif
00038
00039 #ifndef INC_RVC_DBTHULL_H
00040 #include <rvc/dbthull.h>
00041 #endif
00042
00043
00044 #ifndef GENERATING_DOXYGEN_OUTPUT
00045
00046 class POLYLINE;
00047 class POLYLINELIST;
00048 namespace RVC {
00049 class TINTOOLKITOBSERVER;
00050 class VECTOR;
00051 }
00052 #endif // GENERATING_DOXYGEN_OUTPUT
00053
00054
00055 namespace RVC {
00056
00057 #define TINCLIPMODE_Include 1
00058 #define TINCLIPMODE_Exclude 2
00059
00061 class TINTOOLKIT : public SUBJECT<TINTOOLKITOBSERVER> {
00062 public:
00063
00064 TINTOOLKIT (
00065 );
00066
00067 ~TINTOOLKIT (
00068 );
00069
00070 ERRVALUE AddLine (
00071 const POLYLINE& PolyLine,
00072 bool HasElevation = true
00073 );
00074
00075 int AddNode (
00076 const DPOINT3D& P,
00077 bool TryOutside = true
00078 );
00079
00080 ERRVALUE AddSegment (
00081 const DPOINT3D& start,
00082 const DPOINT3D& end,
00083 UINT8 type,
00084 bool HasElevation
00085 );
00086
00087 ERRVALUE AddVectorBreaklines (
00088 const RVC::OBJITEM& VectObjItem
00089 );
00090
00091 ERRVALUE ApplyExclude (
00092 const POLYLINELIST& ExcludeList
00093 );
00094
00095 ERRVALUE BuildNodeEdgeList (
00096 );
00097
00098 ERRVALUE ClipByVector (
00099 const RVC::OBJITEM& VectObjItem,
00100 int ClipMode
00101 );
00102
00103 ERRVALUE Close (
00104 bool ForceClose = false
00105 );
00106
00107 ERRVALUE ComputeExtents (
00108 );
00109
00110 ERRVALUE ComputeStatistics (
00111 );
00112
00113 ERRVALUE CreateMinSpanTree (
00114 const RVC::OBJITEM& VectObjItem
00115 );
00116
00117 ERRVALUE CreateTIN (
00118 const POLYLINE& Nodes,
00119 double zscale,
00120 double zoffset,
00121 double xytolerance
00122 );
00123
00124 ERRVALUE DeleteEdgeHole (
00125 INT32 EdgeNum
00126 );
00127
00128 ERRVALUE DeleteEdges (
00129 const SIMPLE_ARRAY<INT32>& EdgeList
00130 );
00131
00132 ERRVALUE DeleteNode (
00133 INT32 NumNode
00134 );
00135
00136 ERRVALUE DeleteNodeHole (
00137 INT32 NodeNum
00138 );
00139
00140 ERRVALUE DeleteNodes (
00141 const SIMPLE_ARRAY<INT32>& NodeList
00142 );
00143
00144 ERRVALUE DeleteNodesHole (
00145 const SIMPLE_ARRAY<INT32>& NodeList
00146 );
00147
00148 ERRVALUE DeleteTriangleHole (
00149 INT32 TriNum
00150 );
00151
00152 ERRVALUE DeleteTriangles (
00153 const SIMPLE_ARRAY<INT32>& TriList
00154 );
00155
00156 ERRVALUE GenerateTIN (
00157 const POLYLINE& Pool,
00158 const POLYLINE* Clip,
00159 const POLYLINELIST& Exclude,
00160 INT32 Flag
00161 );
00162
00163 int GetConnectedNodeList (
00164 INT32 Num,
00165 SIMPLE_ARRAY<INT32>& list
00166 );
00167
00168 ERRVALUE GetConnectedNodes (
00169 INT32 NodeNum,
00170 SIMPLE_ARRAY<RVCTINNODE>& NodeArray,
00171 SIMPLE_ARRAY<INT32>& NodeList
00172 );
00173
00174 ERRVALUE GetEdgeAzimuth (
00175 INT32 NodeNum,
00176 const RVCTINEDGE& Edge,
00177 double& Angle
00178 );
00179
00180 ERRVALUE GetElementExtents (
00181 ELEMTYPE ElemType,
00182 INT32 ElemNum,
00183 DRECT3D& Extents
00184 ) const;
00185
00186 INT32 GetNodeEdges (
00187 INT32 Num,
00188 SIMPLE_ARRAY<INT32>& edgelist
00189 );
00190
00191 INT32 GetNumElements (
00192 ELEMTYPE ElemType
00193 ) const;
00194
00195 ERRVALUE GetSurroundTriangles (
00196 INT32 NodeNum,
00197 SIMPLE_ARRAY<INT32>& TriList,
00198 SIMPLE_ARRAY<INT32>& EdgeList,
00199 SIMPLE_ARRAY<INT32>& NodeList
00200 );
00201
00202 ERRVALUE GetTrianglesPoly (
00203 const POLYLINE& PolyLine,
00204 SIMPLE_ARRAY<INT32>& TList
00205 );
00206
00207 double GetZValue (
00208 ELEMTYPE ElemType,
00209 INT32 ElemNum
00210 ) const;
00211
00212 ERRVALUE MedianFiltering (
00213 );
00214
00215 ERRVALUE Open (
00216 const RVC::OBJITEM& TinObjItem
00217 );
00218
00219 ERRVALUE Open (
00220 const RVC::TIN& TinObj
00221 );
00222
00223 ERRVALUE RebuildHulls (
00224 );
00225
00226 ERRVALUE RebuildTIN (
00227 const BITSET* MaskSet
00228 );
00229
00230 ERRVALUE RemoveFlatNodes (
00231 double dz,
00232 double minedge
00233 );
00234
00235 ERRVALUE RemoveLongEdges (
00236 double distance
00237 );
00238
00239 ERRVALUE Save (
00240 OBJITEM& DestObjItem
00241 );
00242
00243 ERRVALUE SetZValue (
00244 ELEMTYPE ElemType,
00245 INT32 ElemNum,
00246 double zvalue
00247 );
00248
00249 ERRVALUE ValidateTopology (
00250 INT32 flag
00251 );
00252
00253 private:
00254 #ifndef GENERATING_DOXYGEN_OUTPUT
00255
00256 class OPENTIN : public TIN {
00257 public:
00258
00259 OPENTIN (
00260 ) : TIN() {}
00261
00262 OPENTIN (
00263 const OPENTIN& rhs
00264 ) : TIN(rhs) {}
00265
00266 virtual ~OPENTIN (
00267 ) {}
00268
00269 ERRVALUE ClearNodeEdgeList (
00270 ) { return (TIN::ClearNodeEdgeList()); }
00271
00272 ERRVALUE SetNumEdges (
00273 INT32 NewNumEdges
00274 ) { return (TIN::SetNumEdges(NewNumEdges)); }
00275
00276 ERRVALUE SetNumHulls (
00277 INT32 NewNumHulls
00278 ) { return (TIN::SetNumHulls(NewNumHulls)); }
00279
00280 ERRVALUE SetNumNodes (
00281 INT32 NewNumNodes
00282 ) { return (TIN::SetNumNodes(NewNumNodes)); }
00283
00284 ERRVALUE SetNumTriangles (
00285 INT32 NewNumTriangles
00286 ) { return (TIN::SetNumTriangles(NewNumTriangles)); }
00287
00288 ERRVALUE SwapNodeEdges (
00289 INT32 NewNodeNum,
00290 INT32 OldNodeNum
00291 ) { return (TIN::SwapNodeEdges(NewNodeNum, OldNodeNum)); }
00292
00293 };
00294
00295 OPENTIN m_TinObj;
00296 DBASE_TINEDGE m_DBEdgeObj;
00297 DBASE_TINHULL m_DBHullObj;
00298 DBASE_TINNODE m_DBNodeObj;
00299 DBASE_TINTRIANGLE m_DBTriangleObj;
00300 bool m_DisableCallbacks;
00301 SIMPLE_ARRAY<INT32> m_NodeEdgeList;
00302
00303 double SnapDist;
00304 UINT32 SnapOpt;
00305
00306 void CallOnAdd (ELEMTYPE ElemType, INT32 ElemNum);
00307 void CallOnDelete (ELEMTYPE ElemType, INT32 ElemNum, INT32 OtherElemNum);
00308 void CallOnMoveBegin (ELEMTYPE ElemType, INT32 ElemNum);
00309 void CallOnMoveEnd (ELEMTYPE ElemType, INT32 ElemNum);
00310
00311 INT32 AddEdgeRaw (INT32 nodefrom, INT32 nodeto, INT32 trileft, INT32 triright, const RVCTINNODE& Node1, const RVCTINNODE& Node2);
00312 ERRVALUE AddNodeOutside (const DPOINT3D& P);
00313 INT32 AddNodeRaw (const RVCTINNODE& Node);
00314 ERRVALUE AddTriangleRaw (RVCTINTRIANGLE& Triangle, const RVCTINNODE& Node1, const RVCTINNODE& Node2, const RVCTINNODE& Node3);
00315 ERRVALUE AddTriangleRefEdge (INT32 trinum, INT32 refedge, INT32 Node1, INT32 Node2);
00316 ERRVALUE ArbitraryTriangulation (const SIMPLE_ARRAY<INT32> List);
00317 ERRVALUE ChangeEdge (INT32 NumEdge, INT32 NewNode1, INT32 NewNode2, INT32 NewLeft, INT32 NewRight, const DRECT2D& Extents);
00318 ERRVALUE ChangeMinMax (ELEMTYPE ElemType, INT32 ElemNum, const DRECT2D& Extents);
00319 ERRVALUE ChangeNodeReferences (INT32 NewNum, INT32 OldNum);
00320 ERRVALUE CreateEdgeTable (INT32 TriStart);
00321 ERRVALUE DeleteEdgeRaw (INT32 EdgeNum);
00322 ERRVALUE DeleteNodeRawQuick (INT32 NodeNum);
00323 ERRVALUE DeleteNodeTemp (INT32 NodeNum);
00324 ERRVALUE DeleteTriangleRaw (INT32 TriangleNum);
00325 ERRVALUE DetermineEdge (const DPOINT3D& P, INT32& EdgeNum);
00326 ERRVALUE DetermineTriangle (const DPOINT3D& P, INT32& TriNum);
00327 ERRVALUE DivideTwoTriangles (INT32 num, const RVCTINTRIANGLE& oldT, RVCTINNODE extNodes[4], int flag[3]);
00328 INT32 FindNextHullEdge (INT32& curnode, INT32& curedge);
00329 INT32 GenerateNewEdge (INT32 nodefrom, INT32 nodeto, INT32 trileft, INT32 triright);
00330 ERRVALUE GenerateNewTriangle (RVCTINTRIANGLE& Triangle);
00331
00332 double GenerateThreshold (
00333 double resolution
00334 ) const {
00335 DRECT3D Extents;
00336 m_TinObj.GetExtents(Extents);
00337 double thresh = MIN(Extents.GetHeight(), Extents.GetWidth());
00338 return (fabs(thresh * resolution));
00339 }
00340
00341 ERRVALUE GetAngle (INT32 Start, INT32 End, double& Angle);
00342 ERRVALUE GetEdgeLength (INT32 Num, double& length);
00343 ERRVALUE GetHullInfo (const SIMPLE_ARRAY<RVCTINHULLEDGE> HullEdgeArray, RVCTINHULL& Hull);
00344 int GetNodeConnection (INT32 Node1, INT32 Node2, INT32& edge, INT32& lefttri, INT32& righttri);
00345 ERRVALUE GetNodeTriangles (INT32 NodeNum, SIMPLE_ARRAY<INT32>& TriangleList);
00346 int GetNumConnection (INT32 N1, INT32 N2, INT32 N3);
00347 bool HasNodeEdgeLink ();
00348 ERRVALUE InsertEdge (const DPOINT3D& start, const DPOINT3D& end, UINT8 type);
00349 ERRVALUE InsertNode (INT32 TriNum, const DPOINT3D& Pos);
00350 int IsANode (const DPOINT3D& P, INT32& NodeNum);
00351 ERRVALUE IsCrossReferenced (INT32 TriNum, INT32 CheckNum);
00352 int IsTriangleInPolygon (const POLYLINE& PolyLine, INT32 TriNum);
00353 ERRVALUE MarkEdgeFromSide (INT32 NumEdge, INT32 Tnum, INT32 NewNum);
00354 ERRVALUE MarkTriangleFromSide (INT32 NumTri, INT32 Tnum, INT32 NewNum);
00355 ERRVALUE PlugInTriangle (INT32 Node1, INT32 Node2, INT32 Node3);
00356 ERRVALUE RemoveTriangleRaw (INT32 TriNum, INT32 NodeNum);
00357 ERRVALUE RestoreTopology (INT32 NumStart, INT32 *Array);
00358
00359 ERRVALUE SortNodesArroundNode (INT32 Center, SIMPLE_ARRAY<INT32>& NodeList);
00360 ERRVALUE SupressTriangleRaw (INT32 TriNum, INT32 NodeNum);
00361 int SwapEdgesInTriangle (INT32 t1, INT32 t2);
00362 ERRVALUE Triangulation (SIMPLE_ARRAY<RVCTINNODE>& Nodes);
00363 ERRVALUE UpdateDatabase (ELEMTYPE ElemType);
00364 ERRVALUE UpdateEdgeRefTriangle (INT32 EdgeNum, INT32 NewNum, INT32 OldNum);
00365 ERRVALUE UpdateEdgeSideRef (INT32 EdgeNum, INT32 start, INT32 end, INT32 NewNum, INT32 OldNum);
00366 ERRVALUE UpdateNodeRefEdge (INT32 NodeNum, INT32 NewNum, INT32 OldNum);
00367 ERRVALUE UpdateQTree (ELEMTYPE ElemType, INT32 NewElemNum, INT32 DeletedElemNum);
00368 ERRVALUE UpdateTriangleEdgeFlag (INT32 TriNum, INT32 EdgeNum, UINT8 flag);
00369 ERRVALUE UpdateTriangleRefEdge (INT32 TriNum, INT32 NewNum, INT32 OldNum);
00370 ERRVALUE UpdateTriangleRefNode (INT32 TriNum, INT32 NewNum, INT32 OldNum);
00371 ERRVALUE UpdateTriangleRefTriangle (INT32 TriNum, INT32 NewNum, INT32 OldNum);
00372 ERRVALUE UpdateTriangleSideRef (INT32 TriNum, INT32 EdgeNum, INT32 NewNum, INT32 OldNum);
00373 ERRVALUE WriteEdgeAsSegment (INT32 EdgeNum, RVC::VECTOR& VectObj);
00374 #endif // GENERATING_DOXYGEN_OUTPUT
00375 };
00376
00377
00378 class TINTOOLKITOBSERVER : public OBSERVER_BASE {
00379 public:
00380
00381 TINTOOLKITOBSERVER (
00382 TINTOOLKIT& ttk
00383 ) : OBSERVER_BASE(ttk) {}
00384
00385 virtual ~TINTOOLKITOBSERVER (
00386 ) {}
00387
00388 private:
00389 #ifndef GENERATING_DOXYGEN_OUTPUT
00390
00391 virtual void OnAdd (
00392 ELEMTYPE ElemType,
00393 INT32 ElemNum
00394 );
00395
00396 virtual void OnDelete (
00397 ELEMTYPE ElemType,
00398 INT32 ElemNum,
00399 INT32 OtherElemNum
00400 );
00401
00402 virtual void OnMoveBegin (
00403 ELEMTYPE ElemType,
00404 INT32 ElemNum
00405 );
00406
00407 virtual void OnMoveEnd (
00408 ELEMTYPE ElemType,
00409 INT32 ElemNum
00410 );
00411
00412 friend class TINTOOLKIT;
00413 #endif // GENERATING_DOXYGEN_OUTPUT
00414 };
00415
00416 }
00417
00418 #endif // INC_RVC_TINTOOL_H