| 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 | } |