From 338be0b92682bfe1bcd3fe4173812a1363a6714f Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 3 Jun 2008 17:29:27 +0000 Subject: [PATCH] Fleshed out some basic kd-tree data structures. --- examples/osgkdtree/osgkdtree.cpp | 67 ++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/examples/osgkdtree/osgkdtree.cpp b/examples/osgkdtree/osgkdtree.cpp index 9e08382d7..a4d36d224 100644 --- a/examples/osgkdtree/osgkdtree.cpp +++ b/examples/osgkdtree/osgkdtree.cpp @@ -34,6 +34,73 @@ #include +class KDNode +{ + public: + + typedef short value_type; + + value_type _leftChild; + value_type _rightChild; +}; + +class KDLeaf : public osg::Referenced +{ + public: + + KDLeaf(); + + typedef unsigned int index_type; + typedef std::vector< index_type > Indices; + + Indices _vertexIndices; + + protected: + + virtual ~KDLeaf() {} +}; + +class KDTree : public osg::Referenced +{ + public: + + typedef std::vector< unsigned int > AxisStack; + typedef std::vector< KDNode > KDNodeList; + typedef std::vector< osg::ref_ptr > KDLeafList; + + osg::BoundingBox _bb; + + AxisStack _axisStack; + KDNodeList _kdNodes; + KDLeafList _kdLeaves; +}; + +class KDTreeTraverser +{ + public: + + void traverse(KDTree& tree, KDNode::value_type nodeIndex) + { + if (nodeIndex>=0) + { + KDNode& node = tree._kdNodes[nodeIndex]; + traverse(tree,node._leftChild); + traverse(tree,node._rightChild); + } + else + { + KDNode::value_type leafIndex = -nodeIndex-1; + KDLeaf& leaf = *(tree._kdLeaves[leafIndex]); + } + } + + + void traverse(KDTree& tree) + { + if (!tree._kdNodes.empty()) traverse(tree,0); + } + +}; int main(int argc, char **argv) {