Beispiel #1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="node"></param>
        /// <param name="addEnv"></param>
        /// <returns></returns>
        public static Node CreateExpanded(Node node, IEnvelope addEnv)
        {
            IEnvelope expandEnv = new Envelope(addEnv);
            if (node != null) 
                expandEnv.ExpandToInclude(node.env);

            Node largerNode = CreateNode(expandEnv);
            if (node != null) 
                largerNode.InsertNode(node);
            return largerNode;
        }
Beispiel #2
0
 /// <summary> 
 /// Insert an item which is known to be contained in the tree rooted at
 /// the given QuadNode root.  Lower levels of the tree will be created
 /// if necessary to hold the item.
 /// </summary>
 private void InsertContained(Node tree, IEnvelope itemEnv, object item)
 {
     Assert.IsTrue(tree.Envelope.Contains(itemEnv));
     /*
     * Do NOT create a new quad for zero-area envelopes - this would lead
     * to infinite recursion. Instead, use a heuristic of simply returning
     * the smallest existing quad containing the query
     */
     bool isZeroX = IntervalSize.IsZeroWidth(itemEnv.MinX, itemEnv.MaxX);
     bool isZeroY = IntervalSize.IsZeroWidth(itemEnv.MinY, itemEnv.MaxY);
     NodeBase node;
     if (isZeroX || isZeroY)
          node = tree.Find(itemEnv);
     else node = tree.GetNode(itemEnv);
     node.Add(item);
 }
Beispiel #3
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="env"></param>
 /// <returns></returns>
 public static Node CreateNode(IEnvelope env)
 {
     Key key = new Key(env);
     Node node = new Node(key.Envelope, key.Level);
     return node;
 }
Beispiel #4
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private Node CreateSubnode(int index)
        {
            // create a new subquad in the appropriate quadrant
            double minx = 0.0;
            double maxx = 0.0;
            double miny = 0.0;
            double maxy = 0.0;

            switch (index) 
            {
                case 0:
                    minx = env.MinX;
                    maxx = centre.X;
                    miny = env.MinY;
                    maxy = centre.Y;
                    break;

                case 1:
                    minx = centre.X;
                    maxx = env.MaxX;
                    miny = env.MinY;
                    maxy = centre.Y;
                    break;

                case 2:
                    minx = env.MinX;
                    maxx = centre.X;
                    miny = centre.Y;
                    maxy = env.MaxY;
                    break;

                case 3:
                    minx = centre.X;
                    maxx = env.MaxX;
                    miny = centre.Y;
                    maxy = env.MaxY;
                    break;

	            default:
		            break;
            }
            IEnvelope sqEnv = new Envelope(minx, maxx, miny, maxy);
            Node node = new Node(sqEnv, level - 1);
            return node;
        }
Beispiel #5
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="node"></param>
 public void InsertNode(Node node)
 {
     Assert.IsTrue(env == null || env.Contains(node.Envelope));        
     int index = GetSubnodeIndex(node.env, centre);        
     if (node.level == level - 1)             
         subnode[index] = node;                    
     else 
     {
         // the quad is not a direct child, so make a new child quad to contain it
         // and recursively insert the quad
         Node childNode = CreateSubnode(index);
         childNode.InsertNode(node);
         subnode[index] = childNode;
     }
 }