// Morteza2011***************************************************************** public static SOSArea reMerge(SOSArea blockade1, SOSArea blockade2) { java.awt.geom.Area a1 = new Area(blockade1.getShape()); java.awt.geom.Area a2 = new Area(blockade2.getShape()); a1.add(a2); int[] apexes = AliGeometryTools.getApexes(a1); ArrayList<Edge> edges = new ArrayList<Edge>(); for (int i = 0; i < apexes.length / 2 - 1; i++) { edges.add(new Edge(apexes[i * 2], apexes[i * 2 + 1], apexes[i * 2 + 2], apexes[i * 2 + 3])); } SOSArea finalArea = new SOSArea(edges); finalArea.addReachablityBlockades(blockade1.getReachablityBlockades()); finalArea.addReachablityBlockades(blockade2.getReachablityBlockades()); return finalArea; }
// Morteza2011***************************************************************** public static SOSArea merge( StandardEntity a, SOSArea blockade1, SOSArea blockade2, short mergedNumber) { ArrayList<Edge> edgeList1 = new ArrayList<Edge>(blockade1.getEdges()); ArrayList<Edge> edgeList2 = new ArrayList<Edge>(blockade2.getEdges()); Pair<ArrayList<Edge>, ArrayList<Edge>> newEdges = splitEdges(edgeList1, edgeList2); removeExtraEdges(newEdges.first(), blockade2.getShape()); removeExtraEdges(newEdges.second(), blockade1.getShape()); try { ArrayList<SOSArea> sortedEdges = sortEdges(a, newEdges.first(), newEdges.second(), false); SOSArea finalMergedArea; if (sortedEdges.size() > 1) finalMergedArea = removeHoles(sortedEdges); else if (sortedEdges.size() == 1) finalMergedArea = sortedEdges.get(0); else { return reMerge(blockade1, blockade2); } finalMergedArea.setEdges(verifyEdgesAfterMerge(finalMergedArea.getEdges())); finalMergedArea.setReachablityBlockades(blockade1.getReachablityBlockades()); finalMergedArea.addReachablityBlockades(blockade2.getReachablityBlockades()); return finalMergedArea; } catch (ReachablityException e) { } return reMerge(blockade1, blockade2); }