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