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