package maps.convert.osm2gml.buildings; import maps.gml.GMLShape; import maps.gml.GMLMap; import maps.gml.GMLNode; import maps.gml.GMLDirectedEdge; import maps.convert.osm2gml.buildings.row.RowFiller; import maps.convert.osm2gml.buildings.row.RectangularDuplexRowFiller; import java.util.Random; import java.util.Comparator; //import rescuecore2.misc.gui.ShapeDebugFrame; /** A BuildingSpaceFiller that fills a space with row housing. */ public class RowHousingBuildingSpaceFiller implements BuildingSpaceFiller { // private ShapeDebugFrame debug; private double sizeOf1m; private Random random; /** Construct a new RowHousingBuildingSpaceFiller. @param sizeOf1m The size of 1m in GMLMap units. @param random The random number generator to use. */ public RowHousingBuildingSpaceFiller(double sizeOf1m, Random random/*, ShapeDebugFrame debug*/) { // this.debug = debug; this.sizeOf1m = sizeOf1m; this.random = random; } @Override public void createBuildings(GMLShape space, GMLMap map) { // Sort the edges of the space by length /* List<GMLDirectedEdge> allEdges = space.getEdges(); Collections.sort(allEdges, new EdgeLengthComparator()); Set<GMLFace> newFaces = new HashSet<GMLFace>(); RowFiller filler = createRandomFiller(); for (GMLDirectedEdge next : allEdges) { Set<GMLFace> edgeFaces = filler.fillRow(next, map); // debug.show("Next row faces", ConvertTools.createGMLDebugShapes(edgeFaces)); // Remove new faces that overlap with existing ones for (Iterator<GMLFace> it = edgeFaces.iterator(); it.hasNext();) { GMLFace newFace = it.next(); boolean good = true; for (GMLFace testFace : map.getFaces()) { if (testFace == newFace) { continue; } if (newFace.intersects(testFace)) { good = false; break; } } if (good) { newFaces.add(newFace); } else { map.removeFace(newFace); it.remove(); } } // debug.show("Pruned next row faces", ConvertTools.createGMLDebugShapes(edgeFaces)); } debug.show("All new faces", ConvertTools.createGMLDebugShapes(newFaces)); */ } private RowFiller createRandomFiller() { if (random.nextBoolean()) { return RectangularDuplexRowFiller.makeWideFiller(sizeOf1m, random); } else { return RectangularDuplexRowFiller.makeLongFiller(sizeOf1m, random); } } private static final class EdgeLengthComparator implements Comparator<GMLDirectedEdge>, java.io.Serializable { public int compare(GMLDirectedEdge e1, GMLDirectedEdge e2) { GMLNode start1 = e1.getStartNode(); GMLNode end1 = e1.getEndNode(); GMLNode start2 = e2.getStartNode(); GMLNode end2 = e2.getEndNode(); double dx1 = end1.getX() - start1.getX(); double dy1 = end1.getY() - start1.getY(); double dx2 = end2.getX() - start2.getX(); double dy2 = end2.getY() - start2.getY(); double l1 = Math.hypot(dx1, dy1); double l2 = Math.hypot(dx2, dy2); if (l1 < l2) { return 1; } if (l2 < l1) { return -1; } return 0; } } }