//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)); } }
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)); } }