public void NearestTest2()
{
double[][] points =
{
new double[] { 2, 3 },
new double[] { 3, 2 }, new double[] { 3, 3 }, new double[] { 3, 4 },
new double[] { 4, 3 },
};
var tree = KDTree.FromData<int>(points);
tree.Distance = new Manhattan();
Assert.AreEqual(3, tree.Root.Position[0]);
Assert.AreEqual(3, tree.Root.Position[1]);
if (tree.Root.Left.Position[0] == 2)
{
Assert.AreEqual(2, tree.Root.Left.Position[0]);
Assert.AreEqual(3, tree.Root.Left.Position[1]);
Assert.AreEqual(3, tree.Root.Right.Position[0]);
Assert.AreEqual(4, tree.Root.Right.Position[1]);
Assert.AreEqual(3, tree.Root.Left.Left.Position[0]);
Assert.AreEqual(2, tree.Root.Left.Left.Position[1]);
Assert.AreEqual(4, tree.Root.Right.Left.Position[0]);
Assert.AreEqual(3, tree.Root.Right.Left.Position[1]);
}
else
{
Assert.AreEqual(3, tree.Root.Left.Position[0]);
Assert.AreEqual(4, tree.Root.Left.Position[1]);
Assert.AreEqual(4, tree.Root.Right.Position[0]);
Assert.AreEqual(3, tree.Root.Right.Position[1]);
Assert.AreEqual(2, tree.Root.Left.Left.Position[0]);
Assert.AreEqual(3, tree.Root.Left.Left.Position[1]);
Assert.AreEqual(3, tree.Root.Right.Left.Position[0]);
Assert.AreEqual(2, tree.Root.Right.Left.Position[1]);
}
var result = tree.Nearest(new double[] { 3, 3 }, 5);
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)));
}
}