Ignore:
Timestamp:
2017-04-04T15:29:07+02:00 (7 years ago)
Author:
GerdP
Message:

improve MultipolygonTest to fix #13307, add special case to unit test input file

Use complex Geometry.polygonIntersection test if simple tests cannot find a result.
This is very unlikely so it should not happen often.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java

    r11799 r11837  
    833833                    continue;
    834834                }
    835 
    836                 Node unsharedNode = getNonIntersectingNode(outerCandidate, inner);
    837                 if (unsharedNode != null) {
    838                     if (checkIfNodeIsInsidePolygon(unsharedNode, outerCandidate)) {
     835                boolean useIntersectionTest = false;
     836                Node unsharedOuterNode = null;
     837                Node unsharedInnerNode = getNonIntersectingNode(outerCandidate, inner);
     838                if (unsharedInnerNode != null) {
     839                    if (checkIfNodeIsInsidePolygon(unsharedInnerNode, outerCandidate)) {
    839840                        innerCandidates.add(inner);
    840841                    } else {
    841842                        // inner is not inside outerCandidate, check if it contains outerCandidate
    842                         unsharedNode = getNonIntersectingNode(inner, outerCandidate);
    843                         if (unsharedNode != null) {
    844                             if (checkIfNodeIsInsidePolygon(unsharedNode, inner)) {
    845                                 return null;
     843                        unsharedOuterNode = getNonIntersectingNode(inner, outerCandidate);
     844                        if (unsharedOuterNode != null) {
     845                            if (checkIfNodeIsInsidePolygon(unsharedOuterNode, inner)) {
     846                                return null; // outer is inside inner
    846847                            }
    847848                        } else {
    848                             return null; // polygons have only common nodes
     849                            useIntersectionTest = true;
    849850                        }
    850851                    }
    851852                } else {
    852853                    // all nodes of inner are also nodes of outerCandidate
    853                     unsharedNode = getNonIntersectingNode(inner, outerCandidate);
    854                     if (unsharedNode == null) {
     854                    unsharedOuterNode = getNonIntersectingNode(inner, outerCandidate);
     855                    if (unsharedOuterNode == null) {
     856                        return null; // all nodes shared -> same ways, maybe different direction
     857                    } else {
     858                        if (checkIfNodeIsInsidePolygon(unsharedOuterNode, inner)) {
     859                            return null; // outer is inside inner
     860                        } else {
     861                            useIntersectionTest = true;
     862                        }
     863                    }
     864                }
     865                if (useIntersectionTest) {
     866                    Main.warn("using complex test ");
     867                    PolygonIntersection res = Geometry.polygonIntersection(inner.getNodes(), outerCandidate.getNodes());
     868                    if (res == PolygonIntersection.FIRST_INSIDE_SECOND)
     869                        innerCandidates.add(inner);
     870                    else if (res == PolygonIntersection.SECOND_INSIDE_FIRST)
    855871                        return null;
    856                     } else {
    857                         innerCandidates.add(inner);
    858                     }
    859872                }
    860873            }
Note: See TracChangeset for help on using the changeset viewer.