Exemple #1
0
    /// <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);
    }
Exemple #2
0
    /// <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();
        }
    }