Ejemplo n.º 1
0
        //x ~ (0, setting.maxX * power(2, subdivision)), z ~ (0, setting.maxZ * power(2, subdivision))
        public QuadTreeLeaf GetLeaf(int x, int z, ref float centerx, ref float centerz, ref int subdivision)
        {
            int u   = x >> subdivision; // x / power(2, subdivision);
            int v   = z >> subdivision;
            int idx = u * setting.maxZ + v;

            if (idx > tree.Length)
            {
                return(null);
            }
            QuadTreeBase subtree = tree[idx];

            //center pos
            centerx = setting.sliceSize[0] * u;
            centerz = setting.sliceSize[1] * v;
            //
            if (subtree is QuadTreeLeaf)
            {
                centerx += setting.sliceSize[0] * 0.5f;
                centerz += setting.sliceSize[1] * 0.5f;
                return((QuadTreeLeaf)subtree);
            }
            else
            {//sub tree node
                int detail = 1 << subdivision;
                int subx   = x - u * detail;
                int subz   = z - v * detail;
                subdivision -= 1;
                QuadTreeNode node = (QuadTreeNode)subtree;
                return(node.GetLeaf(subx, subz, setting.sliceSize[0] * 0.5f, setting.sliceSize[1] * 0.5f,
                                    ref centerx, ref centerz, ref subdivision));
            }
        }
Ejemplo n.º 2
0
        public QuadTreeLeaf GetLeaf(int x, int z, float sizex, float sizez, ref float centerx, ref float centerz,
                                    ref int subdivision)
        {
            int u = x >> subdivision; // x / power(2, subdivision);
            int v = z >> subdivision;

            //center pos
            centerx += sizex * u;
            centerz += sizez * v;
            //
            int          idx     = u * 2 + v;
            QuadTreeBase subtree = Children[idx];

            if (subtree is QuadTreeLeaf)
            {
                centerx += sizex * 0.5f;
                centerz += sizex * 0.5f;
                return((QuadTreeLeaf)subtree);
            }
            else
            {//sub tree node
                int detail = 1 << subdivision;
                int subx   = x - u * detail;
                int subz   = z - v * detail;
                subdivision -= 1;
                QuadTreeNode node = (QuadTreeNode)subtree;
                return(node.GetLeaf(subx, subz, sizex * 0.5f, sizez * 0.5f, ref centerx, ref centerz, ref subdivision));
            }
        }