Changeset 18590 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2022-11-08T21:50:55+01:00 (2 years ago)
Author:
taylor.smock
Message:

See #22453: Decrease allocations/CPU samples in Geometry.getDistanceSegmentSegment

This mostly reverts r18589, as it changed the distances returned to LatLon space,
which caused tests to fail.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/Geometry.java

    r18589 r18590  
    492492        double pdx = point.getX() - p1.getX();
    493493        double pdy = point.getY() - p1.getY();
    494 
    495         double offset = (pdx * ldx + pdy * ldy) / (ldx * ldx + ldy * ldy);
    496 
    497         if (segmentOnly && offset <= 0)
    498             return p1;
    499         else if (segmentOnly && offset >= 1)
    500             return p2;
    501         else
    502             return p1.interpolate(p2, offset);
    503     }
    504 
    505     /**
    506      * Get the closest point to a segment
    507      * @param p1 Point 1 of the segment
    508      * @param p2 Point 2 of the segment
    509      * @param point The point to use to get the closest point on the segment
    510      * @param segmentOnly {@code true} if the point <i>must</i> be on the segment
    511      * @return The closest point on the segment if {@code segmentOnly = true}, otherwise the closest point on the infinite line.
    512      */
    513     private static ILatLon closestPointTo(ILatLon p1, ILatLon p2, ILatLon point, boolean segmentOnly) {
    514         CheckParameterUtil.ensureParameterNotNull(p1, "p1");
    515         CheckParameterUtil.ensureParameterNotNull(p2, "p2");
    516         CheckParameterUtil.ensureParameterNotNull(point, "point");
    517 
    518         double ldx = p2.lon() - p1.lon();
    519         double ldy = p2.lat() - p1.lat();
    520 
    521         //segment zero length
    522         if (ldx == 0 && ldy == 0)
    523             return p1;
    524 
    525         double pdx = point.lon() - p1.lon();
    526         double pdy = point.lat() - p1.lat();
    527494
    528495        double offset = (pdx * ldx + pdy * ldy) / (ldx * ldx + ldy * ldy);
     
    15341501
    15351502        double smallest = Double.MAX_VALUE;
     1503        EastNorth en0 = node.getEastNorth();
    15361504        // go through the nodes as if they were paired
    15371505        Iterator<Node> iter = way.getNodes().iterator();
    1538         Node en1 = iter.next();
     1506        EastNorth en1 = iter.next().getEastNorth();
    15391507        while (iter.hasNext()) {
    1540             Node en2 = iter.next();
    1541             double distance = getSegmentNodeDistSq(en1, en2, node);
     1508            EastNorth en2 = iter.next().getEastNorth();
     1509            double distance = getSegmentNodeDistSq(en1, en2, en0);
    15421510            if (distance < smallest)
    15431511                smallest = distance;
     
    15921560        double rValue = Double.MAX_VALUE;
    15931561        Iterator<Node> iter1 = w1.getNodes().iterator();
     1562        List<Node> w2Nodes = w2.getNodes();
    15941563        Node w1N1 = iter1.next();
    1595         List<Node> w2Nodes = w2.getNodes();
    15961564        while (iter1.hasNext()) {
    15971565            Node w1N2 = iter1.next();
     
    16381606            return Double.NaN;
    16391607        }
    1640         if (getSegmentSegmentIntersection(ws1Node1, ws1Node2, ws2Node1, ws2Node2) != null)
     1608        EastNorth enWs1Node1 = ws1Node1.getEastNorth();
     1609        EastNorth enWs1Node2 = ws1Node2.getEastNorth();
     1610        EastNorth enWs2Node1 = ws2Node1.getEastNorth();
     1611        EastNorth enWs2Node2 = ws2Node2.getEastNorth();
     1612        if (getSegmentSegmentIntersection(enWs1Node1, enWs1Node2, enWs2Node1, enWs2Node2) != null)
    16411613            return 0;
    16421614
    1643         double dist1sq = getSegmentNodeDistSq(ws1Node1, ws1Node2, ws2Node1);
    1644         double dist2sq = getSegmentNodeDistSq(ws1Node1, ws1Node2, ws2Node2);
    1645         double dist3sq = getSegmentNodeDistSq(ws2Node1, ws2Node2, ws1Node1);
    1646         double dist4sq = getSegmentNodeDistSq(ws2Node1, ws2Node2, ws1Node2);
     1615        double dist1sq = getSegmentNodeDistSq(enWs1Node1, enWs1Node2, enWs2Node1);
     1616        double dist2sq = getSegmentNodeDistSq(enWs1Node1, enWs1Node2, enWs2Node2);
     1617        double dist3sq = getSegmentNodeDistSq(enWs2Node1, enWs2Node2, enWs1Node1);
     1618        double dist4sq = getSegmentNodeDistSq(enWs2Node1, enWs2Node2, enWs1Node2);
    16471619        double smallest = Math.min(Math.min(dist1sq, dist2sq), Math.min(dist3sq, dist4sq));
    16481620        return smallest != Double.MAX_VALUE ? Math.sqrt(smallest) : Double.NaN;
     
    16791651     * @return the square of the euclidean distance from p to the closest point on the segment
    16801652     */
    1681     private static double getSegmentNodeDistSq(ILatLon s1, ILatLon s2, ILatLon p) {
    1682         ILatLon c1 = closestPointTo(s1, s2, p, true);
    1683         return c1.distanceSq(p.lon(), p.lat());
     1653    private static double getSegmentNodeDistSq(EastNorth s1, EastNorth s2, EastNorth p) {
     1654        EastNorth c1 = closestPointTo(s1, s2, p, true);
     1655        return c1.distanceSq(p);
    16841656    }
    16851657}
Note: See TracChangeset for help on using the changeset viewer.