public void NearestTest()
{
double[][] points =
{
new double[] { 1, 1 }, new double[] { 1, 2 }, new double[] { 1, 3 }, new double[] { 1, 4 }, new double[] { 1, 5 },
new double[] { 2, 1 }, new double[] { 2, 2 }, new double[] { 2, 3 }, new double[] { 2, 4 }, new double[] { 2, 5 },
new double[] { 3, 1 }, new double[] { 3, 2 }, new double[] { 3, 3 }, new double[] { 3, 4 }, new double[] { 3, 5 },
new double[] { 4, 1 }, new double[] { 4, 2 }, new double[] { 4, 3 }, new double[] { 4, 4 }, new double[] { 4, 5 },
new double[] { 5, 1 }, new double[] { 5, 2 }, new double[] { 5, 3 }, new double[] { 5, 4 }, new double[] { 5, 5 },
};
var tree = KDTree.FromData<int>(points);
tree.Distance = new Manhattan();
for (int i = 0; i < points.Length; i++)
{
var retrieval = tree.Nearest(points[i], 0.0);
Assert.AreEqual(1, retrieval.Count);
Assert.AreEqual(points[i][0], retrieval[0].Node.Position[0]);
Assert.AreEqual(points[i][1], retrieval[0].Node.Position[1]);
}
var result = tree.Nearest(new double[] { 3, 3 }, 1.0);
double[][] expected =
{
new double[] { 2, 3 },
new double[] { 3, 2 }, new double[] { 3, 3 }, new double[] { 3, 4 },
new double[] { 4, 3 },
};
Assert.AreEqual(expected.Length, result.Count);
double[][] actual = (from node in result select node.Node.Position).ToArray();
for (int i = 0; i < expected.Length; i++)
{
Assert.IsTrue(actual.Contains(expected[i], new CustomComparer<double[]>((a, b) => a.IsEqual(b) ? 0 : 1)));
}
}