Index: /trunk/src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 18589)
+++ /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 18590)
@@ -492,37 +492,4 @@
         double pdx = point.getX() - p1.getX();
         double pdy = point.getY() - p1.getY();
-
-        double offset = (pdx * ldx + pdy * ldy) / (ldx * ldx + ldy * ldy);
-
-        if (segmentOnly && offset <= 0)
-            return p1;
-        else if (segmentOnly && offset >= 1)
-            return p2;
-        else
-            return p1.interpolate(p2, offset);
-    }
-
-    /**
-     * Get the closest point to a segment
-     * @param p1 Point 1 of the segment
-     * @param p2 Point 2 of the segment
-     * @param point The point to use to get the closest point on the segment
-     * @param segmentOnly {@code true} if the point <i>must</i> be on the segment
-     * @return The closest point on the segment if {@code segmentOnly = true}, otherwise the closest point on the infinite line.
-     */
-    private static ILatLon closestPointTo(ILatLon p1, ILatLon p2, ILatLon point, boolean segmentOnly) {
-        CheckParameterUtil.ensureParameterNotNull(p1, "p1");
-        CheckParameterUtil.ensureParameterNotNull(p2, "p2");
-        CheckParameterUtil.ensureParameterNotNull(point, "point");
-
-        double ldx = p2.lon() - p1.lon();
-        double ldy = p2.lat() - p1.lat();
-
-        //segment zero length
-        if (ldx == 0 && ldy == 0)
-            return p1;
-
-        double pdx = point.lon() - p1.lon();
-        double pdy = point.lat() - p1.lat();
 
         double offset = (pdx * ldx + pdy * ldy) / (ldx * ldx + ldy * ldy);
@@ -1534,10 +1501,11 @@
 
         double smallest = Double.MAX_VALUE;
+        EastNorth en0 = node.getEastNorth();
         // go through the nodes as if they were paired
         Iterator<Node> iter = way.getNodes().iterator();
-        Node en1 = iter.next();
+        EastNorth en1 = iter.next().getEastNorth();
         while (iter.hasNext()) {
-            Node en2 = iter.next();
-            double distance = getSegmentNodeDistSq(en1, en2, node);
+            EastNorth en2 = iter.next().getEastNorth();
+            double distance = getSegmentNodeDistSq(en1, en2, en0);
             if (distance < smallest)
                 smallest = distance;
@@ -1592,6 +1560,6 @@
         double rValue = Double.MAX_VALUE;
         Iterator<Node> iter1 = w1.getNodes().iterator();
+        List<Node> w2Nodes = w2.getNodes();
         Node w1N1 = iter1.next();
-        List<Node> w2Nodes = w2.getNodes();
         while (iter1.hasNext()) {
             Node w1N2 = iter1.next();
@@ -1638,11 +1606,15 @@
             return Double.NaN;
         }
-        if (getSegmentSegmentIntersection(ws1Node1, ws1Node2, ws2Node1, ws2Node2) != null)
+        EastNorth enWs1Node1 = ws1Node1.getEastNorth();
+        EastNorth enWs1Node2 = ws1Node2.getEastNorth();
+        EastNorth enWs2Node1 = ws2Node1.getEastNorth();
+        EastNorth enWs2Node2 = ws2Node2.getEastNorth();
+        if (getSegmentSegmentIntersection(enWs1Node1, enWs1Node2, enWs2Node1, enWs2Node2) != null)
             return 0;
 
-        double dist1sq = getSegmentNodeDistSq(ws1Node1, ws1Node2, ws2Node1);
-        double dist2sq = getSegmentNodeDistSq(ws1Node1, ws1Node2, ws2Node2);
-        double dist3sq = getSegmentNodeDistSq(ws2Node1, ws2Node2, ws1Node1);
-        double dist4sq = getSegmentNodeDistSq(ws2Node1, ws2Node2, ws1Node2);
+        double dist1sq = getSegmentNodeDistSq(enWs1Node1, enWs1Node2, enWs2Node1);
+        double dist2sq = getSegmentNodeDistSq(enWs1Node1, enWs1Node2, enWs2Node2);
+        double dist3sq = getSegmentNodeDistSq(enWs2Node1, enWs2Node2, enWs1Node1);
+        double dist4sq = getSegmentNodeDistSq(enWs2Node1, enWs2Node2, enWs1Node2);
         double smallest = Math.min(Math.min(dist1sq, dist2sq), Math.min(dist3sq, dist4sq));
         return smallest != Double.MAX_VALUE ? Math.sqrt(smallest) : Double.NaN;
@@ -1679,7 +1651,7 @@
      * @return the square of the euclidean distance from p to the closest point on the segment
      */
-    private static double getSegmentNodeDistSq(ILatLon s1, ILatLon s2, ILatLon p) {
-        ILatLon c1 = closestPointTo(s1, s2, p, true);
-        return c1.distanceSq(p.lon(), p.lat());
+    private static double getSegmentNodeDistSq(EastNorth s1, EastNorth s2, EastNorth p) {
+        EastNorth c1 = closestPointTo(s1, s2, p, true);
+        return c1.distanceSq(p);
     }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java	(revision 18589)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java	(revision 18590)
@@ -5,4 +5,5 @@
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -17,5 +18,5 @@
 import java.util.stream.Stream;
 
-import org.junit.Assert;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -40,6 +41,4 @@
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
 /**
  * Unit tests of {@link Geometry} class.
@@ -51,5 +50,5 @@
     @RegisterExtension
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().projection();
+    static JOSMTestRules test = new JOSMTestRules().preferences().projection();
 
     /**
@@ -65,4 +64,5 @@
         EastNorth intersectionPoint = Geometry.getLineLineIntersection(p1, p2, p3, p4);
 
+        assertNotNull(intersectionPoint);
         EastNorth d1 = p3.subtract(intersectionPoint);
         EastNorth d2 = p1.subtract(p2);
@@ -72,15 +72,11 @@
         Double len2 = d2.length();
 
-        Double angle1 = Geometry.getCornerAngle(p1, p2, intersectionPoint);
-        Double angle2 = Geometry.getCornerAngle(p3, p4, intersectionPoint);
-        Assert.assertTrue("intersection point not on line, angle: " + angle1,
-                Math.abs(angle1) < 1e-10);
-        Assert.assertTrue("intersection point not on line, angle: " + angle2,
-                Math.abs(angle1) < 1e-10);
-
-        Assert.assertTrue("cross product != 1 : " + Math.abs(crossProduct/len1/len2),
-                Math.abs(Math.abs(crossProduct/len1/len2) - 1) < 1e-10);
-        Assert.assertTrue("scalar product != 0 : " + scalarProduct/len1/len2,
-                Math.abs(scalarProduct/len1/len2) < 1e-10);
+        double angle1 = Geometry.getCornerAngle(p1, p2, intersectionPoint);
+        double angle2 = Geometry.getCornerAngle(p3, p4, intersectionPoint);
+        assertTrue(Math.abs(angle1) < 1e-10, "intersection point not on line, angle: " + angle1);
+        assertTrue(Math.abs(angle1) < 1e-10, "intersection point not on line, angle: " + angle2);
+
+        assertTrue(Math.abs(Math.abs(crossProduct/len1/len2) - 1) < 1e-10, "cross product != 1 : " + Math.abs(crossProduct/len1/len2));
+        assertTrue(Math.abs(scalarProduct/len1/len2) < 1e-10, "scalar product != 0 : " + scalarProduct/len1/len2);
     }
 
@@ -96,6 +92,6 @@
             Way closedWay = (Way) SubclassFilteredCollection.filter(ds.allPrimitives(),
                     SearchCompiler.compile("landuse=forest")).iterator().next();
-            Assert.assertEquals(5760015.7353515625, Geometry.closedWayArea(closedWay), 1e-3);
-            Assert.assertEquals(5760015.7353515625, Geometry.computeArea(closedWay), 1e-3);
+            assertEquals(5760015.7353515625, Geometry.closedWayArea(closedWay), 1e-3);
+            assertEquals(5760015.7353515625, Geometry.computeArea(closedWay), 1e-3);
         }
     }
@@ -111,6 +107,6 @@
             DataSet ds = OsmReader.parseDataSet(in, null);
             final Relation r = ds.getRelations().iterator().next();
-            Assert.assertEquals(4401735.20703125, Geometry.multipolygonArea(r), 1e-3);
-            Assert.assertEquals(4401735.20703125, Geometry.computeArea(r), 1e-3);
+            assertEquals(4401735.20703125, Geometry.multipolygonArea(r), 1e-3);
+            assertEquals(4401735.20703125, Geometry.computeArea(r), 1e-3);
         }
     }
@@ -128,6 +124,6 @@
                     SearchCompiler.compile("landuse=forest")).iterator().next();
             Geometry.AreaAndPerimeter areaAndPerimeter = Geometry.getAreaAndPerimeter(closedWay.getNodes());
-            Assert.assertEquals(12495000., areaAndPerimeter.getArea(), 1e-3);
-            Assert.assertEquals(15093.201209424187, areaAndPerimeter.getPerimeter(), 1e-3);
+            assertEquals(12495000., areaAndPerimeter.getArea(), 1e-3);
+            assertEquals(15093.201209424187, areaAndPerimeter.getPerimeter(), 1e-3);
         }
     }
@@ -374,11 +370,11 @@
         mp2.put("type", "multipolygon");
         assertFalse(Geometry.isPolygonInsideMultiPolygon(w1.getNodes(), mp2, null));
-        assertFalse(Geometry.filterInsideMultipolygon(Arrays.asList(w1), mp2).contains(w1));
+        assertFalse(Geometry.filterInsideMultipolygon(Collections.singletonList(w1), mp2).contains(w1));
 
         node4.setCoor(new LatLon(1.006, 0.99));
         // now w1 is inside
         assertTrue(Geometry.isPolygonInsideMultiPolygon(w1.getNodes(), mp2, null));
-        assertTrue(Geometry.filterInsideMultipolygon(Arrays.asList(w1), mp2).contains(w1));
-        assertTrue(Geometry.filterInsideMultipolygon(Arrays.asList(mp1), mp2).contains(mp1));
+        assertTrue(Geometry.filterInsideMultipolygon(Collections.singletonList(w1), mp2).contains(w1));
+        assertTrue(Geometry.filterInsideMultipolygon(Collections.singletonList(mp1), mp2).contains(mp1));
         assertTrue(Geometry.filterInsideMultipolygon(Arrays.asList(w1, mp1), mp2).contains(w1));
         assertTrue(Geometry.filterInsideMultipolygon(Arrays.asList(w1, mp1), mp2).contains(mp1));
@@ -494,6 +490,6 @@
 
         Way closestSegment = Geometry.getClosestWaySegment(way1, new Node(new LatLon(0, 0.5))).toWay();
-        Assert.assertTrue(closestSegment.containsNode(node1));
-        Assert.assertTrue(closestSegment.containsNode(node2));
+        assertTrue(closestSegment.containsNode(node1));
+        assertTrue(closestSegment.containsNode(node2));
     }
 
