My Quadtree class... I don't know how to test it...

Started by
1 comment, last by Nibbles 15 years, 4 months ago
So I FINALLY grew a pair and actually made an attempt at writing a quadtree class accepting the possibility that I'd get frustrated and quit. I did however managed to whip something out that seems right (to me). Anyways, I have no idea how to test this so if anyone would mind having a quick read through I'd appreciate any advice/criticism/concerns. So far it only builds the quadtree... I'm not sure what the next step is. The coding is probably messy and will stay as such until i know that is in fact... messy. Oh, and I plan on eventually throwing a terrain in the mix (ya, original eh?). Behold:


using System;
using System.Drawing;

namespace MyFramework
{
    public enum QuadTreeNodeType
    {
        Root,
        Node,
        Leaf
    }

    /// <summary>
    /// Description of QuadTreeNode.
    /// </summary>
    public class CQuadTreeNode
    {
        public int iIndex;
        public int iSize;
        public CVector3 v3Center;

        public QuadTreeNodeType Type;

        public CQuadTreeNode qtnParent;
        public CQuadTreeNode[] qtnChild;

        public Rectangle BoundingBox;

        public CQuadTreeNode(CQuadTree quadtree, CQuadTreeNode parent, CVector3 v3center, int size)
        {
            qtnParent = parent;
            if (qtnParent == null)
                Type = QuadTreeNodeType.Root;

            iSize = size;

            v3Center = v3center;

            BoundingBox = new Rectangle((int)v3Center.X - (iSize / 2),	// X
                                        (int)v3Center.Z - (iSize / 2), 	// Y
                                        iSize, 							// W
                                        iSize);							// H

            iIndex = quadtree.iNodeIndex;
            quadtree.iNodeIndex++;

            if (iSize > quadtree.iPatchSize)
            {
                Type = QuadTreeNodeType.Node;
                Subdivide(quadtree, this, iSize / 2);
            }
            else
            {
                Type = QuadTreeNodeType.Leaf;
            }
        }

        public void Subdivide(CQuadTree quadtree, CQuadTreeNode parent, int size)
        {
            qtnChild = new CQuadTreeNode[4];

            CVector3 v1 = new CVector3(v3Center.X - (size / 2), 0, v3Center.Z - (size / 2));
            CVector3 v2 = new CVector3(v3Center.X + (size / 2), 0, v3Center.Z - (size / 2));
            CVector3 v3 = new CVector3(v3Center.X - (size / 2), 0, v3Center.Z + (size / 2));
            CVector3 v4 = new CVector3(v3Center.X + (size / 2), 0, v3Center.Z + (size / 2));

            qtnChild[0] = new CQuadTreeNode(quadtree, this, v1, size);
            qtnChild[1] = new CQuadTreeNode(quadtree, this, v2, size);
            qtnChild[2] = new CQuadTreeNode(quadtree, this, v3, size);
            qtnChild[3] = new CQuadTreeNode(quadtree, this, v4, size);
        }
    }

    /// <summary>
    /// Description of QuadTree.
    /// </summary>
    public class CQuadTree
    {
        public int iSize;
        public int iPatchSize;
        public int iNodeIndex;

        CQuadTreeNode qtnRoot;

        public CQuadTree(int size, int patchsize)
        {
            iSize = size;
            iPatchSize = patchsize;
            iNodeIndex = 0;

            qtnRoot = new CQuadTreeNode(this, null, new CVector3(iSize / 2, 0, iSize / 2), size);
        }
    }
}



Thanks, Scott Ps. After almost 8 years on this bored I suddenly hate my username.
Advertisement
Well usually quad trees are made from input data, usually in the form of scene nodes. And the usual process is: if there are more than the maximum number of scene nodes allowed in the current section of the quad trees, then subdivide. Otherwise, stop, and continue with the other sections. You continue until you exhaust all options, meaning that all sections contain a scene node count less than the maximum.

http://www.directionsmag.com/images/articles/spatialDBMS/quadtree.gif

By looking at that you can easily tell that the maximum number of scene nodes allowed is 3.
Denzel Morris (@drdizzy) :: Software Engineer :: SkyTech Enterprises, Inc.
"When men are most sure and arrogant they are commonly most mistaken, giving views to passion without that proper deliberation which alone can secure them from the grossest absurdities." - David Hume
thanks! makes sense... I guess all i really managed to do was figure how how to recursively subdivide. i do have a question though... is terrain data (example of input data) a child of the quadtree or vice versa?

class CTerrain : CQuadtree
{
...
}

or

class CQuadtree :: CTerrain
{
...
}

or am i way out in left field.

thanks

This topic is closed to new replies.

Advertisement