Ticket #24947: 24947.patch

File 24947.patch, 5.3 KB (added by DanProgs <Abenteurer.2901@…>, 7 days ago)
  • src/org/openstreetmap/josm/actions/AlignInLineAction.java

    ### Eclipse Workspace Patch 1.0
    #P josm
    diff --git src/org/openstreetmap/josm/actions/AlignInLineAction.java src/org/openstreetmap/josm/actions/AlignInLineAction.java
    index 9d85c4f..554e277 100644
     
    291291     * @return List of useful lines
    292292     * @throws InvalidSelection if a node got more than 4 neighbours (self-crossing way)
    293293     */
    294     private static List<Line> getInvolvedLines(Node node, List<Way> refWays) throws InvalidSelection {
    295         List<Line> lines = new ArrayList<>();
    296         List<Node> neighbors = new ArrayList<>();
    297         for (Way way: refWays) {
    298             List<Node> nodes = way.getNodes();
    299             neighbors.clear();
    300             for (int i = 1; i < nodes.size()-1; i++) {
    301                 if (nodes.get(i) == node) {
    302                     neighbors.add(nodes.get(i-1));
    303                     neighbors.add(nodes.get(i+1));
    304                 }
    305             }
    306             if (neighbors.isEmpty())
    307                 continue;
    308             else if (neighbors.size() == 2)
    309                 // Non self crossing
    310                 lines.add(new Line(neighbors.get(0), neighbors.get(1)));
    311             else if (neighbors.size() == 4) {
    312                 // Self crossing, have to make 2 lines with 4 neighbors
    313                 // see #9081 comment 6
    314                 EastNorth c = node.getEastNorth();
    315                 double[] angle = IntStream.range(0, 4)
    316                         .mapToDouble(i -> PolarCoor.computeAngle(neighbors.get(i).getEastNorth(), c)).toArray();
    317                 double[] deltaAngle = new double[3];
    318                 for (int i = 0; i < 3; i++) {
    319                     deltaAngle[i] = angle[i+1] - angle[0];
    320                     if (deltaAngle[i] < 0)
    321                         deltaAngle[i] += 2*Math.PI;
    322                 }
    323                 int nb = 0;
    324                 if (deltaAngle[1] < deltaAngle[0]) nb++;
    325                 if (deltaAngle[2] < deltaAngle[0]) nb++;
    326                 if (nb == 1) {
    327                     // Align along [neighbors[0], neighbors[1]] and [neighbors[0], neighbors[2]]
    328                     lines.add(new Line(neighbors.get(0), neighbors.get(1)));
    329                     lines.add(new Line(neighbors.get(2), neighbors.get(3)));
    330                 } else {
    331                     // Align along [neighbors[0], neighbors[2]] and [neighbors[1], neighbors[3]]
    332                     lines.add(new Line(neighbors.get(0), neighbors.get(2)));
    333                     lines.add(new Line(neighbors.get(1), neighbors.get(3)));
    334                 }
    335             } else
    336                 throw new InvalidSelection("cannot treat more than 4 neighbours, got "+neighbors.size());
    337         }
    338         return lines;
    339     }
     294    private static List<Line> getInvolvedLines(Node node, List<Way> refWays) throws InvalidSelection {
     295        List<Line> lines = new ArrayList<>();
     296        List<Node> neighbors = new ArrayList<>();
     297        for (Way way : refWays) {
     298            List<Node> nodes = way.getNodes();
     299            neighbors.clear();
     300            for (int i = 1; i < nodes.size() - 1; i++) {
     301                if (nodes.get(i) == node) {
     302                    neighbors.add(nodes.get(i - 1));
     303                    neighbors.add(nodes.get(i + 1));
     304                }
     305            }
     306            if (!neighbors.isEmpty()) {
     307                if (neighbors.size() == 2)
     308                    // Non self crossing
     309                    lines.add(new Line(neighbors.get(0), neighbors.get(1)));
     310                else if (neighbors.size() == 4) {
     311                    // Self crossing, have to make 2 lines with 4 neighbors
     312                    // see #9081 comment 6
     313                    EastNorth c = node.getEastNorth();
     314                    double[] angle = IntStream.range(0, 4)
     315                            .mapToDouble(i -> PolarCoor.computeAngle(neighbors.get(i).getEastNorth(), c)).toArray();
     316                    double[] deltaAngle = new double[3];
     317                    for (int i = 0; i < 3; i++) {
     318                        deltaAngle[i] = angle[i + 1] - angle[0];
     319                        if (deltaAngle[i] < 0)
     320                            deltaAngle[i] += 2 * Math.PI;
     321                    }
     322                    int nb = 0;
     323                    if (deltaAngle[1] < deltaAngle[0])
     324                        nb++;
     325                    if (deltaAngle[2] < deltaAngle[0])
     326                        nb++;
     327                    if (nb == 1) {
     328                        // Align along [neighbors[0], neighbors[1]] and [neighbors[0], neighbors[2]]
     329                        lines.add(new Line(neighbors.get(0), neighbors.get(1)));
     330                        lines.add(new Line(neighbors.get(2), neighbors.get(3)));
     331                    } else {
     332                        // Align along [neighbors[0], neighbors[2]] and [neighbors[1], neighbors[3]]
     333                        lines.add(new Line(neighbors.get(0), neighbors.get(2)));
     334                        lines.add(new Line(neighbors.get(1), neighbors.get(3)));
     335                    }
     336                } else
     337                    throw new InvalidSelection("cannot treat more than 4 neighbours, got " + neighbors.size());
     338            }
     339        }
     340        return lines;
     341    }
    340342
    341343    /**
    342344     * Align a single node relative to a set of lines #9081