Changeset 15035 in josm for trunk/test


Ignore:
Timestamp:
2019-05-02T06:55:14+02:00 (5 years ago)
Author:
GerdP
Message:

fix #17616: Add new functions to Geometry.java to find distances between primitives
Patch 17616_v12.patch by taylor.smock

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java

    r15034 r15035  
    1010import java.nio.file.Files;
    1111import java.nio.file.Paths;
     12import java.util.ArrayList;
    1213import java.util.Arrays;
    1314import java.util.List;
     
    2122import org.openstreetmap.josm.data.osm.DataSet;
    2223import org.openstreetmap.josm.data.osm.Node;
     24import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2325import org.openstreetmap.josm.data.osm.Relation;
    2426import org.openstreetmap.josm.data.osm.RelationMember;
     
    261263        assertTrue(Geometry.isPolygonInsideMultiPolygon(w1.getNodes(), mp, null));
    262264    }
     265
     266    /**
     267     * Test of {@link Geometry#getDistance} method.
     268     */
     269    @Test
     270    public void testGetDistance() {
     271        Node node1 = new Node(new LatLon(0, 0));
     272        Node node2 = new Node(new LatLon(0.1, 1));
     273        Node node3 = new Node(new LatLon(1.1, 0.1));
     274        Node node4 = new Node(new LatLon(1, 1.1));
     275        Way way1 = TestUtils.newWay("", node1, node2);
     276        Way way2 = TestUtils.newWay("", node3, node4);
     277        Relation testRelation1 = new Relation();
     278        Relation testRelation2 = new Relation();
     279        testRelation1.addMember(new RelationMember("", way1));
     280        testRelation1.addMember(new RelationMember("", way2));
     281        testRelation2.addMember(new RelationMember("", node1));
     282        testRelation2.addMember(new RelationMember("", node2));
     283        testRelation2.addMember(new RelationMember("", node3));
     284        testRelation2.addMember(new RelationMember("", node4));
     285
     286        double distance = Geometry.getDistance(null, node3);
     287        assertEquals(Double.NaN, distance, 0.1);
     288
     289        distance = Geometry.getDistance(way1, null);
     290        assertEquals(Double.NaN, distance, 0.1);
     291
     292        distance = Geometry.getDistance(null, null);
     293        assertEquals(Double.NaN, distance, 0.1);
     294
     295        distance = Geometry.getDistance(node1, node2);
     296        assertEquals(111874.6474307704, distance, 0.1);
     297
     298        distance = Geometry.getDistance(way1, node3);
     299        assertEquals(120743.55085962385, distance, 0.1);
     300
     301        distance = Geometry.getDistance(node3, way1);
     302        assertEquals(120743.55085962385, distance, 0.1);
     303
     304        distance = Geometry.getDistance(way1, way2);
     305        assertEquals(100803.63714283936, distance, 0.1);
     306
     307        distance = Geometry.getDistance(testRelation1, new Node(new LatLon(0, 0.5)));
     308        assertEquals(5538.354450686605, distance, 0.1);
     309
     310        distance = Geometry.getDistance(new Node(new LatLon(0, 0.5)), testRelation1);
     311        assertEquals(5538.354450686605, distance, 0.1);
     312
     313        distance = Geometry.getDistance(testRelation1, testRelation2);
     314        assertEquals(0.0, distance, 0.1);
     315    }
     316
     317    /**
     318     * Test of {@link Geometry#getClosestPrimitive} method
     319     */
     320    @Test
     321    public void testGetClosestPrimitive() {
     322        Node node1 = new Node(new LatLon(0, 0));
     323        Node node2 = new Node(new LatLon(0.1, 1));
     324        Node node3 = new Node(new LatLon(1.1, 0.1));
     325        Node node4 = new Node(new LatLon(1, 1.1));
     326        Way way1 = TestUtils.newWay("", node1, node2);
     327        Way way2 = TestUtils.newWay("", node3, node4);
     328
     329        List<OsmPrimitive> primitives = new ArrayList<>();
     330        primitives.add(way1);
     331        primitives.add(way2);
     332        OsmPrimitive closest = Geometry.getClosestPrimitive(node1, primitives);
     333        assertEquals(way1, closest);
     334    }
     335
     336    /**
     337     * Test of {@link Geometry#getFurthestPrimitive} method
     338     */
     339    @Test
     340    public void testGetFurthestPrimitive() {
     341        Node node1 = new Node(new LatLon(0, 0));
     342        Node node2 = new Node(new LatLon(0, 1.1));
     343        Node node3 = new Node(new LatLon(1, 0.1));
     344        Node node4 = new Node(new LatLon(1.1, 1));
     345        Way way1 = TestUtils.newWay("", node1, node2);
     346        Way way2 = TestUtils.newWay("", node3, node4);
     347        Way way3 = TestUtils.newWay("", node2, node4);
     348        Way way4 = TestUtils.newWay("", node1, node3);
     349
     350        List<OsmPrimitive> primitives = new ArrayList<>();
     351        primitives.add(way1);
     352        OsmPrimitive furthest = Geometry.getFurthestPrimitive(new Node(new LatLon(0, 0.75)), primitives);
     353        assertEquals(way1, furthest);
     354        primitives.add(way2);
     355        primitives.add(way3);
     356        primitives.add(way4);
     357        furthest = Geometry.getFurthestPrimitive(new Node(new LatLon(0, 0.5)), primitives);
     358        assertEquals(way2, furthest);
     359        furthest = Geometry.getFurthestPrimitive(new Node(new LatLon(.25, 0.5)), primitives);
     360        assertEquals(way2, furthest);
     361    }
     362
     363    /**
     364     * Test of {@link Geometry#getClosestWaySegment} method
     365     */
     366    @Test
     367    public void testGetClosestWaySegment() {
     368        Node node1 = new Node(new LatLon(0, 0));
     369        Node node2 = new Node(new LatLon(0, 1));
     370        Node node3 = new Node(new LatLon(0.3, 0.5));
     371        Node node4 = new Node(new LatLon(0.1, 0));
     372        Way way1 = TestUtils.newWay("", node1, node2, node3, node4);
     373
     374        Way closestSegment = Geometry.getClosestWaySegment(way1, new Node(new LatLon(0, 0.5))).toWay();
     375        Assert.assertTrue(closestSegment.containsNode(node1));
     376        Assert.assertTrue(closestSegment.containsNode(node2));
     377    }
     378
     379    /**
     380     * Test of {@link Geometry#getDistanceSegmentSegment} method
     381     */
     382    @Test
     383    public void testGetDistanceSegmentSegment() {
     384        Node node1 = new Node(new LatLon(2.0, 2.0));
     385        Node node2 = new Node(new LatLon(2.0, 3.0));
     386        Node node3 = new Node(new LatLon(2.3, 2.5));
     387        Node node4 = new Node(new LatLon(2.1, 2.0));
     388
     389        // connected segments
     390        assertEquals(0.0, Geometry.getDistanceSegmentSegment(node1, node2, node3, node1), 0.000001);
     391
     392        // distance between node 1 and node4 is the shortest
     393        double expected = node1.getEastNorth().distance(node4.getEastNorth());
     394        assertEquals(expected, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.000001);
     395
     396        // crossing segments
     397        node4.setCoor(new LatLon(1.9998192774806864, 2.0004056993230455));
     398        assertEquals(0, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.000001);
     399
     400        // usual case
     401        node4.setCoor(new LatLon(2.0002098170882276, 2.0000778643530537));
     402        assertEquals(23.4, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 1.0);
     403
     404        // similar segments, reversed direction
     405        node3.setCoor(node2.getCoor());
     406        node4.setCoor(node1.getCoor());
     407        assertEquals(0.0, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.000001);
     408
     409        // overlapping segments
     410        node3.setCoor(new LatLon(2.0, 2.2));
     411        node4.setCoor(new LatLon(2.0, 2.3));
     412        assertEquals(0.0, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.000001);
     413
     414        // parallel segments, n1 and n3 at same longitude
     415        node3.setCoor(new LatLon(2.1, 2.0));
     416        node4.setCoor(new LatLon(2.1, 2.3));
     417        expected = node1.getEastNorth().distance(node3.getEastNorth());
     418        assertEquals(expected, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.000001);
     419
     420        // parallel segments
     421        node3.setCoor(new LatLon(2.1, 2.1));
     422        assertEquals(expected, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.000001);
     423
     424        // almost parallel segments
     425        node3.setCoor(new LatLon(2.09999999, 2.1));
     426        assertEquals(expected, Geometry.getDistanceSegmentSegment(node1, node2, node3, node4), 0.01);
     427        assertTrue(expected > Geometry.getDistanceSegmentSegment(node1, node2, node3, node4));
     428    }
     429
    263430}
Note: See TracChangeset for help on using the changeset viewer.