public void BuildTree(KDNode currentNode, List <Feature> features, bool useXAxis) { if (useXAxis) { features = features.OrderBy(i => i.X).ToList(); } else { features = features.OrderBy(i => i.Y).ToList(); } Feature med = FeatureHelper.GetMedianFeatureFromList(features); var node = InsertNode(currentNode, med, true); var splitFeatures = FeatureHelper.SplitFeatures(features, features.IndexOf(med)); List <Feature> leftSplit = splitFeatures[0].ToList(); List <Feature> rightSplit = splitFeatures[1].ToList(); if (leftSplit.Count <= 1) { if (leftSplit.Count == 1) { InsertNode(node, leftSplit[0], useXAxis); } } else { this.BuildTree(node, leftSplit, !useXAxis); //alternate dimension each level we build } // Do the same for the right points if (rightSplit.Count <= 1) { if (rightSplit.Count == 1) { InsertNode(node, rightSplit[0], useXAxis); } } else { BuildTree(node, rightSplit, !useXAxis); } }
public void GetMedianFeature_Works_As_Expected() { var features = new List <Feature>(); features.Add(new Feature("place1", 1, 2)); features.Add(new Feature("place2", 2, 2)); features.Add(new Feature("place3", 3, 2)); features.Add(new Feature("place4", 4, 2)); features.Add(new Feature("place5", 5, 2)); features.Add(new Feature("place6", 6, 2)); features.Add(new Feature("place7", 7, 2)); //sort by X in test but Y is also used during building process features = features.OrderBy(i => i.X).ToList(); var medianFeature = FeatureHelper.GetMedianFeatureFromList(features); Assert.Equal("place4", medianFeature.Name); }