From 1c2b76aa8055c0f7fdac6a40cabbf829aa25888d Mon Sep 17 00:00:00 2001 From: Marek Woroniecki Date: Thu, 22 Apr 2021 15:09:54 +0200 Subject: [PATCH 1/2] fix KdNode compareTo (and hence equals) method that caused two different 3D points to be interpreted as equal (and hence the tree not returning all valid results) --- .../algorithms/data_structures/KdTree.java | 3 +- .../data_structures/test/KdTreeTests.java | 38 +++++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/com/jwetherell/algorithms/data_structures/KdTree.java b/src/com/jwetherell/algorithms/data_structures/KdTree.java index b7558302..03c7a063 100644 --- a/src/com/jwetherell/algorithms/data_structures/KdTree.java +++ b/src/com/jwetherell/algorithms/data_structures/KdTree.java @@ -588,7 +588,8 @@ public boolean equals(Object obj) { */ @Override public int compareTo(KdNode o) { - return compareTo(depth, k, this.id, o.id); + int depthCompare = Integer.compare(this.depth, o.depth); + return depthCompare != 0 ? depthCompare : this.id.compareTo(o.id); } /** diff --git a/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java b/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java index 315bce68..46c896ff 100644 --- a/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java +++ b/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java @@ -1,15 +1,15 @@ package com.jwetherell.algorithms.data_structures.test; -import static org.junit.Assert.assertTrue; +import com.jwetherell.algorithms.data_structures.KdTree; +import com.jwetherell.algorithms.data_structures.KdTree.XYZPoint; +import org.junit.Test; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.junit.Test; - -import com.jwetherell.algorithms.data_structures.KdTree; -import com.jwetherell.algorithms.data_structures.KdTree.XYZPoint; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class KdTreeTests { @@ -31,14 +31,14 @@ public void testKdTree() { KdTree kdTree = new KdTree(points); Collection result = kdTree.nearestNeighbourSearch(1, p3); - assertTrue("K-D Tree query error. query=(k=1, p=(9, 6)) returned="+result, result.contains(p3)); + assertTrue("K-D Tree query error. query=(k=1, p=(9, 6)) returned=" + result, result.contains(p3)); XYZPoint search = new XYZPoint(1, 4); result = kdTree.nearestNeighbourSearch(4, search); - assertTrue("K-D Tree query error. query=(k=4, p=(1, 4)) returned="+result, (result.contains(p1) && - result.contains(p2) && - result.contains(p4) && - result.contains(p6)) + assertTrue("K-D Tree query error. query=(k=4, p=(1, 4)) returned=" + result, (result.contains(p1) && + result.contains(p2) && + result.contains(p4) && + result.contains(p6)) ); kdTree.remove(p6); @@ -67,6 +67,22 @@ public void testKdTree_as_iterable() { KdTree kdTree = new KdTree(points); for (final XYZPoint p : kdTree) - assertTrue(kdTree.contains(p)); + assertTrue(kdTree.contains(p)); + } + + + @Test + public void testKdTreeNearestNeighbour() { + List points = new ArrayList(); + XYZPoint p1 = new XYZPoint(0, 0, 0); + points.add(p1); + XYZPoint p2 = new XYZPoint(-1, 0, 1); + points.add(p2); + XYZPoint p3 = new XYZPoint(2, 0, -2); + points.add(p3); + KdTree kdTree = new KdTree(points); + + Collection result = kdTree.nearestNeighbourSearch(3, p1); + assertEquals("K-D Tree query error. expected all points to be returned" + result, 3, result.size()); } } From 79041062f7e4d0b790bc3178bcdbec17a831271e Mon Sep 17 00:00:00 2001 From: Marek Woroniecki Date: Thu, 22 Apr 2021 15:12:03 +0200 Subject: [PATCH 2/2] file format --- .../data_structures/test/KdTreeTests.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java b/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java index 46c896ff..0c5390ec 100644 --- a/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java +++ b/test/com/jwetherell/algorithms/data_structures/test/KdTreeTests.java @@ -1,15 +1,16 @@ package com.jwetherell.algorithms.data_structures.test; -import com.jwetherell.algorithms.data_structures.KdTree; -import com.jwetherell.algorithms.data_structures.KdTree.XYZPoint; -import org.junit.Test; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.Test; + +import com.jwetherell.algorithms.data_structures.KdTree; +import com.jwetherell.algorithms.data_structures.KdTree.XYZPoint; public class KdTreeTests { @@ -31,11 +32,11 @@ public void testKdTree() { KdTree kdTree = new KdTree(points); Collection result = kdTree.nearestNeighbourSearch(1, p3); - assertTrue("K-D Tree query error. query=(k=1, p=(9, 6)) returned=" + result, result.contains(p3)); + assertTrue("K-D Tree query error. query=(k=1, p=(9, 6)) returned="+result, result.contains(p3)); XYZPoint search = new XYZPoint(1, 4); result = kdTree.nearestNeighbourSearch(4, search); - assertTrue("K-D Tree query error. query=(k=4, p=(1, 4)) returned=" + result, (result.contains(p1) && + assertTrue("K-D Tree query error. query=(k=4, p=(1, 4)) returned="+result, (result.contains(p1) && result.contains(p2) && result.contains(p4) && result.contains(p6)) @@ -70,7 +71,6 @@ public void testKdTree_as_iterable() { assertTrue(kdTree.contains(p)); } - @Test public void testKdTreeNearestNeighbour() { List points = new ArrayList();