Ticket #17614: 17614.patch
| File 17614.patch, 6.3 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/data/osm/WaySegment.java
12 12 /** 13 13 * The way. 14 14 */ 15 public Way way;15 public final Way way; 16 16 17 17 /** 18 18 * The index of one of the 2 nodes in the way. The other node has the 19 19 * index <code>lowerIndex + 1</code>. 20 20 */ 21 public int lowerIndex;21 public final int lowerIndex; 22 22 23 23 /** 24 24 * Constructs a new {@code WaySegment}. -
src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java
471 471 // the two polygons may only share one or more segments but they may also intersect 472 472 Area a1 = new Area(pd1.get()); 473 473 Area a2 = new Area(pd2.get()); 474 PolygonIntersection areaRes = Geometry.polygonIntersection(a1, a2 , 1e-6);474 PolygonIntersection areaRes = Geometry.polygonIntersection(a1, a2); 475 475 if (areaRes == PolygonIntersection.OUTSIDE) 476 476 return ExtPolygonIntersection.OUTSIDE; 477 477 return ExtPolygonIntersection.CROSSING; -
src/org/openstreetmap/josm/tools/Geometry.java
1 1 // License: GPL. For details, see LICENSE file. 2 2 package org.openstreetmap.josm.tools; 3 3 4 import java.awt.Rectangle;5 4 import java.awt.geom.Area; 6 5 import java.awt.geom.Line2D; 7 6 import java.awt.geom.Path2D; 7 import java.awt.geom.PathIterator; 8 import java.awt.geom.Rectangle2D; 8 9 import java.math.BigDecimal; 9 10 import java.math.MathContext; 10 11 import java.util.ArrayList; … … 71 72 CROSSING 72 73 } 73 74 75 /** threshold value for size of intersection area given in east/north space */ 76 public static final double INTERSECTION_EPS_EAST_NORTH = 0.01; 77 74 78 /** 75 79 * Will find all intersection and add nodes there for list of given ways. 76 80 * Handles self-intersections too. … … 577 581 public static PolygonIntersection polygonIntersection(List<? extends INode> first, List<? extends INode> second) { 578 582 Area a1 = getArea(first); 579 583 Area a2 = getArea(second); 580 return polygonIntersection(a1, a2 );584 return polygonIntersection(a1, a2, INTERSECTION_EPS_EAST_NORTH); 581 585 } 582 586 583 587 /** 584 * Tests if two polygons intersect. 588 * Tests if two polygons intersect. It is assumed that the area is given in East North points. 585 589 * @param a1 Area of first polygon 586 590 * @param a2 Area of second polygon 587 591 * @return intersection kind … … 588 592 * @since 6841 589 593 */ 590 594 public static PolygonIntersection polygonIntersection(Area a1, Area a2) { 591 return polygonIntersection(a1, a2, 1.0);595 return polygonIntersection(a1, a2, INTERSECTION_EPS_EAST_NORTH); 592 596 } 593 597 594 598 /** … … 603 607 Area inter = new Area(a1); 604 608 inter.intersect(a2); 605 609 606 Rectangle bounds = inter.getBounds(); 607 608 if (inter.isEmpty() || bounds.getHeight()*bounds.getWidth() <= eps) { 610 if (inter.isEmpty() || !checkIntersection(inter, eps)) { 609 611 return PolygonIntersection.OUTSIDE; 610 612 } else if (a2.getBounds2D().contains(a1.getBounds2D()) && inter.equals(a1)) { 611 613 return PolygonIntersection.FIRST_INSIDE_SECOND; … … 617 619 } 618 620 619 621 /** 622 * Check an intersection area which might describe multiple small polygons. 623 * Return true if any of the polygons is bigger than the given threshold. 624 * @param inter the intersection area 625 * @param eps an area threshold, everything below is considered an empty intersection 626 * @return true if any of the polygons is bigger than the given threshold. 627 */ 628 private static boolean checkIntersection(Area inter, double eps) { 629 PathIterator pit = inter.getPathIterator(null); 630 double[] res = new double[6]; 631 Rectangle2D r = new Rectangle2D.Double(); 632 while (!pit.isDone()) { 633 int type = pit.currentSegment(res); 634 switch (type) { 635 case PathIterator.SEG_MOVETO: 636 r = new Rectangle2D.Double(res[0], res[1], 0, 0); 637 break; 638 case PathIterator.SEG_LINETO: 639 r.add(res[0], res[1]); 640 break; 641 case PathIterator.SEG_CLOSE: 642 if (r.getWidth() > eps || r.getHeight() > eps) 643 return true; 644 break; 645 default: 646 break; 647 } 648 pit.next(); 649 } 650 if (inter.getBounds2D().getWidth() > eps || inter.getBounds2D().getHeight() > eps) { 651 long dd = 4; 652 } 653 return false; 654 } 655 656 /** 620 657 * Tests if point is inside a polygon. The polygon can be self-intersecting. In such case the contains function works in xor-like manner. 621 658 * @param polygonNodes list of nodes from polygon path. 622 659 * @param point the point to test … … 777 814 * Returns angle of a corner defined with 3 point coordinates. 778 815 * 779 816 * @param p1 first point 780 * @param p2 Common endpoint817 * @param common Common end point 781 818 * @param p3 third point 782 819 * @return Angle in radians (-pi, pi] 783 820 */ 784 public static double getCornerAngle(EastNorth p1, EastNorth p2, EastNorth p3) {821 public static double getCornerAngle(EastNorth p1, EastNorth common, EastNorth p3) { 785 822 786 823 CheckParameterUtil.ensure(p1, "p1", EastNorth::isValid); 787 CheckParameterUtil.ensure( p2, "p2", EastNorth::isValid);824 CheckParameterUtil.ensure(common, "p2", EastNorth::isValid); 788 825 CheckParameterUtil.ensure(p3, "p3", EastNorth::isValid); 789 826 790 Double result = getSegmentAngle(p2, p1) - getSegmentAngle(p2, p3);827 double result = getSegmentAngle(common, p1) - getSegmentAngle(common, p3); 791 828 if (result <= -Math.PI) { 792 829 result += 2 * Math.PI; 793 830 }
