public static Building[] placeBigFires(int num, Building[] b, Limits radius) { List remaining = new ArrayList(); for (int i = 0; i < b.length; ++i) remaining.add(b[i]); Collections.shuffle(remaining); Collection fires = new HashSet(); System.out.print("Placing " + num + " big fires"); Iterator it = remaining.iterator(); for (int i = 0; i < num; ++i) { Building center = (Building) it.next(); fires.add(center); long r = radius.getNumber(); long distanceSquared = r * r; // Check for close buildings for (int j = 0; j < b.length; ++j) { long dx = center.getX() - b[j].getX(); long dy = center.getY() - b[j].getY(); long distance = (dx * dx) + (dy * dy); if (distance <= distanceSquared) fires.add(b[j]); } } return (Building[]) fires.toArray(new Building[0]); }
RandomConfig(String[] args) { Limits fireBrigades = new Limits(10, 15, "fireBrigades", "fire brigades"); Limits policeForces = new Limits(10, 15, "policeForces", "police forces"); Limits ambulanceTeams = new Limits(5, 8, "ambulanceTeams", "ambulance teams"); Limits fireStations = new Limits(1, 1, "fireStations", "fire stations"); Limits policeStations = new Limits(1, 1, "policeStations", "police stations"); Limits ambulanceCenters = new Limits(1, 1, "ambulanceCenters", "ambulance centers"); Limits civilians = new Limits(70, 90, "civilians", "civilians"); Limits refuges = new Limits(1, 5, "refuges", "refuges"); Limits fires = new Limits(2, 8, "fires", "fires"); Limits fireRadius = new Limits(0, 20000, "fireradius", "fire radius"); Limits[] allLimits = new Limits[] { fireBrigades, policeForces, ambulanceTeams, fireStations, policeStations, ambulanceCenters, civilians, refuges, fires, fireRadius }; boolean allowTrappedAgents = false; boolean bigFires = false; boolean trappedCivilians = true; String dir = ""; for (int i = 0; i < args.length; ++i) { if (args[i].startsWith("-min-")) { for (int j = 0; j < allLimits.length; ++j) { if (args[i].equalsIgnoreCase("-min-" + allLimits[j].prefix)) allLimits[j].min = Integer.parseInt(args[++i]); } } else if (args[i].startsWith("-max-")) { for (int j = 0; j < allLimits.length; ++j) { if (args[i].equalsIgnoreCase("-max-" + allLimits[j].prefix)) allLimits[j].max = Integer.parseInt(args[++i]); } } else if (args[i].startsWith("-no-")) { for (int j = 0; j < allLimits.length; ++j) { if (args[i].equalsIgnoreCase("-no-" + allLimits[j].prefix)) { allLimits[j].min = 0; allLimits[j].max = 0; } } } else if (args[i].startsWith("-set-")) { int num = Integer.parseInt(args[i + 1]); for (int j = 0; j < allLimits.length; ++j) { if (args[i].equalsIgnoreCase("-set-" + allLimits[j].prefix)) { allLimits[j].min = num; allLimits[j].max = num; } } ++i; } else if (args[i].equalsIgnoreCase("-t") || args[i].equalsIgnoreCase("--allow-trapped-agents")) { allowTrappedAgents = true; } else if (args[i].equalsIgnoreCase("-c") || args[i].equalsIgnoreCase("--allow-untrapped-civilians")) { trappedCivilians = false; } else if (args[i].equalsIgnoreCase("-b") || args[i].equalsIgnoreCase("--big-fires")) { bigFires = true; } else if (args[i].equalsIgnoreCase("-d") || args[i].equalsIgnoreCase("--dir")) { dir = args[i + 1]; } else if (args[i].equalsIgnoreCase("-h") || args[i].equalsIgnoreCase("--help")) { System.out.println("Usage: RandomConfig [options]"); System.out.println( "This program will read from \"road.bin\", \"node.bin\" and \"building.bin\" and produce a randomised \"gisini.txt\""); System.out.println("Options"); System.out.println("======="); for (int j = 0; j < allLimits.length; ++j) { System.out.println( "-min-" + allLimits[j].prefix + "\tSet the minimum number of " + allLimits[j].name + " (currently " + allLimits[j].min + ")"); System.out.println( "-max-" + allLimits[j].prefix + "\tSet the maximum number of " + allLimits[j].name + " (currently " + allLimits[j].max + ")"); System.out.println( "-no-" + allLimits[j].prefix + "\tSet the minimum and maximum of " + allLimits[j].name + " to zero"); } System.out.println( "-t\t--allow-trapped-agents\tAllow rescue agents (fire brigades, police forces and ambulance teams) to be placed inside buildings (default OFF)"); System.out.println( "-c\t--allow-untrapped-civilians\tAllow civilians to be placed outside buildings (default OFF)"); System.out.println("-b\t--big-fires\tAllow big fires"); System.out.println("-d\t--dir\tSet output directory (use full path)"); System.out.println("-h\t--help\tPrint this message"); return; } } try { File parentDir = new File(dir); File gisini = new File(parentDir, "gisini.txt"); // Open the output PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(gisini))); // Build the city data allNodes = MapFiles.loadNodes(parentDir); allRoads = MapFiles.loadRoads(parentDir); allBuildings = MapFiles.loadBuildings(parentDir); Memory memory = new HashMemory(); for (int i = 0; i < allNodes.length; ++i) memory.add(allNodes[i], 0); for (int i = 0; i < allRoads.length; ++i) memory.add(allRoads[i], 0); for (int i = 0; i < allBuildings.length; ++i) memory.add(allBuildings[i], 0); // Place items int numFireBrigades = fireBrigades.getNumber(); int numPoliceForces = policeForces.getNumber(); int numAmbulanceTeams = ambulanceTeams.getNumber(); int numFireStations = fireStations.getNumber(); int numPoliceStations = policeStations.getNumber(); int numAmbulanceCenters = ambulanceCenters.getNumber(); int numRefuges = refuges.getNumber(); int numCivilians = civilians.getNumber(); int numFires = fires.getNumber(); FireStation[] fireStationBuildings = new FireStation[numFireStations]; PoliceOffice[] policeOfficeBuildings = new PoliceOffice[numPoliceStations]; AmbulanceCenter[] ambulanceCenterBuildings = new AmbulanceCenter[numAmbulanceCenters]; Refuge[] refugeBuildings = new Refuge[numRefuges]; Building[] normalBuildings = placeMotionlessObjects( fireStationBuildings, policeOfficeBuildings, ambulanceCenterBuildings, refugeBuildings, allBuildings); MapFiles.writeGISMotionlessObjects( out, fireStationBuildings, policeOfficeBuildings, ambulanceCenterBuildings, refugeBuildings); FireBrigade[] fireBrigadeObjects = new FireBrigade[numFireBrigades]; PoliceForce[] policeForceObjects = new PoliceForce[numPoliceForces]; AmbulanceTeam[] ambulanceTeamObjects = new AmbulanceTeam[numAmbulanceTeams]; Civilian[] civilianObjects = new Civilian[numCivilians]; // // placeMovingObjects(fireBrigadeObjects,policeForceObjects,ambulanceTeamObjects,civilianObjects,allBuildings,allRoads,allNodes,allowTrappedAgents,trappedCivilians); placeMovingObjects( fireBrigadeObjects, policeForceObjects, ambulanceTeamObjects, civilianObjects, allBuildings, new Road[0], allNodes, allowTrappedAgents, trappedCivilians); MapFiles.writeGISMovingObjects( out, fireBrigadeObjects, policeForceObjects, ambulanceTeamObjects, civilianObjects, memory); Building[] fireBuildings; if (bigFires) fireBuildings = placeBigFires(numFires, normalBuildings, fireRadius); else fireBuildings = placeNormalFires(numFires, normalBuildings); MapFiles.writeGISFires(out, fireBuildings); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } }