private static Collection<Way> findRoofLinesWays(Way way) { List<Way> process = new ArrayList<Way>(); process.add(way); Set<Way> processed = new HashSet<Way>(); // processed.add(way); while (!process.isEmpty()) { Way proc = process.remove(0); List<Way> childWays = findChildRoofLines(proc); for(Way childWay : childWays) { if (processed.contains(childWay)) { continue; } if (isEdge(childWay) || isRidge(childWay)) { processed.add(childWay); process.add(childWay); } } } // test if it is inside outline! //TODO return processed; }
private static List<Way> findChildRoofLines(Way way) { List<Way> ret = new ArrayList<Way>(); for (int i = 0; i < way.getNodesCount(); i++) { Node node = way.getNode(i); List<OsmPrimitive> referrers = node.getReferrers(); for(OsmPrimitive ref : referrers) { if (ref.equals(way)) { continue; } if (!(ref instanceof Way)) { continue; } if (isEdge(( Way)ref) || isRidge(( Way)ref)) { ret.add((Way)ref); } } } return ret; }
/** * @param way */ private static boolean hasWayRoofLines(Way way) { for (int i = 0; i < way.getNodesCount(); i++) { Node node = way.getNode(i); List<OsmPrimitive> referrers = node.getReferrers(); for (OsmPrimitive ref : referrers) { if (ref.equals(way)) { continue; } if (!(ref instanceof Way)) { continue; } if (isEdge((Way) ref) || isRidge((Way) ref)) { return true; } } } return false; }
} else if (isRidge(roofLine)) { ridgesWay.add(roofLine);