Beispiel #1
0
 private KdTreeNode BuildSubTree(KdTreeNode parentNode, ArrayList <IdxDat <Vector2D> > points, int level)
 {
     if (points.Count <= mMaxPtsPerLeaf) // terminal node
     {
         KdTreeNodeTerminal terminalNode = new KdTreeNodeTerminal(points);
         terminalNode.ParentNode = parentNode;
         return(terminalNode);
     }
     else // non-terminal node
     {
         ArrayList <IdxDat <Vector2D> > pointsRight = null;
         double bound = ComputeBound(points, ref pointsRight, level % 2);
         KdTreeNodeNonTerminal node = new KdTreeNodeNonTerminal(bound);
         node.ParentNode = parentNode;
         node.LeftNode   = BuildSubTree(node, points, level + 1);
         node.RightNode  = BuildSubTree(node, pointsRight, level + 1);
         return(node);
     }
 }
Beispiel #2
0
        //public bool RemovePoint(int idx, Vector2D point)
        //{
        //    ArrayList<KdTreeNode> terminalNodes = new ArrayList<KdTreeNode>();
        //    GetTreeNodes(point, new Vector2D(), mRootNode, 0, terminalNodes);
        //    bool success = false;
        //    foreach (KdTreeNodeTerminal terminalNode in terminalNodes)
        //    {
        //        int oldCount = terminalNode.Points.Count;
        //        terminalNode.Points.Remove(new IdxDat<Vector2D>(idx));
        //        success = oldCount > terminalNode.Points.Count;
        //        if (success)
        //        {
        //            mNumChanges++;
        //            // *** the index is not updated here; it should be rebuilt manually after enough points have been removed/inserted
        //            break;
        //        }
        //    }
        //    return success;
        //}

        //public void InsertPoint(int idx, Vector2D point)
        //{
        //    ArrayList<KdTreeNode> terminalNodes = new ArrayList<KdTreeNode>();
        //    GetTreeNodes(point, new Vector2D(), mRootNode, 0, terminalNodes);
        //    int min = int.MaxValue;
        //    int minIdx = -1;
        //    int i = 0;
        //    foreach (KdTreeNodeTerminal terminalNode in terminalNodes)
        //    {
        //        if (terminalNode.Points.Count < min) { minIdx = i; min = terminalNode.Points.Count; }
        //        i++;
        //    }
        //    ((KdTreeNodeTerminal)terminalNodes[minIdx]).Points.Add(new IdxDat<Vector2D>(idx, point));
        //    mNumChanges++;
        //    // *** the index is not updated here; it should be rebuilt manually after enough points have been removed/inserted
        //}

        private void GetTreeNodes(Vector2D refPoint, Vector2D size, KdTreeNode node, int level, ArrayList <KdTreeNode> treeNodes) // refPoint and size define a rectangle
        {
            int dim = level % 2;

            if (node is KdTreeNodeNonTerminal)
            {
                KdTreeNodeNonTerminal nonTerminalNode = (KdTreeNodeNonTerminal)node;
                double bound         = nonTerminalNode.Bound;
                double refPointCoord = GetVectCoord(refPoint, dim);
                double sizeCoord     = GetVectCoord(size, dim);
                if (bound < refPointCoord)
                {
                    GetTreeNodes(refPoint, size, nonTerminalNode.RightNode, level + 1, treeNodes);
                }
                else if (bound > refPointCoord + sizeCoord)
                {
                    GetTreeNodes(refPoint, size, nonTerminalNode.LeftNode, level + 1, treeNodes);
                }
                else
                {
                    // split the rectangle at the bound
                    Vector2D rightRefPoint = refPoint;
                    Vector2D rightSize     = size;
                    SetVectCoord(ref size, dim, bound - refPointCoord);
                    GetTreeNodes(refPoint, size, nonTerminalNode.LeftNode, level + 1, treeNodes);
                    double rightRefPointCoord = GetVectCoord(rightRefPoint, dim);
                    double rightSizeCoord     = GetVectCoord(rightSize, dim);
                    SetVectCoord(ref rightSize, dim, rightRefPointCoord + rightSizeCoord - bound);
                    SetVectCoord(ref rightRefPoint, dim, bound);
                    GetTreeNodes(rightRefPoint, rightSize, nonTerminalNode.RightNode, level + 1, treeNodes);
                }
            }
            else
            {
                treeNodes.Add(node);
            }
        }