private void Build(KV <T, K>[] KeysAndValues, int Low, int High, HyperRect <T> Region, int Depth) { int Dimension = Depth % KeysAndValues[Low].Dimensions; int N = Ninther(KeysAndValues, Low, High, Dimension); _Value = KeysAndValues[N]; _Region = Region; Swap(KeysAndValues, N, High); int j = Low; for (int i = Low; i < High; ++i) { if (KeysAndValues[i].CompareTo(KeysAndValues[High], Dimension) < 0) { Swap(KeysAndValues, i, j++); } } Pair <HyperRect <T>, HyperRect <T> > Subregions = _Region.Split(_Value.First, Dimension); if (Low <= j - 1) { _Left = new KDTree <T, K>(KeysAndValues, Low, j - 1, Subregions.First, Depth + 1); } if (j <= High - 1) { _Right = new KDTree <T, K>(KeysAndValues, j, High - 1, Subregions.Second, Depth + 1); } }
public bool Contains(HyperRect <T> Rect) { for (int i = 0; i < _Left.Dimensions; ++i) { if (Rect._Left.CompareTo(_Left, i) < 0 || Rect._Right.CompareTo(_Right, i) > 0) { return(false); } } return(true); }
public HyperRect <T> Join(HyperRect <T> Second) { T L = Left; T R = Second.Right; for (int i = 0; i < L.Dimensions; ++i) { L.SetDimension(i, Left.CompareTo(Second.Left, i) < 0 ? Left.GetDimension(i) : Second.Left.GetDimension(i)); R.SetDimension(i, Right.CompareTo(Second.Left, i) > 0 ? Right.GetDimension(i) : Second.Right.GetDimension(i)); } return(new HyperRect <T>(L, R)); }
public KDTree(KV <T, K>[] KeysAndValues, int Low, int High, HyperRect <T> Region, int Depth) { Build(KeysAndValues, Low, High, Region, Depth); }
public KDTree(IEnumerable <KV <T, K> > KeysAndValues) { KV <T, K>[] V = KeysAndValues.ToArray(); Shuffle(V); Build(V, 0, V.Length - 1, HyperRect <T> .Bound(V.Select(i => i.First)), 0); }