Ejemplo n.º 1
0
        public bool Add(TKey[] point, TValue value)
        {
            var nodeToAdd = new KdTreeNode <TKey, TValue>(point, value);

            if (root == null)
            {
                root = new KdTreeNode <TKey, TValue>(point, value);
            }
            else
            {
                int dimension = -1;
                KdTreeNode <TKey, TValue> parent = root;

                do
                {
                    // Increment the dimension we're searching in
                    dimension = (dimension + 1) % dimensions;

                    // Does the node we're adding have the same hyperpoint as this node?
                    if (typeMath.AreEqual(point, parent.Point))
                    {
                        switch (AddDuplicateBehavior)
                        {
                        case AddDuplicateBehavior.Skip:
                            return(false);

                        case AddDuplicateBehavior.Error:
                            throw new DuplicateNodeError();

                        case AddDuplicateBehavior.Update:
                            parent.Value = value;
                            break;

                        default:
                            // Should never happen
                            throw new Exception("Unexpected AddDuplicateBehavior");
                        }
                    }

                    // Which side does this node sit under in relation to it's parent at this level?
                    int compare = typeMath.Compare(point[dimension], parent.Point[dimension]);

                    if (parent[compare] == null)
                    {
                        parent[compare] = nodeToAdd;
                        break;
                    }
                    else
                    {
                        parent = parent[compare];
                    }
                }while (true);
            }

            Count++;
            return(true);
        }
Ejemplo n.º 2
0
        public bool Add(TKey[] point, TValue value)
        {
            var nodeToAdd = new KdTreeNode <TKey, TValue>(point, value);

            if (root == null)
            {
                root = new KdTreeNode <TKey, TValue>(point, value);
            }
            else
            {
                int dimension = -1;
                KdTreeNode <TKey, TValue> parent = root;

                do
                {
                    // Increment the dimension we're searching in
                    dimension = (dimension + 1) % dimensions;

                    // Does the node we're adding have the same hyperpoint as this node?
                    if (typeMath.AreEqual(point, parent.Point))
                    {
                        return(false);
                    }

                    // Which side does this node sit under in relation to it's parent at this level?
                    int compare = typeMath.Compare(point[dimension], parent.Point[dimension]);

                    if (parent[compare] == null)
                    {
                        parent[compare] = nodeToAdd;
                        break;
                    }
                    else
                    {
                        parent = parent[compare];
                    }
                }while (true);
            }

            Count++;
            return(true);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Add new node to tree
        /// </summary>
        /// <param name="point">Key</param>
        /// <param name="value">Value</param>
        /// <returns>Return <code>true</code> if node was added</returns>
        public bool Add(TKey[] point, TValue value)
        {
            var nodeToAdd = new KdTreeNode <TKey, TValue>(point, value);

            if (root == null)
            {
                root = nodeToAdd;
            }
            else
            {
                int dimension = -1;
                var navParent = root;
                do
                {
                    dimension = (dimension + 1) % dimensions;
                    if (isNode(dimension))
                    {
                        var parent = (KdTreeNode <TKey, TValue>)navParent;
                        if (typeMath.AreEqual(point, parent.Points))
                        {
                            switch (AddDuplicateBehavior)
                            {
                            case AddDuplicateBehavior.Skip:
                                return(false);

                            case AddDuplicateBehavior.Continue:
                                break;

                            case AddDuplicateBehavior.Error:
                                throw new DuplicateNodeError();

                            case AddDuplicateBehavior.Update:
                                if (OnNodeUpdate != null)
                                {
                                    if (OnNodeUpdate.Invoke(this, parent, nodeToAdd))
                                    {
                                        return(true);
                                    }
                                }
                                else
                                {
                                    parent.Value = value;
                                    return(true);
                                }

                                break;

                            default:
                                // Should never happen
                                throw new Exception("Unexpected AddDuplicateBehavior");
                            }
                        }
                    }
                    // Which side does this node sit under in relation to it's parent at this level?
                    int compare = typeMath.Compare(point[dimension], navParent.Point);

                    if (navParent[compare] == null)
                    {
                        if (isNavNode(dimension + 1))
                        {
                            navParent[compare] = new KdTreeNavNode <TKey>(point[(dimension + 1) % dimensions]);
                            navParent          = navParent[compare];
                        }
                        else
                        {
                            navParent[compare] = nodeToAdd;
                            break;
                        }
                    }
                    else
                    {
                        navParent = navParent[compare];
                    }
                } while (true);
            }

            Count++;
            return(true);
        }