/// <summary> /// Splits Voxel into 8 smaller Voxels, returns new Octree Container. /// <summary> public OctreeContainer <T> split(out MetadataChange change) { OctreeContainer <T> replacement = new OctreeContainer <T>(min, max, minSize); /// add original point to new OctreeContainer int childNum = replacement.whichChild(point); var voxBounds = replacement.childBounds(childNum); replacement.setChild(childNum, new Voxel <T>(voxBounds["min"], voxBounds["max"], minSize, point, value)); change = new MetadataChange(dComponents: 8, dVoxels: 7, dNonNullVolume: -0.875 * replacement.volume()); return(replacement); }
/// <summary> /// Grows Octree so current root is made child of new, larger root. /// Grows in direction of passed point, until point is within root. /// <summary> private void grow(Vector3 point) { while (!root.contains(point)) { int childNum = optimalChildNum(root, point); /// find growth direction var newRootBounds = root.parentBounds(childNum); OctreeContainer <T> newRoot = new OctreeContainer <T>(newRootBounds["min"], newRootBounds["max"], MinSize); newRoot.setChild(childNum, root); root = newRoot; numComponents += 8; numVoxels += 7; volume = root.volume(); } }