Beispiel #1
0
        /// <summary>
        /// Recursive Put method.  Traverses the tree to place "Data" in the position corresponding with the position.
        /// </summary>
        /// <param name="current">Current Tree node</param>
        /// <param name="Data">Data to store</param>
        /// <param name="position">Position associated with the data</param>
        /// <param name="rect">A rectangular prism used to prune and optimize searches</param>
        /// <param name="xyz">Argument checks against X(0), Y(1), or Z(2)</param>
        /// <returns></returns>
        private Node Put(Node current, T Data, Point3D position, RectPrism rect, int xyz)
        {
            //If node is null, the data goes here.
            if (current == null)
            {
                return(new Node(Data, position, rect));
            }

            //Check X,Y, or Z
            if (xyz == 0)
            {
                if (position.X < current.Position.X)
                {
                    current.less = Put(current.less, Data, position,
                                       new RectPrism(rect.MinX, rect.MinY, rect.MinZ, current.Position.X, rect.MaxY, rect.MaxZ)
                                       , 1);
                }
                else
                {
                    current.more = Put(current.more, Data, position,
                                       new RectPrism(current.Position.X, rect.MinY, rect.MinZ, rect.MaxX, rect.MaxY, rect.MaxZ)
                                       , 1);
                }
            }
            //Check Y
            else if (xyz == 1)
            {
                if (position.Y < current.Position.Y)
                {
                    current.less = Put(current.less, Data, position,
                                       new RectPrism(rect.MinX, rect.MinY, rect.MinZ, rect.MaxX, current.Position.Y, rect.MaxZ)
                                       , 2);
                }
                else
                {
                    current.more = Put(current.more, Data, position,
                                       new RectPrism(rect.MinX, current.Position.Y, rect.MinZ, rect.MaxX, rect.MaxY, rect.MaxZ)
                                       , 2);
                }
            }
            //Check Z
            else
            {
                if (position.Z < current.Position.Z)
                {
                    current.less = Put(current.less, Data, position,
                                       new RectPrism(rect.MinX, rect.MinY, rect.MinZ, rect.MaxX, rect.MaxY, current.Position.Z)
                                       , 0);
                }
                else
                {
                    current.more = Put(current.more, Data, position,
                                       new RectPrism(rect.MinX, rect.MinY, current.Position.Z, rect.MaxX, rect.MaxY, rect.MaxZ)
                                       , 0);
                }
            }

            return(current);
        }
Beispiel #2
0
        /// <summary>
        /// Find the distance to a RectPrism
        /// </summary>
        /// <param name="rect">Rectangular prism to find distance to</param>
        /// <returns>The distance to the rectangular prism.</returns>
        public double DistTo(RectPrism rect)
        {
            if (rect == null)
            {
                throw new ArgumentNullException("rect");
            }
            double dx = Math.Max(rect.MinX - X, Math.Max(0, X - rect.MaxX));
            double dy = Math.Max(rect.MinY - Y, Math.Max(0, Y - rect.MaxY));
            double dz = Math.Max(rect.MinZ - Z, Math.Max(0, Z - rect.MaxZ));

            return(Math.Sqrt(dx * dx + dy * dy + dz * dz));
        }
Beispiel #3
0
 /// <summary>
 /// Constructor for the node class
 /// </summary>
 /// <param name="data">Data stored in the node</param>
 /// <param name="position">Position associated with the data</param>
 /// <param name="rectPrism">Rectangular prism used to prune and optimize nearest search</param>
 public Node(T data, Point3D position, RectPrism rectPrism)
 {
     Data      = data;
     Position  = position;
     RectPrism = rectPrism;
 }