diff --git a/README.md b/README.md index 5a89e54..652b762 100755 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Simplification of a 2D-polyline or a 3D-polyline. * requires Java 5 * Maven Build * JUnit-tested - * 94% lines covered + * 100% lines covered * reference data is created by "original" JavaScript implementation (Version 1.1.0) # Example # diff --git a/src/main/java/com/goebl/simplify/Simplify3D.java b/src/main/java/com/goebl/simplify/Simplify3D.java index a6e13dd..853378e 100755 --- a/src/main/java/com/goebl/simplify/Simplify3D.java +++ b/src/main/java/com/goebl/simplify/Simplify3D.java @@ -65,7 +65,7 @@ public double getSquareDistance(T p1, T p2) { @Override public double getSquareSegmentDistance(T p0, T p1, T p2) { - double x0, y0, z0, x1, y1, z1, x2, y2, z2, dx, dy, dz, t; + double x0, y0, z0, x1, y1, z1, x2, y2, z2; x1 = pointExtractor.getX(p1); y1 = pointExtractor.getY(p1); @@ -77,14 +77,20 @@ public double getSquareSegmentDistance(T p0, T p1, T p2) { y0 = pointExtractor.getY(p0); z0 = pointExtractor.getZ(p0); - dx = x2 - x1; - dy = y2 - y1; - dz = z2 - z1; + return calculateSquareSegmentDistance(x0, y0, z0, x1, y1, z1, x2, y2, z2); + } + + static double calculateSquareSegmentDistance( + double x0, double y0, double z0, + double x1, double y1, double z1, + double x2, double y2, double z2) { + double dx = x2 - x1; + double dy = y2 - y1; + double dz = z2 - z1; if (dx != 0.0d || dy != 0.0d || dz != 0.0d) { - t = ((x0 - x1) * dx + (y0 - y1) * dy + (z0 - z1) * dz) + double t = ((x0 - x1) * dx + (y0 - y1) * dy + (z0 - z1) * dz) / (dx * dx + dy * dy + dz * dz); - if (t > 1.0d) { x1 = x2; y1 = y2; diff --git a/src/test/java/com/goebl/simplify/Simplify3DTest.java b/src/test/java/com/goebl/simplify/Simplify3DTest.java index 2e5e961..1d75563 100755 --- a/src/test/java/com/goebl/simplify/Simplify3DTest.java +++ b/src/test/java/com/goebl/simplify/Simplify3DTest.java @@ -14,6 +14,7 @@ public class Simplify3DTest { private static final float[][] POINTS_3D = new float[][]{ {3.14f, 5.2f, 4f}, {5.7f, 8.1f, 5f}, {4.6f, -1.3f, 6f} }; + private static final double DELTA = 0.00001d; @Test public void testCustomPoint3DExtractor() { @@ -59,6 +60,20 @@ public void testDefaultPointExtractor() { Assert.assertEquals("array should be simplified", 2, simplified.length); } + @Test + public void testCalculateSquareSegmentDistance() { + double res = Simplify3D.calculateSquareSegmentDistance( + 2, 1, 1, + 1, 1, 1, + 3, 3, 1); + Assert.assertEquals(0.5d, res, DELTA); + double resBis = Simplify3D.calculateSquareSegmentDistance( + -0.1, -0.2, -0.3, + -0.7, -0.8, -0.9, + -0.4, -0.5, -0.6); + Assert.assertEquals(0.27d, resBis, DELTA); + } + private static class MyPoint implements Point3D { double x; double y; diff --git a/src/test/java/com/goebl/simplify/SimplifyTest.java b/src/test/java/com/goebl/simplify/SimplifyTest.java index 1fd816e..dd0714d 100755 --- a/src/test/java/com/goebl/simplify/SimplifyTest.java +++ b/src/test/java/com/goebl/simplify/SimplifyTest.java @@ -111,9 +111,10 @@ static Point[] readPoints(String fileName) throws Exception { List pointList = new ArrayList(); File file = new File("src/test/resources", fileName); InputStream is = null; + BufferedReader reader = null; try { is = new FileInputStream(file); - BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); + reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); String line; while ((line = reader.readLine()) != null) { if (line.trim().length() == 0) { @@ -125,6 +126,9 @@ static Point[] readPoints(String fileName) throws Exception { pointList.add(new MyPoint(x, y)); } } finally { + if (reader != null) { + reader.close(); + } if (is != null) { is.close(); }