Changeset 17727 in josm for trunk/src/org


Ignore:
Timestamp:
2021-04-09T20:45:28+02:00 (4 years ago)
Author:
simon04
Message:

fix #20732 - Migrate org.openstreetmap.josm.data.imagery.Shape#coords to java.awt.Polygon

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/imagery/Shape.java

    r16877 r17727  
    22package org.openstreetmap.josm.data.imagery;
    33
    4 import static org.openstreetmap.josm.tools.I18n.tr;
    5 
     4import java.awt.Polygon;
    65import java.text.MessageFormat;
    7 import java.util.ArrayList;
     6import java.util.AbstractList;
    87import java.util.List;
    98import java.util.Objects;
     
    1312import org.openstreetmap.gui.jmapviewer.Coordinate;
    1413import org.openstreetmap.josm.data.coor.LatLon;
    15 import org.openstreetmap.josm.data.osm.Node;
    1614import org.openstreetmap.josm.tools.CheckParameterUtil;
    17 import org.openstreetmap.josm.tools.Geometry;
     15
     16import static org.openstreetmap.josm.tools.I18n.tr;
    1817
    1918/**
     
    2524public class Shape {
    2625
    27     private final List<Coordinate> coords = new ArrayList<>();
     26    private final Polygon coords;
    2827
    2928    public Shape(String asString, String separator) {
     
    3332            throw new IllegalArgumentException(MessageFormat.format("Even number of doubles expected in string, got {0}: {1}",
    3433                    components.length, asString));
     34        int size = components.length / 2;
     35        this.coords = new Polygon(new int[size], new int[size], 0);
    3536        for (int i = 0; i < components.length; i += 2) {
    3637            addPoint(components[i], components[i+1]);
     
    4243     */
    4344    public Shape() {
     45        coords = new Polygon();
    4446        // shape contents can be set later with addPoint()
    4547    }
     
    5153     */
    5254    public String encodeAsString(String separator) {
    53         return coords.stream()
     55        return getPoints().stream()
    5456                .flatMap(c -> Stream.of(c.getLat(), c.getLon()))
    5557                .map(String::valueOf)
     
    6971
    7072    public List<Coordinate> getPoints() {
    71         return coords;
     73        return new AbstractList<Coordinate>() {
     74            @Override
     75            public Coordinate get(int index) {
     76                double lat = coords.ypoints[index] / LatLon.MAX_SERVER_INV_PRECISION;
     77                double lon = coords.xpoints[index] / LatLon.MAX_SERVER_INV_PRECISION;
     78                return new Coordinate(lat, lon);
     79            }
     80
     81            @Override
     82            public int size() {
     83                return coords.npoints;
     84            }
     85        };
    7286    }
    7387
    7488    public boolean contains(LatLon latlon) {
    75         if (latlon == null)
    76             return false;
    77         List<Node> nodes = coords.stream()
    78                 .map(c -> new Node(new LatLon(c.getLat(), c.getLon())))
    79                 .collect(Collectors.toList());
    80         return Geometry.nodeInsidePolygon(new Node(latlon), nodes);
     89        return coords.contains(
     90                latlon.getX() * LatLon.MAX_SERVER_INV_PRECISION,
     91                latlon.getY() * LatLon.MAX_SERVER_INV_PRECISION);
    8192    }
    8293
     
    103114        }
    104115
    105         coords.add(new Coordinate(LatLon.roundToOsmPrecision(lat), LatLon.roundToOsmPrecision(lon)));
     116        coords.addPoint(
     117                (int) (lon * LatLon.MAX_SERVER_INV_PRECISION),
     118                (int) (lat * LatLon.MAX_SERVER_INV_PRECISION));
    106119    }
    107120
    108121    @Override
    109122    public int hashCode() {
    110         return Objects.hash(coords);
     123        return Objects.hash(getPoints());
    111124    }
    112125
     
    116129        if (obj == null || getClass() != obj.getClass()) return false;
    117130        Shape shape = (Shape) obj;
    118         return Objects.equals(coords, shape.coords);
     131        return Objects.equals(getPoints(), shape.getPoints());
     132    }
     133
     134    @Override
     135    public String toString() {
     136        return "Shape{coords=" + getPoints() + '}';
    119137    }
    120138}
Note: See TracChangeset for help on using the changeset viewer.