//return copy of child node array - not sure if copy function is correct

        public PointOctree[] getChildren()
        {
            if (children != null)
            {
                PointOctree[] clones = new PointOctree[8];
                Array.Copy(children, 0, clones, 0, 8);
                return(clones);
            }
            return(null);
        }
        //private bool isAutoReducing = false;



        //constructor // :base is the same as super to pass down to AABB constructor

        public PointOctree(PointOctree p, Vector3d o, double halfSize) :

            base(Vector3d.Add(o, new Vector3d(halfSize, halfSize, halfSize)), new Vector3d(halfSize, halfSize, halfSize))
        {
            this.parent      = p;
            this.halfSize    = halfSize;
            this.size        = halfSize + halfSize;
            this.offset      = o;
            this.numChildren = 0;

            if (parent != null)
            {
                depth       = parent.depth + 1;
                minNodeSize = parent.minNodeSize;
            }
        }
        public bool addPoint(Vector3d p)
        {
            //check if pt is inside cube - write code for contains point

            if (containsPoint(p))
            {
                if (halfSize <= minNodeSize)
                {
                    if (points == null)
                    {
                        points = new List <Vector3d>();
                    }

                    points.Add(p);

                    return(true);
                }
                else
                {
                    Vector3d plocal = Vector3d.Subtract(p, offset);

                    if (children == null)
                    {
                        children = new PointOctree[8];
                    }


                    int octant = getOctantID(plocal);
                    if (children[octant] == null)
                    {
                        Vector3d off = Vector3d.Add(offset, new Vector3d(
                                                        (octant & 1) != 0 ? halfSize : 0,
                                                        (octant & 2) != 0 ? halfSize : 0,
                                                        (octant & 4) != 0 ? halfSize : 0));

                        children[octant] = new PointOctree(this, off, halfSize * 0.5);

                        numChildren++;
                    }
                    return(children[octant].addPoint(p));
                }
            }
            return(false);
        }