Statistics
| Revision:

svn-gvsig-desktop / tags / v1_10_0_Build_1259 / libraries / libjni-readecw-linux / include / NCSQuadTree.h @ 43233

History | View | Annotate | Download (4.58 KB)

1
/********************************************************
2
** Copyright 1999 Earth Resource Mapping Ltd.
3
** This document contains proprietary source code of
4
** Earth Resource Mapping Ltd, and can only be used under
5
** one of the three licenses as described in the 
6
** license.txt file supplied with this distribution. 
7
** See separate license.txt file for license details 
8
** and conditions.
9
**
10
** This software is covered by US patent #6,442,298,
11
** #6,102,897 and #6,633,688.  Rights to use these patents 
12
** is included in the license agreements.
13
**
14
** FILE:    NCSQTree.h
15
** CREATED: Thu Feb 25 09:19:00 WST 1999
16
** AUTHOR:  Mark Sheridan
17
** PURPOSE: Generic Quad tree class for NCS. User should
18
**                        inherit directly from this class and supply
19
**                        the required virtual functions
20
** EDITS:
21
 *******************************************************/
22

    
23
#ifndef NCSQUADTREE_H
24
#define NCSQUADTREE_H
25

    
26
#include "NCSTypes.h"
27
#include "NCSErrors.h"
28
#include "NCSDefs.h"
29
#include "NCSMalloc.h"
30
#include "NCSMutex.h"
31
#include <math.h>
32
#if (defined(WIN32) && !defined(_WIN32_WCE))
33
#include <crtdbg.h>
34
#endif
35

    
36
#define NCSQTreeGetNodeQuad1(pNode) (pNode->nw)
37
#define NCSQTreeGetNodeQuad2(pNode) (pNode->ne)
38
#define NCSQTreeGetNodeQuad3(pNode) (pNode->se)
39
#define NCSQTreeGetNodeQuad4(pNode) (pNode->sw)
40
#define NCSQTreeGetNodeData(pNode)  (pNode->pData)
41
#define NCSQTreeSetNodeData(pNode, pData)  \
42
         pNode->pData = (void *)pData
43

    
44
typedef struct NCSQTreeNode {
45
        void   *pData;                                // Pointer to generic data pointer
46
        UINT32 nID;                                        // Unique ID of this node
47
        IEEE8  dWorldX;                                // World X coordinate of node
48
        IEEE8  dWorldY;                                // World Y coordinate of node
49
        struct NCSQTreeNode *nw;        // Pointer to Node in North West
50
        struct NCSQTreeNode *ne;        // Pointer to Node in North East
51
        struct NCSQTreeNode *sw;        // Pointer to Node in South West
52
        struct NCSQTreeNode *se;        // Pointer to Node in South East
53
} NCSQTreeNode;
54

    
55
typedef enum NCSQTreeAlg{                // The algorithm used to construct the Quad Tree
56
        NCSQTALG_PRKD,                                // PRKD tree algorithm - NOT YET IMPLEMENTED
57
        NCSQTALG_PR,                                // PR tree algorithm
58
        NCSQTALG_POINT,                                // Simple point algorithm
59
        NCSQTALG_KD,                                // KD tree algorithm - NOT YET IMPLEMENTED
60
        NCSQTALG_MX,                                // MX tree algorithm - NOT YET IMPLEMENTED
61
        NCSQTALG_PMR,                                // PMR tree algorithm - NOT YET IMPLEMENTED
62
        NCSQTALG_SIMPLE_EDGES,                // Edge algorithm - NOT YET IMPLEMENTED
63
        NCSQTALG_SIMPLE_GRID                // Grid algorithm - NOT YET IMPLEMENTED
64
} NCSQTreeAlg;
65

    
66
typedef NCSError (*NCSQTreeNodeFunc)(NCSQTreeNode *pNode, void *pInfo);
67

    
68
class __declspec( dllexport ) CNCSQTree  
69
{
70

    
71
public:
72
        // Initialisation
73
        CNCSQTree();
74
        virtual ~CNCSQTree();
75
        NCSError InitExtents(NCSCoordSys CSysType, IEEE8 tlx, IEEE8 tly, IEEE8 brx, IEEE8 bry );
76

    
77
        // Node functions
78
        NCSError        Print( void );
79
        NCSError        Draw(void *pDrawInfo);
80
        void                *GetNodeData( NCSQTreeNode *pNode);
81
        void                SetNodeData (NCSQTreeNode *pNode, void *pData);
82
        NCSQTreeNode *FindNode( IEEE8 dWorldX, IEEE8 dWorldY, IEEE8 dRadiusX, IEEE8 dRadiusY );
83

    
84
        // Virtual functions
85
        virtual        NCSError DrawNode(void *pDrawInfo) = 0;
86
        virtual NCSError PrintNode(NCSQTreeNode *pNode) = 0;
87
        virtual void FreeNodeData( void *pData );
88

    
89
        // Node creation-free
90
        NCSQTreeNode * FreeNode(NCSQTreeNode *pNode);
91
        NCSQTreeNode * AddNode( void *pNodeData , IEEE8 dWorldX, IEEE8 dWorldY );        
92

    
93
        // Algorithm functions
94
        NCSError SetAlgorithm(NCSQTreeAlg nAlg);
95
        NCSQTreeAlg GetAlgorithm();
96

    
97
        // Tree traversal - use custom traverse function "pFunction".
98
        NCSError Traverse(NCSQTreeNodeFunc pFunction, void *pData);
99

    
100
        // Miscellaneous routines
101
        NCSError Balance(void);
102

    
103
private:
104
        NCSQTreeNode * DrawInternal( void *pDrawInfo, NCSQTreeNode *pRoot);
105
        NCSQTreeNode * FindNodeInternal (NCSQTreeNode *pRoot, IEEE8 latitude, IEEE8 longitude);
106
        NCSQTreeNode * AddNodeInternalPR( NCSQTreeNode *pRootNode, void *pData, IEEE8 latitude, IEEE8 longitude, IEEE8 tlx, IEEE8 tly, IEEE8 brx, IEEE8 bry);
107
        NCSQTreeNode * AddNodeInternalPOINT( NCSQTreeNode *pRootNode, void *pData, IEEE8 latitude, IEEE8 longitude);
108
        NCSQTreeNode * PrintInternal(NCSQTreeNode *pRoot);
109
        NCSQTreeNode * TraverseNode(NCSQTreeNode *pNode, NCSQTreeNodeFunc pFunction, void *pData);
110
        NCSQTreeNode * CreateNode(IEEE8 dWorldX, IEEE8 dWorldY, void *pData);
111

    
112
        static NCSError NCSQTreeCalcExtentsFn(NCSQTreeNode *pNode, void *pInfo);
113
        static NCSError NCSQTreeCopyFn(NCSQTreeNode *pNode, void *pInfo);
114
        
115
        IEEE8        m_WorldTLX;
116
        IEEE8        m_WorldTLY;
117
        IEEE8        m_WorldBRX;
118
        IEEE8        m_WorldBRY;
119
        INT32        m_NrNodes;
120
        UINT16        m_CurrDrawLevel;
121
        IEEE8        m_RadiusDistanceX;
122
        IEEE8        m_RadiusDistanceY;
123

    
124
        NCSQTreeAlg                m_nAlgorithm;
125
        NCSQTreeNode        * m_pRootNode;
126
        NCSCoordSys                m_CoordSys;
127
        NCSQTreeNode        *m_pFindNodeResult;
128
        NCSMutex                m_TraverseMutex;
129
};
130

    
131
#endif