From 5fd324fcff67a7cf590a66aa4ff991eaec2dbdde Mon Sep 17 00:00:00 2001 From: irawinder Date: Mon, 14 Mar 2016 12:09:26 -0400 Subject: [PATCH 01/14] First Commit --- Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde | 7 +++++++ Processing/Misc/UrbanAutonomous/sketch.properties | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde create mode 100644 Processing/Misc/UrbanAutonomous/sketch.properties diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde new file mode 100644 index 0000000..4bc8957 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -0,0 +1,7 @@ +void setup() { + size(400, 400); +} + +void draw() { + background(255); +} diff --git a/Processing/Misc/UrbanAutonomous/sketch.properties b/Processing/Misc/UrbanAutonomous/sketch.properties new file mode 100644 index 0000000..8630fa2 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/sketch.properties @@ -0,0 +1,2 @@ +mode.id=processing.mode.java.JavaMode +mode=Java From b50e5ea093f558458adc267cf51589917c0f9106 Mon Sep 17 00:00:00 2001 From: Yasutsugu Tommy Nagatomi Date: Mon, 14 Mar 2016 21:44:02 -0400 Subject: [PATCH 02/14] initial commit Initial commit --- .../Misc/UrbanAutonomous/BasicTile.java | 39 + Processing/Misc/UrbanAutonomous/Coord.java | 9 + Processing/Misc/UrbanAutonomous/Demand.java | 23 + .../Misc/UrbanAutonomous/DemandStack.java | 291 ++++++ Processing/Misc/UrbanAutonomous/Disp.java | 176 ++++ .../Misc/UrbanAutonomous/DragStatus.java | 16 + .../Misc/UrbanAutonomous/FileControl.java | 15 + Processing/Misc/UrbanAutonomous/Hub.java | 48 + .../UrbanAutonomous/HubPeripheralVehicle.java | 237 +++++ Processing/Misc/UrbanAutonomous/HubStack.java | 36 + .../Misc/UrbanAutonomous/HubVehicle.java | 167 ++++ Processing/Misc/UrbanAutonomous/MapBlock.java | 59 ++ .../Misc/UrbanAutonomous/MapBlockBase.java | 67 ++ .../Misc/UrbanAutonomous/MapBlockBrushs.java | 53 ++ .../Misc/UrbanAutonomous/MapBlockStack.java | 75 ++ .../Misc/UrbanAutonomous/OperationDisp.java | 240 +++++ .../Misc/UrbanAutonomous/OperationWindow.java | 137 +++ Processing/Misc/UrbanAutonomous/PFrame.java | 14 + .../PeripheralVehicleStatus.java | 18 + Processing/Misc/UrbanAutonomous/SimParam.java | 66 ++ Processing/Misc/UrbanAutonomous/Status.java | 16 + Processing/Misc/UrbanAutonomous/Tile.java | 11 + Processing/Misc/UrbanAutonomous/TileType.java | 19 + Processing/Misc/UrbanAutonomous/UDP.java | 881 ++++++++++++++++++ .../Misc/UrbanAutonomous/UDPSocket.java | 201 ++++ .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 254 ++++- Processing/Misc/UrbanAutonomous/Vehicle.java | 141 +++ .../Misc/UrbanAutonomous/VehicleStack.java | 60 ++ .../Misc/UrbanAutonomous/data/congestion.png | Bin 0 -> 118 bytes .../Misc/UrbanAutonomous/data/hrTile.png | Bin 0 -> 132 bytes .../Misc/UrbanAutonomous/data/hwTile.png | Bin 0 -> 132 bytes .../UrbanAutonomous/data/intersectionTile.png | Bin 0 -> 117 bytes .../Misc/UrbanAutonomous/data/lrTile.png | Bin 0 -> 132 bytes .../Misc/UrbanAutonomous/data/lwTile.png | Bin 0 -> 132 bytes .../Misc/UrbanAutonomous/data/noneTile.png | Bin 0 -> 126 bytes .../UrbanAutonomous/data/operationWindow.jpg | Bin 0 -> 151091 bytes .../Misc/UrbanAutonomous/data/roadTile.png | Bin 0 -> 118 bytes Processing/Misc/UrbanAutonomous/ruralMap.txt | 256 +++++ Processing/Misc/UrbanAutonomous/urbanMap.txt | 256 +++++ 39 files changed, 3875 insertions(+), 6 deletions(-) create mode 100644 Processing/Misc/UrbanAutonomous/BasicTile.java create mode 100644 Processing/Misc/UrbanAutonomous/Coord.java create mode 100644 Processing/Misc/UrbanAutonomous/Demand.java create mode 100644 Processing/Misc/UrbanAutonomous/DemandStack.java create mode 100644 Processing/Misc/UrbanAutonomous/Disp.java create mode 100644 Processing/Misc/UrbanAutonomous/DragStatus.java create mode 100644 Processing/Misc/UrbanAutonomous/FileControl.java create mode 100644 Processing/Misc/UrbanAutonomous/Hub.java create mode 100644 Processing/Misc/UrbanAutonomous/HubPeripheralVehicle.java create mode 100644 Processing/Misc/UrbanAutonomous/HubStack.java create mode 100644 Processing/Misc/UrbanAutonomous/HubVehicle.java create mode 100644 Processing/Misc/UrbanAutonomous/MapBlock.java create mode 100644 Processing/Misc/UrbanAutonomous/MapBlockBase.java create mode 100644 Processing/Misc/UrbanAutonomous/MapBlockBrushs.java create mode 100644 Processing/Misc/UrbanAutonomous/MapBlockStack.java create mode 100644 Processing/Misc/UrbanAutonomous/OperationDisp.java create mode 100644 Processing/Misc/UrbanAutonomous/OperationWindow.java create mode 100644 Processing/Misc/UrbanAutonomous/PFrame.java create mode 100644 Processing/Misc/UrbanAutonomous/PeripheralVehicleStatus.java create mode 100644 Processing/Misc/UrbanAutonomous/SimParam.java create mode 100644 Processing/Misc/UrbanAutonomous/Status.java create mode 100644 Processing/Misc/UrbanAutonomous/Tile.java create mode 100644 Processing/Misc/UrbanAutonomous/TileType.java create mode 100644 Processing/Misc/UrbanAutonomous/UDP.java create mode 100644 Processing/Misc/UrbanAutonomous/UDPSocket.java create mode 100644 Processing/Misc/UrbanAutonomous/Vehicle.java create mode 100644 Processing/Misc/UrbanAutonomous/VehicleStack.java create mode 100644 Processing/Misc/UrbanAutonomous/data/congestion.png create mode 100644 Processing/Misc/UrbanAutonomous/data/hrTile.png create mode 100644 Processing/Misc/UrbanAutonomous/data/hwTile.png create mode 100644 Processing/Misc/UrbanAutonomous/data/intersectionTile.png create mode 100644 Processing/Misc/UrbanAutonomous/data/lrTile.png create mode 100644 Processing/Misc/UrbanAutonomous/data/lwTile.png create mode 100644 Processing/Misc/UrbanAutonomous/data/noneTile.png create mode 100644 Processing/Misc/UrbanAutonomous/data/operationWindow.jpg create mode 100644 Processing/Misc/UrbanAutonomous/data/roadTile.png create mode 100644 Processing/Misc/UrbanAutonomous/ruralMap.txt create mode 100644 Processing/Misc/UrbanAutonomous/urbanMap.txt diff --git a/Processing/Misc/UrbanAutonomous/BasicTile.java b/Processing/Misc/UrbanAutonomous/BasicTile.java new file mode 100644 index 0000000..b8a4985 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/BasicTile.java @@ -0,0 +1,39 @@ +public class BasicTile { + public Tile hwTile; + public Tile lwTile; + public Tile hrTile; + public Tile lrTile; + public Tile roadTile; + public Tile intersectionTile; + + public BasicTile() { + float[] hwDepartureProbabilityArray = { 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.40f, 0.35f, 0.20f, 0.20f, 0.20f, 0.20f, 0.20f, 0.30f, 0.30f, 0.30f, 0.30f, 0.90f, 0.90f, 0.90f, 0.50f, 0.40f, 0.30f, 0.20f, 0.10f }; + float[] hwArrivalProbabilityArray = { 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.40f, 0.35f, 0.90f, 0.90f, 0.20f, 0.20f, 0.20f, 0.30f, 0.30f, 0.30f, 0.30f, 0.20f, 0.20f, 0.20f, 0.20f, 0.20f, 0.10f, 0.10f, 0.10f }; + hwTile = new Tile(hwDepartureProbabilityArray, hwArrivalProbabilityArray, TileType.HW); + + float[] lwDepartureProbabilityArray = { 0.03f, 0.03f, 0.03f, 0.03f, 0.10f, 0.13f, 0.12f, 0.07f, 0.07f, 0.07f, 0.07f, 0.07f, 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.30f, 0.30f, 0.17f, 0.13f, 0.10f, 0.07f, 0.03f }; + float[] lwArrivalProbabilityArray = { 0.03f, 0.03f, 0.03f, 0.03f, 0.10f, 0.13f, 0.12f, 0.30f, 0.30f, 0.07f, 0.07f, 0.07f, 0.10f, 0.10f, 0.10f, 0.10f, 0.07f, 0.07f, 0.07f, 0.07f, 0.07f, 0.03f, 0.03f, 0.03f }; + lwTile = new Tile(lwDepartureProbabilityArray, lwArrivalProbabilityArray, TileType.LW); + + float[] hrDepartureProbabilityArray = { 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.40f, 0.35f, 0.90f, 0.90f, 0.20f, 0.20f, 0.20f, 0.30f, 0.30f, 0.30f, 0.30f, 0.20f, 0.20f, 0.20f, 0.20f, 0.20f, 0.10f, 0.10f, 0.10f }; + float[] hrArrivalProbabilityArray = { 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.40f, 0.35f, 0.20f, 0.20f, 0.20f, 0.20f, 0.20f, 0.30f, 0.30f, 0.30f, 0.30f, 0.90f, 0.90f, 0.90f, 0.50f, 0.40f, 0.30f, 0.20f, 0.10f }; + hrTile = new Tile(hrDepartureProbabilityArray, hrArrivalProbabilityArray, TileType.HR); + + float[] lrDepartureProbabilityArray = { 0.03f, 0.03f, 0.03f, 0.03f, 0.10f, 0.13f, 0.12f, 0.30f, 0.30f, 0.07f, 0.07f, 0.07f, 0.10f, 0.10f, 0.10f, 0.10f, 0.07f, 0.07f, 0.07f, 0.07f, 0.07f, 0.03f, 0.03f, 0.03f }; + float[] lrArrivalProbabilityArray = { 0.03f, 0.03f, 0.03f, 0.03f, 0.10f, 0.13f, 0.12f, 0.07f, 0.07f, 0.07f, 0.07f, 0.07f, 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.30f, 0.30f, 0.17f, 0.13f, 0.10f, 0.07f, 0.03f }; + lrTile = new Tile(lrDepartureProbabilityArray, lrArrivalProbabilityArray, TileType.LR); + + float[] roadDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; + float[] roadArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; + roadTile = new Tile(roadDepartureProbabilityArray, roadArrivalProbabilityArray, TileType.ROAD); + + float[] intersectionDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; + float[] intersectionArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; + intersectionTile = new Tile(intersectionDepartureProbabilityArray, intersectionArrivalProbabilityArray, + TileType.INTERSECTION); + } +} diff --git a/Processing/Misc/UrbanAutonomous/Coord.java b/Processing/Misc/UrbanAutonomous/Coord.java new file mode 100644 index 0000000..fe804d4 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Coord.java @@ -0,0 +1,9 @@ +public class Coord { + public int x; + public int y; + + public Coord(int _x, int _y) { + x = _x; + y = _y; + } +} \ No newline at end of file diff --git a/Processing/Misc/UrbanAutonomous/Demand.java b/Processing/Misc/UrbanAutonomous/Demand.java new file mode 100644 index 0000000..e17f192 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Demand.java @@ -0,0 +1,23 @@ + +public class Demand { + public int streetNumber; + public int x; + public int y; + public boolean isHorizontalStreet; + public boolean isDepartureDemand; + public int lifetime;// steps + + public Demand(int _x, int _y, int _streetNumber, boolean _isHorizontalStreet, boolean _isDepartureDemand) { + x = _x; + y = _y; + streetNumber = _streetNumber; + isHorizontalStreet = _isHorizontalStreet; + isDepartureDemand = _isDepartureDemand; + lifetime = UrbanAutonomous.simParam.demandLifetime * 10;// unit:steps (min* 10) + } + + public Demand(int _x, int _y) { + x = _x; + y = _y; + } +} diff --git a/Processing/Misc/UrbanAutonomous/DemandStack.java b/Processing/Misc/UrbanAutonomous/DemandStack.java new file mode 100644 index 0000000..c2bdd4a --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/DemandStack.java @@ -0,0 +1,291 @@ + +import java.util.ArrayList; +import java.util.Iterator; + + +import processing.core.PApplet; + +public class DemandStack extends PApplet { + public ArrayList unallocatedArrivalList; + public ArrayList unallocatedDepartureList; + public ArrayList unallocatedHubArrivalList; + public ArrayList unallocatedHubDepartureList; + boolean isHorizontalStreet; + public int[] unallocatedDemandSizeHistory; + public int missedDemand; + public int[] missedDemandHistory; + + public DemandStack() { + missedDemand = 0; + missedDemandHistory = new int[720]; + unallocatedArrivalList = new ArrayList(); + unallocatedDepartureList = new ArrayList(); + unallocatedHubArrivalList = new ArrayList(); + unallocatedHubDepartureList = new ArrayList(); + isHorizontalStreet = true; + unallocatedDemandSizeHistory = new int[720]; + for (int i = 0; i < 720; i++) + unallocatedDemandSizeHistory[i] = 0; + } + + public void init() { + missedDemand = 0; + missedDemandHistory = new int[720]; + unallocatedArrivalList = new ArrayList(); + unallocatedDepartureList = new ArrayList(); + unallocatedHubArrivalList = new ArrayList(); + unallocatedHubDepartureList = new ArrayList(); + isHorizontalStreet = true; + unallocatedDemandSizeHistory = new int[720]; + for (int i = 0; i < 720; i++) + unallocatedDemandSizeHistory[i] = 0; + } + + // Demand Generation + public void demandGen(int _numberOfDemand, int _updateInterval) { + if (UrbanAutonomous.simParam.currentTime % _updateInterval == 0) { + for (int i = 0; i < _numberOfDemand; i++) { + isHorizontalStreet = !isHorizontalStreet; + Demand tmpArrivalDemand = demandCreation(false); + Demand tmpDepartureDemand = demandCreation(true); + // Demand Clarification + if (UrbanAutonomous.simParam.hubEnable) { + if (isHubEffective(tmpArrivalDemand, tmpDepartureDemand)) { + unallocatedHubArrivalList.add(tmpArrivalDemand); + unallocatedHubDepartureList.add(tmpDepartureDemand);// departureDemand + } else { + unallocatedArrivalList.add(tmpArrivalDemand); + unallocatedDepartureList.add(tmpDepartureDemand);// departureDemand + } + } + } + } + } + + // DemandCreation + Demand demandCreation(boolean isDepartureDemand) { + while (true) { + Demand demandCandidate = demandCandidateGen(isHorizontalStreet, isDepartureDemand); + if (probabilityCheck(demandCandidate)) { + return demandCandidate; + } + } + } + + // Demand Candidate Generation + Demand demandCandidateGen(boolean isHorizontalStreet, boolean isDepartureDemand) { + Demand _demandCandidate; + if (isHorizontalStreet) { + int streetNumber = (int) random(16); + int y = streetNumber * 5 + 2; + int x = (int) random(80); + _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); + } else { + int streetNumber = (int) random(16); + int x = streetNumber * 5 + 2; + int y = (int) random(80); + _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); + } + return _demandCandidate; + } + + // probability check + boolean probabilityCheck(Demand _demandCandidate) { + boolean determination = false; + float sum = 0; + float avgProbability; + if (_demandCandidate.isDepartureDemand) { + if (_demandCandidate.isHorizontalStreet) { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 2].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 1].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 1].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 2].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } else { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x + - 2][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + - 1][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 1][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 2][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } + } else { + if (_demandCandidate.isHorizontalStreet) { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 2].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 1].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 1].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 2].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } else { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x + - 2][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + - 1][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 1][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 2][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } + } + if (sum != 0) { + avgProbability = sum * 100 / 4; + if ((int) random(1 / (avgProbability / 100)) == 0) + determination = true; + } + return determination; + } + + // DemandAllocation for Hub + public void demandHubAllocation() { + if (unallocatedHubListIsNotEmpty()) { + if (UrbanAutonomous.hubStack.hubPeripheralVehicleA.status == PeripheralVehicleStatus.STOP) { + for (int i = 0; i < unallocatedHubDepartureList.size(); i++) { + if (fromHubAtoB(unallocatedHubArrivalList.get(i), unallocatedHubDepartureList.get(i))) { + UrbanAutonomous.hubStack.hubPeripheralVehicleA.status = PeripheralVehicleStatus.DEPARTURE; + UrbanAutonomous.hubStack.hubPeripheralVehicleA.departureList + .add(unallocatedHubDepartureList.remove(i)); + UrbanAutonomous.hubStack.hubPeripheralVehicleA.reserveArrivalList + .add(unallocatedHubArrivalList.remove(i)); + } + } + } + if (UrbanAutonomous.hubStack.hubPeripheralVehicleB.status == PeripheralVehicleStatus.STOP) { + for (int i = 0; i < unallocatedHubDepartureList.size(); i++) { + if (fromHubBtoA(unallocatedHubArrivalList.get(i), unallocatedHubDepartureList.get(i))) { + UrbanAutonomous.hubStack.hubPeripheralVehicleB.status = PeripheralVehicleStatus.DEPARTURE; + UrbanAutonomous.hubStack.hubPeripheralVehicleB.departureList + .add(unallocatedHubDepartureList.remove(i)); + UrbanAutonomous.hubStack.hubPeripheralVehicleB.reserveArrivalList + .add(unallocatedHubArrivalList.remove(i)); + } + } + } + } + } + + boolean hubPeripheralVehicleIsEmpty(HubPeripheralVehicle v) { + boolean result = false; + if (v.arrivalList.size() == 0 && v.departureList.size() == 0 && v.reserveArrivalList.size() == 0) + result = true; + return result; + } + + boolean unallocatedHubListIsNotEmpty() { + boolean result = false; + if (unallocatedHubDepartureList.size() > 0 || unallocatedHubArrivalList.size() > 0) { + result = true; + } + return result; + } + + // DemandAllocation except hub + public void demandAllocation() { + if (unallocatedDepartureList.size() > 0 || unallocatedArrivalList.size() > 0) { + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + if (vehicle.arrivalList.size() == 0 && vehicle.departureList.size() == 0) { + while (vehicle.arrivalList.size() < UrbanAutonomous.simParam.capacityOfVehicle + && vehicle.departureList.size() < UrbanAutonomous.simParam.capacityOfVehicle) { + if (unallocatedDepartureList.size() > 0 || unallocatedArrivalList.size() > 0) { + vehicle.arrivalList.add(unallocatedArrivalList.get(0)); + vehicle.departureList.add(unallocatedDepartureList.get(0)); + unallocatedArrivalList.remove(0); + unallocatedDepartureList.remove(0); + } else { + break; + } + } + } + } + } + } + + // Hub effectiveCheck + boolean isHubEffective(Demand arrivalDemand, Demand departureDemand) { + boolean result = false; + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + return result; + } + + // fromHubA to fromHubB + boolean fromHubBtoA(Demand arrivalDemand, Demand departureDemand) { + boolean result = false; + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + return result; + } + + // fromHubA to fromHubB + boolean fromHubAtoB(Demand arrivalDemand, Demand departureDemand) { + boolean result = false; + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + return result; + } + + // DemandLifeTime + public void demandLifetimeControl() { + if (unallocatedArrivalList.size() > 0) { + Iterator iter = unallocatedArrivalList.iterator(); + while (iter.hasNext()) { + Demand tmpDemand = iter.next(); + if (tmpDemand.lifetime == 0) { + iter.remove(); + missedDemand++; + // missedDemandHistory[UrbanAutonomous.simParam.currentTime/20]=missedDemand; + } else { + tmpDemand.lifetime -= 1; + } + } + missedDemandHistory[UrbanAutonomous.simParam.currentTime / 20] = missedDemand; + iter = unallocatedDepartureList.iterator(); + while (iter.hasNext()) { + Demand tmpDemand = iter.next(); + if (tmpDemand.lifetime == 0) { + iter.remove(); + } else { + tmpDemand.lifetime -= 1; + } + } + } + } +} diff --git a/Processing/Misc/UrbanAutonomous/Disp.java b/Processing/Misc/UrbanAutonomous/Disp.java new file mode 100644 index 0000000..8f86724 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Disp.java @@ -0,0 +1,176 @@ + + +import processing.core.PApplet; +import processing.core.PConstants; + +//import com.y; + +public class Disp { + PApplet p; + + public Disp(PApplet _p) { + p = _p; + } + + // ShowALl + public void show() { + // showMap(); + + oldshowMap(); + showUnallocatedDemand(); + showAllocatedDemand(); + showVehicle(); + showCongestion(); + if (UrbanAutonomous.simParam.hubEnable) { + showHub(); + showHubVehicle(); + showHubPeripheralVehicle(); + showHubRelocation(); + } + } + //ShowHubRelocation + void showHubRelocation(){ + if (UrbanAutonomous.dragStatus == DragStatus.HUBA || UrbanAutonomous.dragStatus == DragStatus.HUBB) { + p.ellipseMode(PConstants.CENTER); + p.stroke(UrbanAutonomous.hubColor); + p.ellipse(p.mouseX, p.mouseY, 10, 10); + } + } + + // ShowMap + void oldshowMap() { + for (int y = 0; y < 16; y++) + for (int x = 0; x < 16; x++) + p.image(UrbanAutonomous.mapBlockStack.mapBlockArray[x][y].pg, x * 50, y * 50); + } + + void showMap() { + p.image(UrbanAutonomous.mapBlockStack.pg, 0, 0); + } + + // ShowDemand + // ShowUnallocatedDemand + void showUnallocatedDemand() { + for (Demand tmpDemand : UrbanAutonomous.demandStack.unallocatedArrivalList) { + showEachDemand(tmpDemand); + } + for (Demand tmpDemand : UrbanAutonomous.demandStack.unallocatedDepartureList) { + showEachDemand(tmpDemand); + } + } + + // ShowAllocatedDemand + void showAllocatedDemand() { + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + for (Demand tmpDemand : vehicle.arrivalList) { + showEachAllocatedDemand(tmpDemand); + } + for (Demand tmpDemand : vehicle.departureList) { + showEachAllocatedDemand(tmpDemand); + } + } + } + + void showEachAllocatedDemand(Demand tmpDemand) { + p.ellipseMode(PConstants.CENTER); + if (tmpDemand.isDepartureDemand) + p.fill(UrbanAutonomous.allocatedDepartureColor); + else + p.fill(UrbanAutonomous.allocatedArrivalColor); + p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 5, 5); + } + + void showEachDemand(Demand tmpDemand) { + p.ellipseMode(PConstants.CENTER); + if (tmpDemand.isDepartureDemand) + p.fill(UrbanAutonomous.unallocatedDepartureColor); + else + p.fill(UrbanAutonomous.unallocatedArrivalColor); + p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 5, 5); + } + + // ShowVehicle + void showVehicle() { + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + p.ellipseMode(PConstants.CENTER); + p.fill(UrbanAutonomous.vehicleColor); + p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 15, 15); + } + } + + // Show Congestion + void showCongestion() { + int totalCongestionLevel = 0; + // Vehicle + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + for (Demand position : vehicle.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + } + if (UrbanAutonomous.simParam.hubEnable) { + // HubVehicle + for (Coord position : UrbanAutonomous.hubStack.hubVehicleArray[0].movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + // HubPeripheralVehicle + for (Coord position : UrbanAutonomous.hubStack.hubPeripheralVehicleA.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + for (Coord position : UrbanAutonomous.hubStack.hubPeripheralVehicleB.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + } + UrbanAutonomous.simParam.totalCongestionLevel[UrbanAutonomous.simParam.currentTime / 20] = totalCongestionLevel; + UrbanAutonomous.simParam.currentTotalCongestionLevel = totalCongestionLevel; + } + + // oldShow Congestion + void oldshowCongestion() { + int totalCongestionLevel = 0; + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + for (Demand position : vehicle.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + } + UrbanAutonomous.simParam.totalCongestionLevel[UrbanAutonomous.simParam.currentTime / 20] = totalCongestionLevel; + UrbanAutonomous.simParam.currentTotalCongestionLevel = totalCongestionLevel; + } + + // Show Hub + void showHub() { + p.ellipseMode(PConstants.CENTER); + p.rectMode(PConstants.CENTER); + for (int i = 0; i < UrbanAutonomous.hubStack.hubArray.length; i++) { + p.fill(UrbanAutonomous.hubColor); + p.ellipse(UrbanAutonomous.hubStack.hubArray[i].x * 10 + 5, UrbanAutonomous.hubStack.hubArray[i].y * 10 + 5, 15, 15); + p.fill(UrbanAutonomous.hubEffectiveLengthColor); + p.rect(UrbanAutonomous.hubStack.hubArray[i].x * 10 + 5, UrbanAutonomous.hubStack.hubArray[i].y * 10 + 5, + UrbanAutonomous.simParam.hubEffectiveLength * 10 * 2, UrbanAutonomous.simParam.hubEffectiveLength * 10 * 2); + } + } + + // Show HubVehicle + void showHubVehicle() { + p.ellipseMode(PConstants.CENTER); + p.fill(UrbanAutonomous.hubVehicleColor); + for (int i = 0; i < UrbanAutonomous.hubStack.hubVehicleArray.length; i++) { + p.ellipse(UrbanAutonomous.hubStack.hubVehicleArray[i].x * 10 + 5, UrbanAutonomous.hubStack.hubVehicleArray[i].y * 10 + 5, + 15, 15); + } + } + + // Show HubPeripheralVehicle + void showHubPeripheralVehicle() { + p.ellipseMode(PConstants.CENTER); + p.fill(UrbanAutonomous.hubPeripheralVehicleColor); + p.ellipse(UrbanAutonomous.hubStack.hubPeripheralVehicleA.x * 10 + 5, + UrbanAutonomous.hubStack.hubPeripheralVehicleA.y * 10 + 5, 15, 15); + p.ellipse(UrbanAutonomous.hubStack.hubPeripheralVehicleB.x * 10 + 5, + UrbanAutonomous.hubStack.hubPeripheralVehicleB.y * 10 + 5, 15, 15); + } +} diff --git a/Processing/Misc/UrbanAutonomous/DragStatus.java b/Processing/Misc/UrbanAutonomous/DragStatus.java new file mode 100644 index 0000000..20b1e51 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/DragStatus.java @@ -0,0 +1,16 @@ +public enum DragStatus { + NORMAL(1), + HUBA(2), + HUBB(3); + + private final int id; + + private DragStatus(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + +} diff --git a/Processing/Misc/UrbanAutonomous/FileControl.java b/Processing/Misc/UrbanAutonomous/FileControl.java new file mode 100644 index 0000000..3a98e76 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/FileControl.java @@ -0,0 +1,15 @@ + +import processing.core.PApplet; + +public class FileControl extends PApplet { + public int [] customMap; + + public FileControl() { + customMap = new int[(16*16)]; + } + + public void outputCSV() { + String []outData=str(customMap); + saveStrings("customMap.txt", outData); + } + } \ No newline at end of file diff --git a/Processing/Misc/UrbanAutonomous/Hub.java b/Processing/Misc/UrbanAutonomous/Hub.java new file mode 100644 index 0000000..d31f003 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Hub.java @@ -0,0 +1,48 @@ + +import java.util.ArrayList; + +public class Hub { + public int x; + public int y; + public boolean isHorizontalStreet; + public boolean isIntersection; + public int streetNumber; + public ArrayList unallocatedArrivalList; + public ArrayList hubVehicleWaitingList; + + public Hub(int _x, int _y) { + x = _x; + y = _y; + unallocatedArrivalList = new ArrayList(); + hubVehicleWaitingList = new ArrayList(); + paramUpdate(); + } + + void paramUpdate() { + isHorizontalStreet = false; + isIntersection = false; + streetNumber = 0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet = true; + streetNumber = ((y + 5 - 2) / 5) - 1; + } else { + streetNumber = ((x + 5 - 2) / 5) - 1; + } + if (isVerticalStreetCheck() && isHorizontalStreetCheck()) + isIntersection = true; + } + + boolean isHorizontalStreetCheck() { + boolean result = false; + if ((y - 2 + 5) % 5 == 0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result = false; + if ((x - 2 + 5) % 5 == 0) + result = true; + return result; + } +} diff --git a/Processing/Misc/UrbanAutonomous/HubPeripheralVehicle.java b/Processing/Misc/UrbanAutonomous/HubPeripheralVehicle.java new file mode 100644 index 0000000..3e2e6b3 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/HubPeripheralVehicle.java @@ -0,0 +1,237 @@ + +import java.util.ArrayList; + +import processing.core.PApplet; + +public class HubPeripheralVehicle { + public int x; + public int y; + public int streetNumber; + public boolean isHorizontalStreet; + public boolean isIntersection; + public boolean forHubA; + + public ArrayList departureList; + public ArrayList reserveArrivalList; + public ArrayList arrivalList; + public ArrayList movingHistoryList; + PApplet p; + public PeripheralVehicleStatus status; + + public HubPeripheralVehicle(int _x, int _y, PApplet _p, boolean _forHubA) { + status = PeripheralVehicleStatus.STOP; + x = _x; + y = _y; + p = _p; + forHubA = _forHubA; + departureList = new ArrayList(); + arrivalList = new ArrayList(); + reserveArrivalList = new ArrayList(); + movingHistoryList = new ArrayList(); + } + + // Parameter Update + void paramUpdate() { + isHorizontalStreet = false; + isIntersection = false; + streetNumber = 0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet = true; + streetNumber = ((y + 5 - 2) / 5) - 1; + } else { + streetNumber = ((x + 5 - 2) / 5) - 1; + } + if (isVerticalStreetCheck() && isHorizontalStreetCheck()) + isIntersection = true; + } + + boolean isHorizontalStreetCheck() { + boolean result = false; + if ((y - 2 + 5) % 5 == 0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result = false; + if ((x - 2 + 5) % 5 == 0) + result = true; + return result; + } + + // Vehicle Movement + public void move() { + paramUpdate(); + movingHistoryUpdate(); + switch (status) { + case STOP: + break; + case DEPARTURE: + eachMove(departureList); + break; + case TOHUB: + if (forHubA) + goToHub(UrbanAutonomous.hubStack.hubA); + else + goToHub(UrbanAutonomous.hubStack.hubB); + break; + case ARRIVAL: + eachMove(arrivalList); + break; + default: + break; + } + } + + void movingHistoryUpdate() { + Coord tmpVehiclePosition = new Coord(x, y); + if (status == PeripheralVehicleStatus.STOP) { + if (movingHistoryList.size() > 0) + movingHistoryList.remove(0); + } else if (movingHistoryList.size() >= UrbanAutonomous.simParam.vehicleHistorySize) + movingHistoryList.remove(0); + else + movingHistoryList.add(tmpVehiclePosition); + } + + void eachMove(ArrayList tmpList) { + if (isSamePoint(tmpList.get(0))) { + tmpList.remove(0); + if (tmpList.size() == 0) + if (status == PeripheralVehicleStatus.DEPARTURE) + status = PeripheralVehicleStatus.TOHUB; + else if (status == PeripheralVehicleStatus.ARRIVAL) + status = PeripheralVehicleStatus.STOP; + } else if (isSameStreet(tmpList.get(0))) { + if (tmpList.get(0).isHorizontalStreet) + x += (tmpList.get(0).x - x) / p.abs(tmpList.get(0).x - x); + else + y += (tmpList.get(0).y - y) / p.abs(tmpList.get(0).y - y); + } else { + if (isIntersection) { + if (tmpList.get(0).isHorizontalStreet) + y += (tmpList.get(0).y - y) / p.abs(tmpList.get(0).y - y); + else + x += (tmpList.get(0).x - x) / p.abs(tmpList.get(0).x - x); + } else { + if (isHorizontalStreet) { + if (tmpList.get(0).isHorizontalStreet) { + if (x > 77) { + x -= 1; + } else { + x += 1; + } + } else { + x += (tmpList.get(0).x - x) / p.abs(tmpList.get(0).x - x); + } + } else { + if (tmpList.get(0).isHorizontalStreet) { + y += (tmpList.get(0).y - y) / p.abs(tmpList.get(0).y - y); + } else { + if (y > 77) { + y -= 1; + } else { + y += 1; + } + } + } + } + } + } + + void goToHub(Hub tmpHub) { + if (isSamePoint(tmpHub)) { + tmpHub.hubVehicleWaitingList.addAll(reserveArrivalList); + reserveArrivalList = new ArrayList(); + if (tmpHub.unallocatedArrivalList.size() > 0) { + status = PeripheralVehicleStatus.ARRIVAL; + while (arrivalList.size() < UrbanAutonomous.simParam.capacityOfPeripheralVehicle + || tmpHub.unallocatedArrivalList.size() > 0) { + arrivalList.add(tmpHub.unallocatedArrivalList.remove(0)); + } + } else { + status = PeripheralVehicleStatus.STOP; + } + } else if (isSameStreet(tmpHub)) { + if (tmpHub.isHorizontalStreet) + x += (tmpHub.x - x) / p.abs(tmpHub.x - x); + else + y += (tmpHub.y - y) / p.abs(tmpHub.y - y); + } else { + if (isIntersection) { + if (tmpHub.isHorizontalStreet) + y += (tmpHub.y - y) / p.abs(tmpHub.y - y); + else + x += (tmpHub.x - x) / p.abs(tmpHub.x - x); + } else { + if (isHorizontalStreet) { + if (tmpHub.isHorizontalStreet) { + if (x > 77) { + x -= 1; + } else { + x += 1; + } + } else { + x += (tmpHub.x - x) / p.abs(tmpHub.x - x); + } + } else { + if (tmpHub.isHorizontalStreet) { + y += (tmpHub.y - y) / p.abs(tmpHub.y - y); + } else { + if (y > 77) { + y -= 1; + } else { + y += 1; + } + } + } + } + } + } + + boolean isSameStreet(Demand tmpDemand) { + boolean result = false; + if (tmpDemand.streetNumber == streetNumber && tmpDemand.isHorizontalStreet == isHorizontalStreet) + result = true; + else if (isIntersection) { + if (tmpDemand.isHorizontalStreet) { + if ((((y - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } else { + if ((((x - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } + } + return result; + } + + boolean isSamePoint(Demand tmpDemand) { + boolean result = false; + if (tmpDemand.x == x && tmpDemand.y == y) + result = true; + return result; + } + + boolean isSameStreet(Hub tmpDemand) { + boolean result = false; + if (tmpDemand.streetNumber == streetNumber && tmpDemand.isHorizontalStreet == isHorizontalStreet) + result = true; + else if (isIntersection) { + if (tmpDemand.isHorizontalStreet) { + if ((((y - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } else { + if ((((x - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } + } + return result; + } + + boolean isSamePoint(Hub tmpDemand) { + boolean result = false; + if (tmpDemand.x == x && tmpDemand.y == y) + result = true; + return result; + } +} diff --git a/Processing/Misc/UrbanAutonomous/HubStack.java b/Processing/Misc/UrbanAutonomous/HubStack.java new file mode 100644 index 0000000..980eafb --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/HubStack.java @@ -0,0 +1,36 @@ +import processing.core.PApplet; + +public class HubStack { + public PApplet p; + public Hub hubA; + public Hub hubB; + public int ax,ay,bx,by; + public static HubVehicle hubVehicleA; + public Hub [] hubArray; + public HubVehicle [] hubVehicleArray; + public HubPeripheralVehicle hubPeripheralVehicleA,hubPeripheralVehicleB; + + public HubStack(PApplet _p) { + p=_p; + ax=72; + ay=7; + bx=7; + by=72; + hubA = new Hub(ax, ay); + hubB = new Hub(bx, by); + hubArray = new Hub[]{hubA,hubB}; + hubVehicleA = new HubVehicle(0,0,p); + hubVehicleArray = new HubVehicle[]{hubVehicleA}; + hubPeripheralVehicleA = new HubPeripheralVehicle(0,0,p,true); + hubPeripheralVehicleB = new HubPeripheralVehicle(0,0,p,false); + } + public void init(){ + hubA = new Hub(ax, ay); + hubB = new Hub(bx, by); + hubArray = new Hub[]{hubA,hubB}; + hubVehicleA = new HubVehicle(0,0,p); + hubVehicleArray = new HubVehicle[]{hubVehicleA}; + hubPeripheralVehicleA = new HubPeripheralVehicle(0,0,p,true); + hubPeripheralVehicleB = new HubPeripheralVehicle(0,0,p,false); + } +} diff --git a/Processing/Misc/UrbanAutonomous/HubVehicle.java b/Processing/Misc/UrbanAutonomous/HubVehicle.java new file mode 100644 index 0000000..8f24dd8 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/HubVehicle.java @@ -0,0 +1,167 @@ +import java.util.ArrayList; + + +import processing.core.PApplet; + +public class HubVehicle { + + public int x; + public int y; + public int streetNumber; + public boolean isHorizontalStreet; + public boolean isIntersection; + public boolean toHubA; + ArrayList arrivalList; + public ArrayList movingHistoryList; + PApplet p; + + public HubVehicle(int _x, int _y, PApplet _p) { + x = _x; + y = _y; + p = _p; + toHubA = false; + arrivalList = new ArrayList(); + movingHistoryList = new ArrayList(); + } + + // Parameter Update + void paramUpdate() { + isHorizontalStreet = false; + isIntersection = false; + streetNumber = 0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet = true; + streetNumber = ((y + 5 - 2) / 5) - 1; + } else { + streetNumber = ((x + 5 - 2) / 5) - 1; + } + if (isVerticalStreetCheck() && isHorizontalStreetCheck()) + isIntersection = true; + } + + boolean isHorizontalStreetCheck() { + boolean result = false; + if ((y - 2 + 5) % 5 == 0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result = false; + if ((x - 2 + 5) % 5 == 0) + result = true; + return result; + } + + // Vehicle Movement + public void move() { + paramUpdate(); + movingHistoryUpdate(); + eachMove(); + } + + void movingHistoryUpdate() { + Coord tmpVehiclePosition = new Coord(x, y); + if (!(isInHub())) + movingHistoryList.add(tmpVehiclePosition); + if (isInHub() && movingHistoryList.size() > 0) + movingHistoryList.remove(0); + if (movingHistoryList.size() >= UrbanAutonomous.simParam.vehicleHistorySize) + movingHistoryList.remove(0); + } + + boolean isInHub() { + boolean result = false; + if (UrbanAutonomous.hubStack.hubA.y == y && UrbanAutonomous.hubStack.hubA.y == y) + result = true; + if (UrbanAutonomous.hubStack.hubB.y == y && UrbanAutonomous.hubStack.hubB.y == y) + result = true; + return result; + } + + void eachMove() { + if (toHubA) + eachSubMove(UrbanAutonomous.hubStack.hubA); + else + eachSubMove(UrbanAutonomous.hubStack.hubB); + } + + boolean hubIsNotEmpty() { + boolean result = false; + if (UrbanAutonomous.hubStack.hubA.hubVehicleWaitingList.size() > 0 + || UrbanAutonomous.hubStack.hubB.hubVehicleWaitingList.size() > 0) + result = true; + return result; + } + + void eachSubMove(Hub hubX) { + if (isSamePoint(hubX)) { + hubX.unallocatedArrivalList.addAll(arrivalList); + if (hubIsNotEmpty()) { + toHubA = !toHubA; + arrivalList = new ArrayList(); + while (arrivalList.size() < UrbanAutonomous.simParam.hubDedicatedVehicleCapacity + && hubX.hubVehicleWaitingList.size() != 0) { + arrivalList.add(hubX.hubVehicleWaitingList.get(0)); + } + } + } else if (isSameStreet(hubX)) { + if (hubX.isHorizontalStreet) + x += (hubX.x - x) / p.abs(hubX.x - x); + else + y += (hubX.y - y) / p.abs(hubX.y - y); + } else { + if (isIntersection) { + if (hubX.isHorizontalStreet) + y += (hubX.y - y) / p.abs(hubX.y - y); + else + x += (hubX.x - x) / p.abs(hubX.x - x); + } else { + if (isHorizontalStreet) { + if (hubX.isHorizontalStreet) { + if (x > 77) { + x -= 1; + } else { + x += 1; + } + } else { + x += (hubX.x - x) / p.abs(hubX.x - x); + } + } else { + if (hubX.isHorizontalStreet) { + y += (hubX.y - y) / p.abs(hubX.y - y); + } else { + if (y > 77) { + y -= 1; + } else { + y += 1; + } + } + } + } + } + } + + boolean isSameStreet(Hub hubA) { + boolean result = false; + if (hubA.streetNumber == streetNumber && hubA.isHorizontalStreet == isHorizontalStreet) + result = true; + else if (isIntersection) { + if (hubA.isHorizontalStreet) { + if ((((y - 2 + 5) / 5) - 1) == hubA.streetNumber) + result = true; + } else { + if ((((x - 2 + 5) / 5) - 1) == hubA.streetNumber) + result = true; + } + } + return result; + } + + boolean isSamePoint(Hub hub) { + boolean result = false; + if (hub.x == x && hub.y == y) + result = true; + return result; + } +} diff --git a/Processing/Misc/UrbanAutonomous/MapBlock.java b/Processing/Misc/UrbanAutonomous/MapBlock.java new file mode 100644 index 0000000..27fcb68 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/MapBlock.java @@ -0,0 +1,59 @@ + +import processing.core.PApplet; +import processing.core.PGraphics; + +public class MapBlock { + PApplet p; + int blockSize; + Tile[][] tileArray; + public PGraphics pg; + + public MapBlock() { + } + + public MapBlock(PApplet _p) { + p = _p; + } + + public MapBlock(PApplet _p, Tile[][] _tileArray) { + p = _p; + blockSize = 5; + tileArray = _tileArray; + gen(); + } + + void gen() { + if (pg == null) + pg = p.createGraphics(blockSize * 10, blockSize * 10); + pg.beginDraw(); + pg.background(255); + pg.stroke(255); + for (int y = 0; y < blockSize; y++) { + for (int x = 0; x < blockSize; x++) { + switch (tileArray[x][y].tileType) { + case HW: + pg.image(UrbanAutonomous.hwImg, x * 10, y * 10); + break; + case LW: + pg.image(UrbanAutonomous.lwImg, x * 10, y * 10); + break; + case HR: + pg.image(UrbanAutonomous.hrImg, x * 10, y * 10); + break; + case LR: + pg.image(UrbanAutonomous.lrImg, x * 10, y * 10); + break; + case ROAD: + pg.image(UrbanAutonomous.roadImg, x * 10, y * 10); + break; + case INTERSECTION: + pg.image(UrbanAutonomous.intersectionImg, x * 10, y * 10); + break; + default: + break; + } + } + } + pg.endDraw(); + } +} diff --git a/Processing/Misc/UrbanAutonomous/MapBlockBase.java b/Processing/Misc/UrbanAutonomous/MapBlockBase.java new file mode 100644 index 0000000..0503839 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/MapBlockBase.java @@ -0,0 +1,67 @@ + + +import processing.core.PApplet; + +public class MapBlockBase { + MapBlockBase() {} + + //RandomMapBlock + Tile[][] randomTileArrayGen(PApplet p) { + Tile[][] tileArray=new Tile[5][5]; + Tile [] basicTileArray= { + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + }; + for (int y=0; y<5; y++) { + for (int x=0; x<5; x++) { + if (x==2&&y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.intersectionTile; + else if (x==2||y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.roadTile; + else { + tileArray[x][y]=basicTileArray[(int) p.random(4)]; + } + } + } + return tileArray; + } + + //SpecificTile + Tile[][] specificTileArrayGen(int number) { + Tile[][] tileArray=new Tile[5][5]; + Tile [] basicTileArray= { + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + }; + for (int y=0; y<5; y++) { + for (int x=0; x<5; x++) { + if (x==2&&y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.intersectionTile; + else if (x==2||y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.roadTile; + else { + tileArray[x][y]=basicTileArray[number]; + } + } + } + return tileArray; + } + + Tile[][] specificTileArrayGen(PApplet p) { + int number=(int)p.random(4); + Tile[][] tileArray=new Tile[5][5]; + Tile [] basicTileArray= { + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + }; + for (int y=0; y<5; y++) { + for (int x=0; x<5; x++) { + if (x==2&&y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.intersectionTile; + else if (x==2||y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.roadTile; + else { + tileArray[x][y]=basicTileArray[number]; + } + } + } + return tileArray; + } + } diff --git a/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java b/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java new file mode 100644 index 0000000..049a645 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java @@ -0,0 +1,53 @@ +import processing.core.PApplet; +import processing.core.PGraphics; + +public class MapBlockBrushs extends MapBlockBase { + public MapBlock[] randomBrushs; + public MapBlock[] specificBrushs; + public MapBlock selectedBrush; + public int numberOfBrush; + public PGraphics pg; + PApplet p; + + public MapBlockBrushs(PApplet _p,int _numberOfBrush) { + p=_p; + randomBrushs = new MapBlock[_numberOfBrush]; + specificBrushs = new MapBlock[_numberOfBrush]; + numberOfBrush=_numberOfBrush; + randomBrushsGen(_numberOfBrush); + specificBrushsGen(); + selectedBrush = specificBrushs[0]; + } + + public void randomBrushsGen(int _numberOfBrush) { + for (int i=0; i<_numberOfBrush; i++) { + randomBrushs[i] = new MapBlock(p,randomTileArrayGen(p)); + } + } + public void randomBrushsGen() { + for (int i=0; i1130 && mouseX <1850) { + if (mouseY >150-50 && mouseY<150+50) { + UrbanAutonomous.simParam.currentTime=(mouseX-1130)*20 ; + } + } + //save file for custom map + if (mouseX > 200 && mouseX<300) + if (mouseY> 200 && mouseY<230) + UrbanAutonomous.fileControl.outputCSV(); + + //MAP + if (mouseX > 50 && mouseX<200) { + if (mouseY> 100 && mouseY<130) { + UrbanAutonomous.mapBlockStack.loadUrbanMap(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } else if (mouseY> 150 && mouseY<180) { + UrbanAutonomous.mapBlockStack.loadRuralMap(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } else if (mouseY> 200 && mouseY<230) { + UrbanAutonomous.mapBlockStack.noneMapGen(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } + } + //MAP change brush + if (mouseX >50 && mouseX <200) { + if (mouseY >530 && mouseY<600) { + UrbanAutonomous.mapBlockBrushs.randomBrushsGen(); + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + } + } + //Map Brush select + if (mouseX >50 && mouseX <100) { + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + if (mouseY >250 && mouseY<300) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + UrbanAutonomous.brushNumber=0; + } else if (mouseY >320 && mouseY<370) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[1]; + UrbanAutonomous.brushNumber=1; + } else if (mouseY >390 && mouseY<440) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[2]; + UrbanAutonomous.brushNumber=2; + } else if (mouseY >460 && mouseY<510) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; + UrbanAutonomous.brushNumber=3; + } + } else if (mouseX >150 && mouseX <200) { + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + if (mouseY >250 && mouseY<300) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[0]; + } else if (mouseY >320 && mouseY<370) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[1]; + } else if (mouseY >390 && mouseY<440) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[2]; + } else if (mouseY >460 && mouseY<510) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[3]; + } + } + + + int offsetSecond=580; + //Fleet Demand + + if (mouseX > offsetSecond && mouseX<= offsetSecond+200) { + //Fleet Size + + //number of vehicle + if (mouseY>100 && mouseY <100+30) { + UrbanAutonomous.simParam.numberOfVehicle=(int)((mouseX-offsetSecond)/2); + UrbanAutonomous.vehicleStack.vehicleGen(); + } + + //capacity of vehicle + else if (mouseY>171 && mouseY<170+30) { + UrbanAutonomous.simParam.capacityOfVehicle=(int)((mouseX-offsetSecond)/2); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseY>520 && mouseY<520+30) { + //currentDemandSize + UrbanAutonomous.simParam.currentDemandSize=(int)((mouseX-offsetSecond)/2); + } else if (mouseY>630 && mouseY<630+30) { + //demandInterval + UrbanAutonomous.simParam.demandInterval=(int)((mouseX-offsetSecond)/2); + } else if (mouseY>700 && mouseY<700+30) { + //demandLifetime + UrbanAutonomous.simParam.demandLifetime=(int)((mouseX-offsetSecond)/2); + } + } + + //FleetPreset Button + if (mouseY>340 && mouseY<340+30) { + if (mouseX>420 && mouseX<420+100) { + //PEV + UrbanAutonomous.simParam.numberOfVehicle=80; + UrbanAutonomous.simParam.capacityOfVehicle=1; + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseX>550 && mouseX<550+100) { + //Car + UrbanAutonomous.simParam.numberOfVehicle=20; + UrbanAutonomous.simParam.capacityOfVehicle=4; + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseX>680 && mouseX<680+100) { + //Bus + UrbanAutonomous.simParam.numberOfVehicle=1; + UrbanAutonomous.simParam.capacityOfVehicle=80; + UrbanAutonomous.vehicleStack.vehicleGen(); + } + } + + //DemandSize preset + if (mouseX>300 && mouseX<780) { + if (mouseY > 450 && mouseY<480) { + UrbanAutonomous.simParam.demandSizeCustom=false; + } else if (mouseY > 520 && mouseY<550) { + UrbanAutonomous.simParam.demandSizeCustom=true; + } + } + } + } diff --git a/Processing/Misc/UrbanAutonomous/PFrame.java b/Processing/Misc/UrbanAutonomous/PFrame.java new file mode 100644 index 0000000..abf18dd --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/PFrame.java @@ -0,0 +1,14 @@ + +import javax.swing.JFrame; + + + +public class PFrame extends JFrame { + public PFrame(int _x, int _y, int _width, int _height) { + setBounds(_x, _y, _width, _height); + UrbanAutonomous.opw = new OperationWindow(); + add(UrbanAutonomous.opw); + UrbanAutonomous.opw.init(); + setVisible(true); + } +} \ No newline at end of file diff --git a/Processing/Misc/UrbanAutonomous/PeripheralVehicleStatus.java b/Processing/Misc/UrbanAutonomous/PeripheralVehicleStatus.java new file mode 100644 index 0000000..95e32c4 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/PeripheralVehicleStatus.java @@ -0,0 +1,18 @@ + +public enum PeripheralVehicleStatus { + STOP(1), + DEPARTURE(2), + TOHUB(3), + ARRIVAL(4); + + private final int id; + + private PeripheralVehicleStatus(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + +} \ No newline at end of file diff --git a/Processing/Misc/UrbanAutonomous/SimParam.java b/Processing/Misc/UrbanAutonomous/SimParam.java new file mode 100644 index 0000000..f576c38 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/SimParam.java @@ -0,0 +1,66 @@ + +public class SimParam { + //Vehicle + public int numberOfVehicle; + public int capacityOfVehicle; + //Congestion + public int[] totalCongestionLevel; + public int currentTotalCongestionLevel; + public int vehicleHistorySize; + //Time + public int currentTime; //0-14400 + public int currentTimeZone; + //Demand + public int[] demandSizeArray; + public int currentDemandSize; + public int demandInterval;// unit:min (=#ofstep/10) + public int demandLifetime;// unit:min + public boolean demandSizeCustom; + //Hub + public boolean hubEnable; + public int hubEffectiveLength; + public int hubDedicatedVehicleCapacity; + public int capacityOfPeripheralVehicle; + //Map + public int mapType;// 0:urban,1:Rural,2:custom + + public SimParam() { + hubEnable=true; + demandSizeCustom = false; + mapType = 1; + currentTimeZone = 0; + currentTime = -1; + capacityOfVehicle = 4; + numberOfVehicle = 1; + currentDemandSize = 0; + demandInterval = 10; + vehicleHistorySize = 30; + currentTotalCongestionLevel = 0; + totalCongestionLevel = new int[720]; + demandSizeArray = new int[] { 5, 5, 5, 5, 5, 10, 20, 50, 50, 20, 10, 10, 20, 10, 20, 30, 50, 50, 50, 30, 20, 10, 10, 10 }; + demandLifetime = 10; + hubEffectiveLength = 15; + hubDedicatedVehicleCapacity = 50; + capacityOfPeripheralVehicle=10; + } + + public void init(){ + UrbanAutonomous.vehicleStack.vehicleGen(); + UrbanAutonomous.demandStack.init(); + UrbanAutonomous.hubStack.init(); + currentTime=0; + } + + public void update() { + currentTime++; + if (currentTime >= 14400) + currentTime = 0; + // unallocatedDemandSizeHistory + if (currentTime % 20 == 0) + UrbanAutonomous.demandStack.unallocatedDemandSizeHistory[currentTime / 20] = UrbanAutonomous.demandStack.unallocatedDepartureList.size(); + currentTimeZone = currentTime / 600;// 600step = 1hour + if (!demandSizeCustom) + currentDemandSize = demandSizeArray[currentTimeZone]; + } + +} diff --git a/Processing/Misc/UrbanAutonomous/Status.java b/Processing/Misc/UrbanAutonomous/Status.java new file mode 100644 index 0000000..f7ead1a --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Status.java @@ -0,0 +1,16 @@ + +public enum Status { + CONFIG(1), + RUN(2), + STOP(3); + + private final int id; + + private Status(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + } diff --git a/Processing/Misc/UrbanAutonomous/Tile.java b/Processing/Misc/UrbanAutonomous/Tile.java new file mode 100644 index 0000000..38eef2e --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Tile.java @@ -0,0 +1,11 @@ + +public class Tile { + public float [] departureProbabilityArray; + public float [] arrivalProbabilityArray; + public TileType tileType; + Tile(float [] departure, float [] arrival,TileType _tileType) { + departureProbabilityArray = departure; + arrivalProbabilityArray = arrival; + tileType=_tileType; + } + } \ No newline at end of file diff --git a/Processing/Misc/UrbanAutonomous/TileType.java b/Processing/Misc/UrbanAutonomous/TileType.java new file mode 100644 index 0000000..8972afd --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/TileType.java @@ -0,0 +1,19 @@ + +public enum TileType { + HW(1), + LW(2), + HR(3), + LR(4), + ROAD(5), + INTERSECTION(6); + + private final int id; + + private TileType(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + } \ No newline at end of file diff --git a/Processing/Misc/UrbanAutonomous/UDP.java b/Processing/Misc/UrbanAutonomous/UDP.java new file mode 100644 index 0000000..5a68c9d --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/UDP.java @@ -0,0 +1,881 @@ +/** + * (./) UDP.java v0.2 06/01/26 + * (by) Douglas Edric Stanley & Cousot Stéphane + * (cc) some right reserved + * + * Part of the Processing Libraries project, for the Atelier Hypermedia, art + * school of Aix-en-Provence, and for the Processing community of course. + * - require Java version 1.4 or later - + * -> http://hypermedia.loeil.org/processing/ + * -> http://www.processing.org/ + * + * THIS LIBRARY IS RELEASED UNDER A CREATIVE COMMONS LICENSE BY. + * -> http://creativecommons.org/licenses/by/2.5/ + */ + + + +import java.net.*; +import java.io.*; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; +import java.util.Date; +import java.text.SimpleDateFormat; + +import processing.core.*; + +/** + * Create and manage unicast, broadcast or multicast socket to send and receive + * datagram packets over the network. + *

+ * The socket type is define at his initialyzation by the passed IP address. + * To reach a host (interface) within a network, you need to specified the kind + * of address: + *

    + *
  • An unicast address refer to a unique host within a subnet.
  • + *
  • A broadcast address allow you to call every host within a subnet. + *
  • + *
  • A multicast address allows to call a specific group of hosts within + * the subnet. A multicast group is specified by a IP address in the range + * 224.0.0.0 (reserved, should not be used) to + * 239.255.255.255 inclusive, and by a standard UDP port number. + *
    + * notes: the complete reference of special multicast addresses should be + * found in the latest available version of the "Assigned Numbers RFC" + *
  • + *
+ * A packet sent to a unicast or broadcast address is only delivered to the + * host identified by that address. To the contrary, when packet is send to a + * multicast address, all interfaces identified by that address receive the data + * . + *

+ * To perform actions on receive and/or timeout events, you must implement + * specific method(s) in your code. This method will be automatically called + * when the socket receive incoming data or a timeout event. By default, the + * "receive handler" is typically receive(byte[] data) but you can + * retrieve more informations about the datagram packet, see + * {@link UDP#setReceiveHandler(String name)} for more informations. In the same + * logic, the default "timeout handler" is explicitly timeout(). + *

+ * + * note: currently applets are not allowed to use multicast sockets + * + * + * @version 0.1 + * @author Cousot Stéphane - stef@ubaa.net + * @author Douglas Edric Stanley - http://www.abstractmachine.net/ + */ +public class UDP implements Runnable { + + + // the current unicast/multicast datagram socket + DatagramSocket ucSocket = null; + MulticastSocket mcSocket = null; + + boolean log = false; // enable/disable output log + boolean listen = false; // true, if the socket waits for packets + int timeout = 0; // reception timeout > 0=infinite timeout + int size = 65507; // the socket buffer size in bytes + InetAddress group = null; // the multicast's group address to join + + // the reception Thread > wait automatically for incoming datagram packets + // without blocking the current Thread. + Thread thread = null; + + // the parent object (could be an application, a componant, etc...) + Object owner = null; + + // the default "receive handler" and "timeout handler" methods name. + // these methods must be implemented (by the owner) to be called + // automatically when the socket receive incoming datas or a timeout event + String receiveHandler = "receive"; + String timeoutHandler = "timeout"; + + // the log "header" to be set for debugging. Because log is disable by + // default, this value is automatically replaced by the principal socket + // settings when a new instance of UDP is created. + String header = ""; + + ///////////////////////////////// fields /////////////////////////////// + + /** + * The default socket buffer length in bytes. + */ + public static final int BUFFER_SIZE = 65507; + + + ///////////////////////////// constructors //////////////////////////// + + /** + * Create a new datagram socket and binds it to an available port and every + * address on the local host machine. + * + * @param owner the target object to be call by the receive handler + */ + public UDP( Object owner ) { + this( owner, 0 ); + } + + /** + * Create a new datagram socket and binds it to the specified port on the + * local host machine. + *

+ * Pass zero as port number, will let the system choose an + * available port. + * + * @param owner the target object to be call by the receive handler + * @param port local port to bind + */ + public UDP( Object owner, int port ) { + this( owner, port, null ); + } + + /** + * Create a new datagram socket and binds it to the specified port on the + * specified local address or multicast group address. + *

+ * Pass zero as port number, will let the system choose an + * available port. The absence of an address, explicitly null + * as IP address will assign the socket to the Unspecified Address (Also + * called anylocal or wildcard address). To set up the socket as multicast + * socket, pass the group address to be joined. If this address is not a + * valid multicast address, a broadcast socket will be created by default. + * + * @param owner the target object to be call by the receive handler + * @param port local port to bind + * @param ip host address or group address + */ + public UDP( Object owner, int port, String ip ) { + + this.owner = owner; + + // register this object to the PApplet, + // if it's used with Processing + try { + if ( owner instanceof PApplet ) ((PApplet)owner).registerMethod("dispose", this); + } + catch( NoClassDefFoundError e ) {;} + + // open a new socket to the specified port/address + // and join the group if the multicast socket is required + try { + + InetAddress addr = InetAddress.getByName(ip); + InetAddress host = (ip==null) ? (InetAddress)null: addr; + + if ( !addr.isMulticastAddress() ) { + ucSocket = new DatagramSocket( port, host ); // as broadcast + log( "bound socket to host:"+address()+", port: "+port() ); + } + else { + mcSocket = new MulticastSocket( port ); // as multicast + mcSocket.joinGroup( addr ); + this.group = addr; + log( "bound multicast socket to host:"+address()+ + ", port: "+port()+", group:"+group ); + } + } + catch( IOException e ) { + // caught SocketException & UnknownHostException + error( "opening socket failed!"+ + "\n\t> address:"+ip+", port:"+port+" [group:"+group+"]"+ + "\n\t> "+e.getMessage() + ); + } + catch( IllegalArgumentException e ) { + error( "opening socket failed!"+ + "\n\t> bad arguments: "+e.getMessage() + ); + } + catch( SecurityException e ) { + error( (isMulticast()?"could not joined the group":"warning")+ + "\n\t> "+e.getMessage() ); + } + + } + + /////////////////////////////// methods /////////////////////////////// + + /** + * Close the socket. This method is automatically called by Processing when + * the PApplet shuts down. + * + * @see UDP#close() + */ + public void dispose() { + close(); + } + + /** + * Close the actuel datagram socket and all associate resources. + */ + public void close() { + if ( isClosed() ) return; + + int port = port(); + String ip = address(); + + // stop listening if needed + //listen( false ); + + // close the socket + try { + if ( isMulticast() ) { + if ( group!=null ) { + mcSocket.leaveGroup( group ); + log( "leave group < address:"+group+" >" ); + } + mcSocket.close(); + mcSocket = null; + } + else { + ucSocket.close(); + ucSocket = null; + } + } + catch( IOException e ) { + error( "Error while closing the socket!\n\t> " + e.getMessage() ); + } + catch( SecurityException e ) {;} + finally { + log( "close socket < port:"+port+", address:"+ip+" >\n" ); + } + } + + /** + * Returns whether the current socket is closed or not. + * @return boolean + **/ + public boolean isClosed() { + if ( isMulticast() ) return mcSocket==null ? true : mcSocket.isClosed(); + return ucSocket==null ? true : ucSocket.isClosed(); + } + + /** + * Return the actual socket's local port, or -1 if the socket is closed. + * @return int + */ + public int port() { + if ( isClosed() ) return -1; + return isMulticast()? mcSocket.getLocalPort() : ucSocket.getLocalPort(); + } + + /** + * Return the actual socket's local address, or null if the + * address correspond to any local address. + * + * @return String + */ + public String address() { + if ( isClosed() ) return null; + + InetAddress laddr = isMulticast() ? mcSocket.getLocalAddress(): + ucSocket.getLocalAddress(); + return laddr.isAnyLocalAddress() ? null : laddr.getHostAddress(); + } + + /** + * Send message to the current socket. Explicitly, send message to the + * multicast group/port or to itself. + * + * @param message the message to be send + * + * @see UDP#send(String message, String ip) + * @see UDP#send(String message, String ip, int port) + * + * @return boolean + */ + public boolean send( String message ) { + return send( message.getBytes() ); + } + + /** + * Send data to the current socket. Explicitly, send data to the multicast + * group/port or to itself. + * + * @param buffer data to be send + * + * @see UDP#send(byte[] data, String ip) + * @see UDP#send(byte[] data, String ip, int port) + * + * @return boolean + */ + public boolean send( byte[] buffer ) { + // probably if the group could not be joined for a security reason + if ( isMulticast() && group==null ) return false; + + String ip = isMulticast() ? group.getHostAddress() : address(); + return send( buffer, ip, port() ); + } + + /** + * Send message to the requested IP address, to the current socket port. + * + * @param message the message to be send + * @param ip the destination host's IP address + * + * @see UDP#send(String message) + * @see UDP#send(String message, String ip, int port) + * + * @return boolean + */ + public boolean send( String message, String ip ) { + return send( message.getBytes(), ip ); + } + + /** + * Send data to the requested IP address, to the current socket port. + * + * @param buffer data to be send + * @param ip the destination host's IP address + * + * @see UDP#send(byte[] buffer) + * @see UDP#send(byte[] buffer, String ip, int port) + * + * @return boolean + */ + public boolean send( byte[] buffer, String ip ) { + return send( buffer, ip, port() ); + } + + /** + * Send message to the requested IP address and port. + *

+ * A null IP address will assign the packet address to the + * local host. Use this method to send message to another application by + * passing null as the destination address. + * + * @param message the message to be send + * @param ip the destination host's IP address + * @param port the destination host's port + * + * @see UDP#send(String message) + * @see UDP#send(String message, String ip) + * + * @return boolean + */ + public boolean send( String message, String ip, int port ) { + return send( message.getBytes(), ip, port ); + } + + /** + * Send data to the requested IP address and port. + *

+ * A null IP address will assign the packet address to the + * local host. Use this method to send data to another application by + * passing null as the destination address. + * + * @param buffer data to be send + * @param ip the destination host's IP address + * @param port the destination host's port + * + * @see UDP#send(byte[] buffer, String ip) + * @see UDP#send(byte[] buffer, String ip, int port) + * + * @return boolean + */ + public boolean send( byte[] buffer, String ip, int port ) { + + boolean success = false; + DatagramPacket pa = null; + + try { + + pa = new DatagramPacket( buffer, buffer.length, InetAddress.getByName(ip), port ); + + // send + if ( isMulticast() ) mcSocket.send( pa ); + else ucSocket.send( pa ); + + success = true; + log( "send packet -> address:"+pa.getAddress()+ + ", port:"+ pa.getPort() + + ", length: "+ pa.getLength() + ); + } + catch( IOException e ) { + error( "could not send message!"+ + "\t\n> port:"+port+ + ", ip:"+ip+ + ", buffer size: "+size+ + ", packet length: "+pa.getLength()+ + "\t\n> "+e.getMessage() + ); + } + finally{ return success; } + } + + /** + * Set the maximum size of the packet that can be sent or receive on the + * current socket. This value must be greater than 0, otherwise the buffer + * size is set to the his default value. + *

+ * return true if the new buffer value have been correctly set, + * false otherwise. + *

+ * note : this method has no effect if the socket is listening. To define + * a new buffer size, call this method before implementing a new buffer in + * memory. Explicitly before calling a receive methods. + * + * @param size the buffer size value in bytes or n<=0 + * @return boolean + * @see UDP#getBuffer() + */ + public boolean setBuffer( int size ) { + boolean done = false; + + // do nothing if listening (block the thread otherwise) + if ( isListening() ) return done; + + try { + // set the SO_SNDBUF and SO_RCVBUF value + if ( isMulticast() ) { + mcSocket.setSendBufferSize( size>0 ? size : BUFFER_SIZE ); + mcSocket.setReceiveBufferSize( size>0 ? size : BUFFER_SIZE ); + } + else { + ucSocket.setSendBufferSize( size>0 ? size : BUFFER_SIZE ); + ucSocket.setReceiveBufferSize( size>0 ? size : BUFFER_SIZE ); + } + // set the current buffer size + this.size = size>0 ? size : BUFFER_SIZE; + done = true; + } + catch( SocketException e ) { + error( "could not set the buffer!"+ + "\n> "+e.getMessage() + ); + } + finally{ return done; } + } + + /** + * Return the actual socket buffer length + * @return int + * @see UDP#setBuffer(int size) + */ + public int getBuffer() { + return size; + } + + /** + * Returns whether the socket wait for incoming data or not. + * @return boolean + */ + public boolean isListening() { + return listen; + } + + + /** + * Start/stop waiting constantly for incoming data. + * + * @param on the required listening status. + * + * @see UDP#listen() + * @see UDP#listen(int millis) + * @see UDP#setReceiveHandler(String name) + */ + public void listen( boolean on ) { + + listen = on; + timeout = 0; + + // start + if ( on && thread==null && !isClosed() ) { + thread = new Thread( this ); + thread.start(); + } + // stop + if ( !on && thread!=null ) { + send( new byte[0] ); // unblock the thread with a dummy message + thread.interrupt(); + thread = null; + } + } + + /** + * Set the socket reception timeout and wait one time for incoming data. + * If the timeout period occured, the owner timeout() method is + * automatically called. + * + * @param millis the required timeout value in milliseconds. + * + * @see UDP#listen() + * @see UDP#listen(boolean on) + */ + public void listen( int millis ) { + if ( isClosed() ) return; + + listen = true; + timeout = millis; + + // unblock the thread with a dummy message, if already listening + if ( thread!=null ) send( new byte[0] ); + if ( thread==null ) { + thread = new Thread( this ); + thread.start(); + } + } + + /** + * Wait for incoming data, and call the appropriate handlers each time a + * message is received. If the owner's class own the appropriate target + * handler, this method send it the receive message as byte[], the sender + * IP address and port. + *

+ * This method force the current Thread to be ceased for a + * temporary period. If you prefer listening without blocking the current + * thread, use the {@link UDP#listen(int millis)} or + * {@link UDP#listen(boolean on)} method instead. + * + * @see UDP#listen() + * @see UDP#listen(boolean on) + * @see UDP#setReceiveHandler(String name) + */ + public void listen() { + try { + + byte[] buffer = new byte[ size ]; + DatagramPacket pa = new DatagramPacket(buffer,buffer.length); + + // wait + if ( isMulticast() ) { + mcSocket.setSoTimeout( timeout ); + mcSocket.receive( pa ); // <-- block the Thread + } + else { + ucSocket.setSoTimeout( timeout ); + ucSocket.receive( pa ); // <-- block + } + + + log( "receive packet <- from "+pa.getAddress()+ + ", port:"+ pa.getPort() + + ", length: "+ pa.getLength() + ); + + + // get the required data only (not all the buffer) + // and send it to the appropriate target handler, if needed + if ( pa.getLength()!=0 ) { + + byte[] data = new byte[ pa.getLength() ]; + System.arraycopy( pa.getData(), 0, data, 0, data.length ); + + try { + // try with one argument first > byte[] + callReceiveHandler( data ); + } + catch( NoSuchMethodException e ) { + // try with many argument > byte[], String, int + callReceiveHandler( data, + pa.getAddress().getHostAddress(), + pa.getPort() + ); + } + } + } + catch( NullPointerException e ) { + // *socket=null from the close() method; + listen = false; + thread = null; + } + catch( IOException e ) { + + listen = false; + thread = null; + + if ( e instanceof SocketTimeoutException ) callTimeoutHandler(); + else { + // do not print "Socket closed" error + // if the method close() has been called + if ( ucSocket!=null && mcSocket!=null ) + error( "listen failed!\n\t> "+e.getMessage() ); + } + } + } + + /** + * Wait for incoming datagram packets. This method is called automaticlly, + * you do not need to call it. + */ + public void run() { + while ( listen ) listen(); + } + + /** + * Register the target's receive handler. + *

+ * By default, this method name is "receive" with one argument + * representing the received data as byte[]. For more + * flexibility, you can change this method with another useful method by + * passing his name. You could get more informations by implementing two + * additional arguments, a String representing the sender IP + * address and a int representing the sender port : + *

+	 * void myCustomReceiveHandler(byte[] message, String ip, int port) {
+	 *	// do something here...
+	 * }
+	 * 
+ * + * @param name the receive handler name + * @see UDP#setTimeoutHandler(String name) + */ + public void setReceiveHandler( String name ) { + this.receiveHandler = name; + } + + /** + * Call the default receive target handler method. + * + * @param data the data to be passed + * @throws NoSuchMethodException + */ + private void callReceiveHandler( byte[] data ) + throws NoSuchMethodException { + + Class[] types; // arguments class types + Object[] values; // arguments values + Method method; + + try { + types = new Class[]{ data.getClass() }; + values = new Object[]{ data }; + method = owner.getClass().getMethod(receiveHandler, types); + method.invoke( owner, values ); + } + catch( IllegalAccessException e ) { error(e.getMessage()); } + catch( InvocationTargetException e ) { e.printStackTrace(); } + } + + /** + * Call the receive target handler implemented with the optional arguments. + * + * @param data the data to be passed + * @param ip the IP adress to be passed + * @param port the port number to be passed + */ + private void callReceiveHandler( byte[] data, String ip, int port ) { + + Class[] types; // arguments class types + Object[] values; // arguments values + Method method; + + try { + types = new Class[]{ data.getClass(), + ip.getClass(), + Integer.TYPE + }; + values = new Object[]{ data, + ip, + new Integer(port) + }; + method = owner.getClass().getMethod(receiveHandler, types); + method.invoke( owner, values ); + } + catch( NoSuchMethodException e ) {;} + catch( IllegalAccessException e ) { error(e.getMessage()); } + catch( InvocationTargetException e ) { e.printStackTrace(); } + } + + /** + * Register the target's timeout handler. By default, this method name is + * "timeout" with no argument. + * + * @param name the timeout handler name + * @see UDP#setReceiveHandler(String name) + */ + public void setTimeoutHandler( String name ) { + this.timeoutHandler = name; + } + + /** + * Call the timeout target method when the socket received a timeout event. + * The method name to be implemented in your code is timeout(). + */ + private void callTimeoutHandler() { + try { + Method m = owner.getClass().getDeclaredMethod(timeoutHandler, null); + m.invoke( owner, null ); + } + catch( NoSuchMethodException e ) {;} + catch( IllegalAccessException e ) { error(e.getMessage()); } + catch( InvocationTargetException e ) { e.printStackTrace(); } + } + + /** + * Returns whether the opened datagram socket is a multicast socket or not. + * @return boolean + */ + public boolean isMulticast() { + return ( mcSocket!=null ); + } + + /** + * Returns whether the multicast socket is joined to a group address. + * @return boolean + */ + public boolean isJoined() { + return ( group!=null ); + } + + /** + * Returns whether the opened socket send broadcast message socket or not. + * @return boolean + */ + public boolean isBroadcast() { + boolean result = false; + try { + result = (ucSocket==null) ? false : ucSocket.getBroadcast(); + } + catch( SocketException e ) { error( e.getMessage() ); } + finally { return result; } + } + + /** + * Enables or disables the ability of the current process to send broadcast + * messages. + * @return boolean + */ + public boolean broadcast( boolean on ) { + boolean done = false; + try { + if ( ucSocket!=null ) { + ucSocket.setBroadcast( on ); + done = isBroadcast(); + } + } + catch( SocketException e ) { error( e.getMessage() ); } + finally { return done; } + } + + /** + * Enable or disable the multicast socket loopback mode. By default loopback + * is enable. + *
+ * Setting loopback to false means this multicast socket does not want to + * receive the data that it sends to the multicast group. + * + * @param on local loopback of multicast datagrams + */ + public void loopback( boolean on ) { + try { + if ( isMulticast() ) mcSocket.setLoopbackMode( !on ); + } + catch( SocketException e ) { + error( "could not set the loopback mode!\n\t>"+e.getMessage() ); + } + } + + /** + * Returns whether the multicast socket loopback mode is enable or not. + * @return boolean + */ + public boolean isLoopback() { + try { + if ( isMulticast() && !isClosed() ) + return !mcSocket.getLoopbackMode(); + } + catch( SocketException e ) { + error( "could not get the loopback mode!\n\t> "+e.getMessage() ); + } + return false; + } + + /** + * Control the life-time of a datagram in the network for multicast packets + * in order to indicates the scope of the multicasts (ie how far the packet + * will travel). + *

+ * The TTL value must be in range of 0 to 255 inclusive. The larger the + * number, the farther the multicast packets will travel (by convention): + *

+	 * 0	-> restricted to the same host
+	 * 1	-> restricted to the same subnet (default)
+	 * <32	-> restricted to the same site
+	 * <64	-> restricted to the same region
+	 * <128	-> restricted to the same continent
+	 * <255	-> no restriction
+	 * 
+ * The default value is 1, meaning that the datagram will not go beyond the + * local subnet. + *

+ * return true if no error occured. + * + * @param ttl the "Time to Live" value + * @return boolean + * @see UDP#getTimeToLive() + */ + public boolean setTimeToLive( int ttl ) { + try { + if ( isMulticast() && !isClosed() ) mcSocket.setTimeToLive( ttl ); + return true; + } + catch( IOException e ) { + error( "setting the default \"Time to Live\" value failed!"+ + "\n\t> "+e.getMessage() ); + } + catch( IllegalArgumentException e ) { + error( "\"Time to Live\" value must be in the range of 0-255" ); + } + return false; + } + + /** + * Return the "Time to Live" value or -1 if an error occurred (or if + * the current socket is not a multicast socket). + * + * @return int + * @see UDP#setTimeToLive(int ttl) + */ + public int getTimeToLive() { + try { + if ( isMulticast() && !isClosed() ) + return mcSocket.getTimeToLive(); + } + catch( IOException e ) { + error( "could not retrieve the current time-to-live value!"+ + "\n\t> "+ e.getMessage() ); + } + return -1; + } + + /** + * Enable or disable output process log. + */ + public void log( boolean on ) { + log = on; + } + + /** + * Output message to the standard output stream. + * @param out the output message + */ + private void log( String out ) { + + Date date = new Date(); + + // define the "header" to retrieve at least the principal socket + // informations : the host/port where the socket is bound. + if ( !log && header.equals("") ) + header = "-- UDP session started at "+date+" --\n-- "+out+" --\n"; + + // print out + if ( log ) { + + String pattern = "yy-MM-dd HH:mm:ss.S Z"; + String sdf = new SimpleDateFormat(pattern).format( date ); + System.out.println( header+"["+sdf+"] "+out ); + header = ""; // forget header + } + } + + /** + * Output error messages to the standard error stream. + * @param err the error string + */ + private void error( String err ) { + System.err.println( err ); + } +} diff --git a/Processing/Misc/UrbanAutonomous/UDPSocket.java b/Processing/Misc/UrbanAutonomous/UDPSocket.java new file mode 100644 index 0000000..d6da939 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/UDPSocket.java @@ -0,0 +1,201 @@ + +import processing.core.PApplet; +import processing.data.JSONObject; + +public class UDPSocket { + UDP udp; + PApplet p; + + public UDPSocket(PApplet _p) { + p = _p; + udp = new UDP(this, 5500); + udp.log(true); // <-- printout the connection activity + udp.listen(true); + } + + public void receive(byte[] data, String ip, int port) { // <-- extended + String dataStr = new String(data); + dataStr = new String(p.trim(dataStr)); + p.println("receive: \"" + dataStr + "\" from " + ip + " on port " + port); + String[] list = new String[] { dataStr }; + p.saveStrings("json.txt", list); + JSONObject json = p.loadJSONObject("json.txt"); + + mapUpdate(json); + vehicleUpdate(json); + demandUpdate(json); + hubUpdate(json); + demandGenerationUpdate(json); + resetUpdate(json); + timeUpdate(json); + // UrbanAutonomous.simParam.numberOfVehicle = p.parseInt(dataStr); + // UrbanAutonomous.vehicleStack.vehicleGen(); + + } + + void timeUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("time")) { + tmpStr = json.getString("time"); + UrbanAutonomous.simParam.currentTime = Integer.parseInt(tmpStr); + } + } + void resetUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("reset")) { + tmpStr = json.getString("reset"); + if(p.parseBoolean(tmpStr)) + UrbanAutonomous.simParam.init(); + } + } + void hubUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("hubDedicatedVehicleCapacity")) { + tmpStr = json.getString("hubDedicatedVehicleCapacity"); + UrbanAutonomous.simParam.hubDedicatedVehicleCapacity= Integer.parseInt(tmpStr); + UrbanAutonomous.hubStack.init(); + } else if (!json.isNull("capacityOfPeripheralVehicle")) { + tmpStr = json.getString("capacityOfPeripheralVehicle"); + UrbanAutonomous.simParam.capacityOfPeripheralVehicle = Integer.parseInt(tmpStr); + UrbanAutonomous.hubStack.init(); + } else if (!json.isNull("hubA")) { + tmpStr = json.getString("hubA"); + String[] nums = p.split(tmpStr, ','); + UrbanAutonomous.hubStack.ax = Integer.parseInt(nums[0])*5+2; + UrbanAutonomous.hubStack.ay = Integer.parseInt(nums[1])*5+2; + UrbanAutonomous.hubStack.init(); + } else if (!json.isNull("hubB")) { + tmpStr = json.getString("hubB"); + String[] nums = p.split(tmpStr, ','); + UrbanAutonomous.hubStack.bx = Integer.parseInt(nums[0])*5+2; + UrbanAutonomous.hubStack.by = Integer.parseInt(nums[1])*5+2; + UrbanAutonomous.hubStack.init(); + } + } + void demandUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("demandInterval")) { + tmpStr = json.getString("demandInterval"); + UrbanAutonomous.simParam.demandInterval = Integer.parseInt(tmpStr); + } else if (!json.isNull("demandLifetime")) { + tmpStr = json.getString("demandLifetime"); + UrbanAutonomous.simParam.demandLifetime= Integer.parseInt(tmpStr); + } else if (!json.isNull("currentDemandSize")) { + tmpStr = json.getString("currentDemandSize"); + UrbanAutonomous.simParam.currentDemandSize= Integer.parseInt(tmpStr); + } else if (!json.isNull("demandSizeCustom")) { + tmpStr = json.getString("demandSizeCustom"); + UrbanAutonomous.simParam.demandSizeCustom= p.parseBoolean(tmpStr); + } + } + void vehicleUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("fleetSize")) { + tmpStr = json.getString("fleetSize"); + UrbanAutonomous.simParam.numberOfVehicle = Integer.parseInt(tmpStr); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (!json.isNull("vehicleCapacity")) { + tmpStr = json.getString("vehicleCapacity"); + UrbanAutonomous.simParam.capacityOfVehicle = Integer.parseInt(tmpStr); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (!json.isNull("vehicleHistorySize")) { + tmpStr = json.getString("vehicleHistorySize"); + UrbanAutonomous.simParam.vehicleHistorySize = Integer.parseInt(tmpStr); + UrbanAutonomous.vehicleStack.vehicleGen(); + } + } + + void mapUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("mapType")) { + tmpStr = json.getString("mapType"); + UrbanAutonomous.simParam.mapType = Integer.parseInt(tmpStr); + if (UrbanAutonomous.simParam.mapType == 0) { + UrbanAutonomous.mapBlockStack.loadUrbanMap(); + } else if (UrbanAutonomous.simParam.mapType == 1) { + UrbanAutonomous.mapBlockStack.loadRuralMap(); + } else if (UrbanAutonomous.simParam.mapType == 2) { + UrbanAutonomous.mapBlockStack.noneMapGen(); + } + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of // // // // mapblock to demand // // // // generation + UrbanAutonomous.mapBlockStack.mapImgCreation(); // map image creation for // // // // display + } + } + + void demandGenerationUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("hwArrival")) { + tmpStr = json.getString("hwArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hwTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lwArrival")) { + tmpStr = json.getString("lwArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lwTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("hrArrival")) { + tmpStr = json.getString("hrArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hrTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lrArrival")) { + tmpStr = json.getString("lrArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lrTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("hwDeparture")) { + tmpStr = json.getString("hwDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hwTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lwDeparture")) { + tmpStr = json.getString("lwDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lwTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("hrDeparture")) { + tmpStr = json.getString("hrDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hrTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lrDeparture")) { + tmpStr = json.getString("lrDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lrTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("totalDemand")) { + tmpStr = json.getString("totalDemand"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.simParam.demandSizeArray[i] = Integer.parseInt(nums[i]); + } + } + } + +} diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde index 4bc8957..2b454b8 100644 --- a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -1,7 +1,249 @@ -void setup() { - size(400, 400); -} +//laptop resolution 1920 x 1080 +//16blocks x 16blocks +//1block = 5tiles x 5tiles +//1tile = 10pixels x 10pixels +//Simulation Window: 800 x 800pixels +//Operation Window: x pixels + +//vehicle speed 20km/h 20,000m/60min 2000m/6min 333m/min 33.3m/0.1min +//1block 133.3m -> 1tile 33.3m -> 2.128km-square +//1tile/0.1min +//1 simulation sec = 0.1min -> 10sec = 1min, 600sec(10min)=60min(1h) 240min(4h)=24h +//0.1 simulation sec = 0.1min ->1min=1h 24min = 24h +//1step =0.1min , 10step 1min , 600step 1h, 14400step =24h +//start time 00:00~24:00, 0:00->0step[0.1min](currentTime), 24:00-> 14400step[0.1min](currentTime) + +//View +//AllocatedDepartureDemand:pink +//unallocatedDepartureDemand:red +//AllocatedArrivalDemand:light blue +//unallocatedArrivalDemand:blue + + public static DragStatus dragStatus; + public static OperationWindow opw; + public static Status status; + public static PImage hwImg, lwImg, hrImg, lrImg, roadImg, intersectionImg, noneImg, backgroundImg, congestionImg; + public static Tile[][] simCoordinate; + public static int vehicleColor; + public static int allocatedDepartureColor; + public static int unallocatedDepartureColor; + public static int allocatedArrivalColor; + public static int unallocatedArrivalColor; + public static int hubColor; + public static int hubVehicleColor; + public static int hubPeripheralVehicleColor; + public static int hubEffectiveLengthColor; + public static PGraphics legendPg, demandPg; + public static int brushNumber; + + // Temporary + public static MapBlock mapBlock; + public static BasicTile basicTile; + public static MapBlockBrushs mapBlockBrushs; + public static MapBlockStack mapBlockStack; + public static Disp disp; + public static SimParam simParam; + public static DemandStack demandStack; + public static VehicleStack vehicleStack; + // public static OperationDisp operationDisp; + public static FileControl fileControl; + // public static Hub hubA, hubB; + public static HubStack hubStack; + // public static HubVehicle hubVehicle; + public static UDPSocket udpSocket; + + + + public void setup() { + // SimulationWindow + size(800, 800); + + // OperationWindow + new PFrame(1000, 0, 1900, 875); + + // Status + status = Status.CONFIG; + dragStatus = DragStatus.NORMAL; + + // Load Image + loadTileImage(); + backgroundImg = loadImage("operationWindow.jpg"); + + // Legend Symbol + vehicleColor = color(255, 128, 0, 255); + allocatedDepartureColor = color(255, 0, 255, 127); + unallocatedDepartureColor = color(255, 0, 0, 127); + allocatedArrivalColor = color(0, 255, 255, 127); + unallocatedArrivalColor = color(0, 0, 255, 127); + hubColor = color(0, 255, 0, 200); + hubEffectiveLengthColor = color(0, 255, 0, 64); + hubVehicleColor = color(142, 0, 204, 200); + hubPeripheralVehicleColor = color(200, 255, 200, 200); + + // Temporary + udpSocket = new UDPSocket(this); + + hubStack = new HubStack(this); + + brushNumber = 0; + basicTile = new BasicTile(); + mapBlockBrushs = new MapBlockBrushs(this, 4); + mapBlockStack = new MapBlockStack(this); + disp = new Disp(this); + simParam = new SimParam(); + demandStack = new DemandStack(); + simCoordinate = new Tile[80][80]; + vehicleStack = new VehicleStack(); + + mapBlockStack.loadRuralMap(); + + mapBlockStack.updateCoordinate();// reflect change of mapblock to demand + // generation + mapBlockStack.mapImgCreation();// map image creation for display + mapBlockBrushs.brushImgCreation();// brush image creation for operation + // display + legendSymbolImgCreation(); // create legend symbol image for operation + // display + demandGenerationImgCreation(); // create demand image for operation + // display + fileControl = new FileControl(); + } + + public void draw() { + simParam.update(); + + demandStack.demandLifetimeControl(); + demandStack.demandGen(simParam.currentDemandSize, simParam.demandInterval * 10);// numberOfDemand,DemandGenerationInterval(steps) + demandStack.demandAllocation(); + demandStack.demandHubAllocation(); + vehicleStack.allVehicleMovement(); + hubStack.hubVehicleA.move(); + hubStack.hubPeripheralVehicleA.move(); + hubStack.hubPeripheralVehicleB.move(); + + // Display + disp.show(); + + } + + void loadTileImage() { + hwImg = loadImage("hwTile.png"); + lwImg = loadImage("lwTile.png"); + hrImg = loadImage("hrTile.png"); + lrImg = loadImage("lrTile.png"); + roadImg = loadImage("roadTile.png"); + intersectionImg = loadImage("intersectionTile.png"); + noneImg = loadImage("noneTile.png"); + congestionImg = loadImage("congestion.png"); + } + + public void mousePressed() { + int x = (int) (mouseX / 50); + int y = (int) (mouseY / 50); + + if (simParam.mapType == 2) { + mapBlockStack.mapBlockArray[x][y] = mapBlockBrushs.selectedBrush; + fileControl.customMap[16 * y + x] = brushNumber; + mapBlockStack.updateCoordinate();// reflect change of mapblock to // + // // demand + // generation + mapBlockStack.mapImgCreation();// map image creation for display + } + // Hub Relocation + hubRelocation(); + } + + void hubRelocation() { + if (dist(hubStack.hubA.x * 10, hubStack.hubA.y * 10, mouseX, mouseY) < 20) { + dragStatus = DragStatus.HUBA; + } else if (dist(hubStack.hubB.x * 10, hubStack.hubB.y * 10, mouseX, mouseY) < 20) { + dragStatus = DragStatus.HUBB; + } + } + + public void mouseReleased() { + if (dragStatus == DragStatus.HUBA) { + hubStack.ax = modifyHubPoint(mouseX); + hubStack.ay = modifyHubPoint(mouseY); + hubStack.init(); + } else if (dragStatus == DragStatus.HUBB) { + hubStack.bx = modifyHubPoint(mouseX); + hubStack.by = modifyHubPoint(mouseY); + hubStack.init(); + } + dragStatus = DragStatus.NORMAL; + } + + int modifyHubPoint(int x) { + int result = 0; + result = x / 10 / 5 * 5 + 2; + return result; + } + + void legendSymbolImgCreation() { + int offset = 0; + legendPg = createGraphics(20, 180); + legendPg.beginDraw(); + legendPg.background(255); + legendPg.stroke(255); + legendPg.stroke(1); + + // LandUse + legendPg.image(hwImg, offset, 0, 20, 20); + legendPg.image(lwImg, offset, 20, 20, 20); + legendPg.image(hrImg, offset, 40, 20, 20); + legendPg.image(lrImg, offset, 60, 20, 20); + + legendPg.ellipseMode(CENTER); + // allocated departure + legendPg.fill(allocatedDepartureColor); + legendPg.ellipse(offset + 10, 90, 10, 10); + // unallocated departure + legendPg.fill(unallocatedDepartureColor); + legendPg.ellipse(offset + 10, 110, 10, 10); + // allocated arrival + legendPg.fill(allocatedArrivalColor); + legendPg.ellipse(offset + 10, 130, 10, 10); + // unallocated arrival + legendPg.fill(unallocatedArrivalColor); + legendPg.ellipse(offset + 10, 150, 10, 10); + // Vehicle(fleet) + legendPg.fill(vehicleColor); + legendPg.ellipse(offset + 10, 170, 10, 10); + legendPg.endDraw(); + } + + void demandGenerationImgCreation() { + int offset = 150; + demandPg = createGraphics(870, 260); + demandPg.beginDraw(); + // demandPg.background(255); + demandPg.clear(); + demandPg.stroke(255); + demandPg.stroke(1); + demandPg.image(hwImg, 0, 0, 50, 50); + demandPg.image(lwImg, 0, 70, 50, 50); + demandPg.image(hrImg, 0, 140, 50, 50); + demandPg.image(lrImg, 0, 210, 50, 50); + + for (int i = 0; i < 720; i++) { + demandPg.line(offset + i, 20 - (basicTile.hwTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 20); + demandPg.line(offset + i, 50 - (basicTile.hwTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 50); + demandPg.line(offset + i, 90 - (basicTile.lwTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 90); + demandPg.line(offset + i, 120 - (basicTile.lwTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 120); + demandPg.line(offset + i, 160 - (basicTile.hrTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 160); + demandPg.line(offset + i, 190 - (basicTile.hrTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 190); + demandPg.line(offset + i, 230 - (basicTile.lrTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 230); + demandPg.line(offset + i, 260 - (basicTile.lrTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 260); + } + demandPg.endDraw(); + } -void draw() { - background(255); -} diff --git a/Processing/Misc/UrbanAutonomous/Vehicle.java b/Processing/Misc/UrbanAutonomous/Vehicle.java new file mode 100644 index 0000000..e45f7ac --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/Vehicle.java @@ -0,0 +1,141 @@ + +import java.util.ArrayList; + + +import processing.core.PApplet; + +public class Vehicle extends PApplet{ + public int x; + public int y; + public int streetNumber; + public boolean isHorizontalStreet; + public boolean isIntersection; + public ArrayList departureList; + public ArrayList arrivalList; + public ArrayList movingHistoryList; + + Vehicle(int _x, int _y, boolean _isHorizontalStreet, boolean _isIntersection) { + x=_x; + y=_y; + isHorizontalStreet=_isHorizontalStreet; + isIntersection=_isIntersection; + departureList = new ArrayList (); + arrivalList = new ArrayList (); + movingHistoryList = new ArrayList (); + } + + //Parameter Update + void paramUpdate() { + isHorizontalStreet=false; + isIntersection=false; + streetNumber=0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet=true; + streetNumber=((y+5-2)/5)-1; + } else { + streetNumber=((x+5-2)/5)-1; + } + if (isVerticalStreetCheck()&&isHorizontalStreetCheck()) + isIntersection=true; + } + + boolean isHorizontalStreetCheck() { + boolean result=false; + if ((y-2+5)%5==0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result=false; + if ((x-2+5)%5==0) + result = true; + return result; + } + + //Vehicle Movement + void move() { + paramUpdate(); + movingHistoryUpdate(); + if (departureList.size()>0 || arrivalList.size()>0) { + if (departureList.size()>0) { + eachMove(departureList); + } else { + eachMove(arrivalList); + } + } + } + + void movingHistoryUpdate() { + Demand tmpVehiclePosition=new Demand(x, y); + if (!(departureList.size()==0&&arrivalList.size()==0)) + movingHistoryList.add(tmpVehiclePosition); + if (departureList.size()==0&&arrivalList.size()==0&&movingHistoryList.size()>0) + movingHistoryList.remove(0); + if (movingHistoryList.size()>=UrbanAutonomous.simParam.vehicleHistorySize) + movingHistoryList.remove(0); + } + + void eachMove(ArrayList tmpList) { + if (isSamePoint(tmpList.get(0))) { + tmpList.remove(0); + } else if (isSameStreet(tmpList.get(0))) { + if (tmpList.get(0).isHorizontalStreet) + x += (tmpList.get(0).x - x)/ abs(tmpList.get(0).x - x) ; + else + y += (tmpList.get(0).y - y)/ abs(tmpList.get(0).y - y) ; + } else { + if (isIntersection) { + if (tmpList.get(0).isHorizontalStreet) + y += (tmpList.get(0).y - y)/ abs(tmpList.get(0).y - y) ; + else + x += (tmpList.get(0).x - x)/ abs(tmpList.get(0).x - x) ; + } else { + if (isHorizontalStreet) { + if (tmpList.get(0).isHorizontalStreet) { + if (x>77) { + x-=1; + } else { + x+=1; + } + } else { + x += (tmpList.get(0).x - x)/ abs(tmpList.get(0).x - x) ; + } + } else { + if (tmpList.get(0).isHorizontalStreet) { + y += (tmpList.get(0).y - y)/ abs(tmpList.get(0).y - y) ; + } else { + if (y>77) { + y-=1; + } else { + y+=1; + } + } + } + } + } + } + + boolean isSameStreet(Demand tmpDemand) { + boolean result=false; + if (tmpDemand.streetNumber==streetNumber && tmpDemand.isHorizontalStreet == isHorizontalStreet) + result=true; + else if (isIntersection) { + if (tmpDemand.isHorizontalStreet) { + if ((((y-2+5)/5)-1)==tmpDemand.streetNumber) + result=true; + } else { + if ((((x-2+5)/5)-1)==tmpDemand.streetNumber) + result=true; + } + } + return result; + } + + boolean isSamePoint(Demand tmpDemand) { + boolean result=false; + if (tmpDemand.x==x && tmpDemand.y == y) + result=true; + return result; + } + } diff --git a/Processing/Misc/UrbanAutonomous/VehicleStack.java b/Processing/Misc/UrbanAutonomous/VehicleStack.java new file mode 100644 index 0000000..2aa1b23 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/VehicleStack.java @@ -0,0 +1,60 @@ + +import java.util.ArrayList; + + +import processing.core.PApplet; + +public class VehicleStack extends PApplet{ + public ArrayList vehicleList; + public boolean isHorizontalStreet; + public VehicleStack() { + vehicleGen(); + isHorizontalStreet =true; + } + public void vehicleGen() { + vehicleList = new ArrayList (); + for (int i=0; if4NtU=qlmzFem6RtIr7}3C{( zJaZG%Q-e|yQz{EjrrH1%sd>6MhE&{23Yj!L{Qz%7!;iR)Y+;s5?@9acR2;l8HSLJJ d4g(__!+am+tM$nzQh+)bJYD@<);T3K0RXarCmR3& literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/hwTile.png b/Processing/Misc/UrbanAutonomous/data/hwTile.png new file mode 100644 index 0000000000000000000000000000000000000000..59793174155c4629cbc608011d999e4fa1d0c0bb GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%sd>6MhE&{23Yj!L{Qz%7!;kbEIctjEtPYwf@u6v<_Sp{m d2nHq|hLum4uf7fpTLjd>;OXk;vd$@?2>=JlDarr< literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/intersectionTile.png b/Processing/Misc/UrbanAutonomous/data/intersectionTile.png new file mode 100644 index 0000000000000000000000000000000000000000..abead636bc9bad032f5f6b5c97c0ba83a0457372 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%iF>*@hE&{2dNcRl=>};7!w0O&p;8J57{pQ-kH-IgW)4)s N;OXk;vd$@?2>^2bAwmEE literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/lrTile.png b/Processing/Misc/UrbanAutonomous/data/lrTile.png new file mode 100644 index 0000000000000000000000000000000000000000..cedeb1aa1633b053cc606ee41e447f4232c3f4e6 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%sd>6MhE&{23Yj!L{Qz%7gGKgErm&rv6ZvOId}vyzeYV3s cf`N&LVMY)0)x%jKjX)g?p00i_>zopr0Hu2-`Tzg` literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/lwTile.png b/Processing/Misc/UrbanAutonomous/data/lwTile.png new file mode 100644 index 0000000000000000000000000000000000000000..89d9383ed125293d252f0b0ce5300c519a35ac9f GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%sd>6MhE&{23Yj!L{Qz%7!;H1R1;Td5FD>)osW^CHYT6Nb d9R@}=hS__VuRebwe+{UE!PC{xWt~$(69C++DA)i1 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/noneTile.png b/Processing/Misc/UrbanAutonomous/data/noneTile.png new file mode 100644 index 0000000000000000000000000000000000000000..009c88541a3c4bd318314a5d2174fa5e7fadd14c GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%DR{a#hE&{2N;tqR(fH&4|Nl3hN=VN9@LF!yB^CyU21W*l XHOvBgU)mJ`)iQXx`njxgN@xNA5$`7M literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/operationWindow.jpg b/Processing/Misc/UrbanAutonomous/data/operationWindow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1140951f00a4fa0bde34a7a34cc8389280a2c098 GIT binary patch literal 151091 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

<@cnz~pshm{x4S26Y#loZiz2@vMWoO@Lc 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 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/roadTile.png b/Processing/Misc/UrbanAutonomous/data/roadTile.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a336f39bc393b6b04745bd0569167a260958b2 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%NqD+AhE&{2vMGMX!<={ENP~D!NM-{AGsD{hOchUUS*n3* O7(8A5T-G@yGywp6$RNl7 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/ruralMap.txt b/Processing/Misc/UrbanAutonomous/ruralMap.txt new file mode 100644 index 0000000..df4d9d4 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/ruralMap.txt @@ -0,0 +1,256 @@ +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +0 +0 +0 +0 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +0 +0 +0 +0 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +0 +0 +0 +0 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +0 +0 +0 +0 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +0 +0 +0 +0 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 diff --git a/Processing/Misc/UrbanAutonomous/urbanMap.txt b/Processing/Misc/UrbanAutonomous/urbanMap.txt new file mode 100644 index 0000000..adcb284 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/urbanMap.txt @@ -0,0 +1,256 @@ +2 +0 +0 +2 +0 +0 +2 +2 +0 +2 +0 +0 +2 +2 +0 +2 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +2 +2 +0 +2 +2 +2 +0 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +0 +0 +2 +2 +0 +0 +2 +0 +2 +2 +0 +0 +0 +0 +2 +2 +2 +2 +0 +0 +2 +2 +0 +2 +2 +2 +2 +0 +2 +2 +0 +0 +0 +2 +2 +2 +2 +0 +2 +2 +0 +2 +0 +2 +0 +0 +2 +2 +2 +2 +0 +2 +0 +2 +0 +2 +0 +2 +2 +0 +0 +2 +2 +0 +0 +2 +2 +0 +2 +0 +2 +0 +2 +2 +0 +0 +2 +2 +0 +2 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +2 +2 +0 +0 +0 +2 +2 +0 +0 +0 +0 +2 +0 +0 +0 +2 +0 +2 +0 +2 +0 +0 +2 +2 +0 +0 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 From a6595d75a648dfbd8256e390cd6ea0abd9e031ea Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Sat, 9 Apr 2016 21:05:56 -0400 Subject: [PATCH 03/14] Commit Barebones --- Processing/Misc/Barebones/Barebones.pde | 40 +++++ Processing/Misc/Barebones/CONTROLS.pde | 10 ++ Processing/Misc/Barebones/PROJECTION.pde | 185 ++++++++++++++++++++ Processing/Misc/Barebones/UDP.pde | 98 +++++++++++ Processing/Misc/Barebones/sketch.properties | 2 + 5 files changed, 335 insertions(+) create mode 100644 Processing/Misc/Barebones/Barebones.pde create mode 100644 Processing/Misc/Barebones/CONTROLS.pde create mode 100644 Processing/Misc/Barebones/PROJECTION.pde create mode 100644 Processing/Misc/Barebones/UDP.pde create mode 100644 Processing/Misc/Barebones/sketch.properties diff --git a/Processing/Misc/Barebones/Barebones.pde b/Processing/Misc/Barebones/Barebones.pde new file mode 100644 index 0000000..30614f7 --- /dev/null +++ b/Processing/Misc/Barebones/Barebones.pde @@ -0,0 +1,40 @@ +int projectorWidth = 1920; +int projectorHeight = 1200; +int projectorOffset = 1842; + +int screenWidth = 1842; +int screenHeight = 1026; + +int displayU = 18; +int displayV = 22; + +int IDMax = 15; + +// Table Canvas Width and Height +int TABLE_IMAGE_HEIGHT = 1000; +int TABLE_IMAGE_WIDTH = 1000; + +// Arrays that holds ID information of rectilinear tile arrangement. +int tablePieceInput[][][] = new int[displayU][displayV][2]; + +void setup() { + size(screenWidth, screenHeight, P3D); + + // Initial Projection-Mapping Canvas + initializeProjection2D(); + + // Allows application to receive information from Colortizer via UDP + initUDP(); + +} + +void draw() { + + background(255); + fill(#FF0000); + rect(0,0,350, 350); + +// Exports table Graphic to Projector + projector = get(0, 0, TABLE_IMAGE_WIDTH, TABLE_IMAGE_HEIGHT); + +} diff --git a/Processing/Misc/Barebones/CONTROLS.pde b/Processing/Misc/Barebones/CONTROLS.pde new file mode 100644 index 0000000..2a98fb7 --- /dev/null +++ b/Processing/Misc/Barebones/CONTROLS.pde @@ -0,0 +1,10 @@ + + +void keyPressed() { + switch(key) { + + case '`': // "Enable Projection (`)" + toggle2DProjection(); + break; + } +} diff --git a/Processing/Misc/Barebones/PROJECTION.pde b/Processing/Misc/Barebones/PROJECTION.pde new file mode 100644 index 0000000..86aceb6 --- /dev/null +++ b/Processing/Misc/Barebones/PROJECTION.pde @@ -0,0 +1,185 @@ +// +// This is a script that allows one to open a new canvas for the purpose +// of simple 2D projection mapping, such as on a flat table surface +// +// Right now, only appears to work in windows... +// +// To use this example in the real world, you need a projector +// and a surface you want to project your Processing sketch onto. +// +// Simply press the 'c' key and drag the corners of the +// CornerPinSurface so that they +// match the physical surface's corners. The result will be an +// undistorted projection, regardless of projector position or +// orientation. +// +// You can also create more than one Surface object, and project +// onto multiple flat surfaces using a single projector. +// +// This extra flexbility can comes at the sacrifice of more or +// less pixel resolution, depending on your projector and how +// many surfaces you want to map. +// + +import javax.swing.JFrame; +import deadpixel.keystone.*; + +// Visualization may show 2D projection visualization, or not +boolean displayProjection2D = false; +//int projectorOffset = screenWidth; + +boolean testProjectorOnMac = false; + +// defines Keystone settings from xml file in parent folder +Keystone ks; + +// defines various drawing surfaces, all pre-calibrated, to project +CornerPinSurface surface; +PGraphics offscreen; +PImage projector; + +// New Application Window Parameters +PFrame proj2D = null; // f defines window to open new applet in +projApplet applet; // applet acts as new set of setup() and draw() functions that operate in parallel + +// Run Anything Needed to have Projection mapping work +void initializeProjection2D() { + println("Projector Info: " + projectorWidth + ", " + projectorHeight + ", " + projectorOffset); + //toggleProjection(getButtonIndex(buttonNames[21])); +} + +public class PFrame extends JFrame { + public PFrame() { + setBounds(0, 0, projectorWidth, projectorHeight ); + setLocation(projectorOffset, 0); + applet = new projApplet(); + setResizable(false); + setUndecorated(true); + setAlwaysOnTop(true); + add(applet); + applet.init(); + show(); + setTitle("Projection2D"); + } +} + +public void showProjection2D() { + if (proj2D == null) { + proj2D = new PFrame(); + } + proj2D.setVisible(true); +} + +public void closeProjection2D() { + proj2D.setVisible(false); +} + +public void resetProjection2D() { + initializeProjection2D(); + if (proj2D != null) { + proj2D.dispose(); + proj2D = new PFrame(); + if (displayProjection2D) { + showProjection2D(); + } else { + closeProjection2D(); + } + } +} + +public class projApplet extends PApplet { + public void setup() { + // Keystone will only work with P3D or OPENGL renderers, + // since it relies on texture mapping to deform + size(projectorWidth, projectorHeight, P2D); + + ks = new Keystone(this);; + + reset(); + } + + public void reset() { + surface = ks.createCornerPinSurface(TABLE_IMAGE_HEIGHT, TABLE_IMAGE_HEIGHT, 20); + offscreen = createGraphics(TABLE_IMAGE_HEIGHT, TABLE_IMAGE_HEIGHT); + + try{ + ks.load(); + } catch(RuntimeException e){ + println("No Keystone.xml. Save one first if you want to load one."); + } + } + + public void draw() { + + // Convert the mouse coordinate into surface coordinates + // this will allow you to use mouse events inside the + // surface from your screen. + PVector surfaceMouse = surface.getTransformedMouse(); + + // most likely, you'll want a black background to minimize + // bleeding around your projection area + background(0); + + // Draw the scene, offscreen + renderCanvas(offscreen, 0); + surface.render(offscreen); + + } + + void renderCanvas(PGraphics p, int x_offset) { + // Draw the scene, offscreen + p.beginDraw(); + p.clear(); + p.translate(x_offset, 0); + p.image(projector, 0, 0); + p.endDraw(); + } + + void keyPressed() { + switch(key) { + case 'c': + // enter/leave calibration mode, where surfaces can be warped + // and moved + ks.toggleCalibration(); + break; + + case 'l': + // loads the saved layout + ks.load(); + break; + + case 's': + // saves the layout + ks.save(); + break; + + case '`': + if (displayProjection2D) { + displayProjection2D = false; + closeProjection2D(); + } else { + displayProjection2D = true; + showProjection2D(); + } + break; + } + } +} + +void toggle2DProjection() { + if (System.getProperty("os.name").substring(0,3).equals("Mac")) { + testProjectorOnMac = !testProjectorOnMac; + println("Test on Mac = " + testProjectorOnMac); + println("Projection Mapping Currently not Supported for MacOS"); + } else { + if (displayProjection2D) { + displayProjection2D = false; + closeProjection2D(); + } else { + displayProjection2D = true; + showProjection2D(); + } + } +} + + diff --git a/Processing/Misc/Barebones/UDP.pde b/Processing/Misc/Barebones/UDP.pde new file mode 100644 index 0000000..68308ed --- /dev/null +++ b/Processing/Misc/Barebones/UDP.pde @@ -0,0 +1,98 @@ +// Principally, this script ensures that a string is "caught" via UDP and coded into principal inputs of: +// - tablePieceInput[][] or tablePieceInput[][][2] (rotation) +// - UMax, VMax + + +int portIN = 6152; + +import hypermedia.net.*; +UDP udp; // define the UDP object + +boolean busyImporting = false; +boolean viaUDP = true; +boolean changeDetected = false; +boolean outputReady = false; + +void initUDP() { + if (viaUDP) { + udp = new UDP( this, portIN ); + //udp.log( true ); // <-- printout the connection activity + udp.listen( true ); + } +} + +void ImportData(String inputStr[]) { + if (inputStr[0].equals("COLORTIZER")) { + parseColortizerStrings(inputStr); + } + busyImporting = false; +} + +void parseColortizerStrings(String data[]) { + + for (int i=0 ; i Date: Sun, 10 Apr 2016 00:54:31 -0400 Subject: [PATCH 04/14] add projection mapping and adjust size --- Processing/Misc/Barebones/CONTROLS.pde | 2 +- Processing/Misc/Barebones/UDP.pde | 2 +- .../build-tmp/Barebones$PFrame.class | Bin 0 -> 935 bytes .../build-tmp/Barebones$projApplet.class | Bin 0 -> 2386 bytes .../Misc/Barebones/build-tmp/Barebones.class | Bin 0 -> 5036 bytes .../Barebones/build-tmp/source/Barebones.java | 362 +++++++ Processing/Misc/UrbanAutonomous/Disp.java | 14 +- .../Misc/UrbanAutonomous/PROJECTION.pde | 185 ++++ Processing/Misc/UrbanAutonomous/UDP.pde | 98 ++ .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 111 ++- .../UrbanAutonomous/build-tmp/BasicTile.class | Bin 0 -> 2470 bytes .../UrbanAutonomous/build-tmp/Coord.class | Bin 0 -> 262 bytes .../UrbanAutonomous/build-tmp/Demand.class | Bin 0 -> 625 bytes .../build-tmp/DemandStack.class | Bin 0 -> 6571 bytes .../Misc/UrbanAutonomous/build-tmp/Disp.class | Bin 0 -> 5487 bytes .../build-tmp/DragStatus.class | Bin 0 -> 1018 bytes .../build-tmp/FileControl.class | Bin 0 -> 457 bytes .../Misc/UrbanAutonomous/build-tmp/Hub.class | Bin 0 -> 1053 bytes .../build-tmp/HubPeripheralVehicle.class | Bin 0 -> 4959 bytes .../UrbanAutonomous/build-tmp/HubStack.class | Bin 0 -> 1234 bytes .../build-tmp/HubVehicle.class | Bin 0 -> 3447 bytes .../UrbanAutonomous/build-tmp/MapBlock.class | Bin 0 -> 2055 bytes .../build-tmp/MapBlockBase.class | Bin 0 -> 1443 bytes .../build-tmp/MapBlockBrushs.class | Bin 0 -> 1735 bytes .../build-tmp/MapBlockStack.class | Bin 0 -> 2579 bytes .../build-tmp/OperationDisp.class | Bin 0 -> 6370 bytes .../build-tmp/OperationWindow.class | Bin 0 -> 2927 bytes .../UrbanAutonomous/build-tmp/PFrame.class | Bin 0 -> 473 bytes .../build-tmp/PeripheralVehicleStatus.class | Bin 0 -> 1168 bytes .../UrbanAutonomous/build-tmp/SimParam.class | Bin 0 -> 1806 bytes .../UrbanAutonomous/build-tmp/Status.class | Bin 0 -> 989 bytes .../Misc/UrbanAutonomous/build-tmp/Tile.class | Bin 0 -> 370 bytes .../UrbanAutonomous/build-tmp/TileType.class | Bin 0 -> 1160 bytes .../Misc/UrbanAutonomous/build-tmp/UDP.class | Bin 0 -> 10846 bytes .../UrbanAutonomous/build-tmp/UDPSocket.class | Bin 0 -> 5280 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 0 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 0 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 0 -> 11205 bytes .../UrbanAutonomous/build-tmp/Vehicle.class | Bin 0 -> 2820 bytes .../build-tmp/VehicleStack.class | Bin 0 -> 1499 bytes .../build-tmp/source/BasicTile.java | 39 + .../build-tmp/source/Coord.java | 9 + .../build-tmp/source/Demand.java | 23 + .../build-tmp/source/DemandStack.java | 291 ++++++ .../build-tmp/source/Disp.java | 180 ++++ .../build-tmp/source/DragStatus.java | 16 + .../build-tmp/source/FileControl.java | 15 + .../UrbanAutonomous/build-tmp/source/Hub.java | 48 + .../source/HubPeripheralVehicle.java | 237 +++++ .../build-tmp/source/HubStack.java | 36 + .../build-tmp/source/HubVehicle.java | 167 ++++ .../build-tmp/source/MapBlock.java | 59 ++ .../build-tmp/source/MapBlockBase.java | 67 ++ .../build-tmp/source/MapBlockBrushs.java | 53 ++ .../build-tmp/source/MapBlockStack.java | 75 ++ .../build-tmp/source/OperationDisp.java | 240 +++++ .../build-tmp/source/OperationWindow.java | 137 +++ .../build-tmp/source/PFrame.java | 14 + .../source/PeripheralVehicleStatus.java | 18 + .../build-tmp/source/SimParam.java | 66 ++ .../build-tmp/source/Status.java | 16 + .../build-tmp/source/Tile.java | 11 + .../build-tmp/source/TileType.java | 19 + .../UrbanAutonomous/build-tmp/source/UDP.java | 881 ++++++++++++++++++ .../build-tmp/source/UDPSocket.java | 201 ++++ .../build-tmp/source/UrbanAutonomous.java | 604 ++++++++++++ .../build-tmp/source/Vehicle.java | 141 +++ .../build-tmp/source/VehicleStack.java | 60 ++ 68 files changed, 4456 insertions(+), 41 deletions(-) create mode 100644 Processing/Misc/Barebones/build-tmp/Barebones$PFrame.class create mode 100644 Processing/Misc/Barebones/build-tmp/Barebones$projApplet.class create mode 100644 Processing/Misc/Barebones/build-tmp/Barebones.class create mode 100644 Processing/Misc/Barebones/build-tmp/source/Barebones.java create mode 100644 Processing/Misc/UrbanAutonomous/PROJECTION.pde create mode 100644 Processing/Misc/UrbanAutonomous/UDP.pde create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/BasicTile.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Coord.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Demand.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Disp.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/DragStatus.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/FileControl.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Hub.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/HubPeripheralVehicle.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/HubStack.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/HubVehicle.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/MapBlock.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/MapBlockBase.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/MapBlockBrushs.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/OperationDisp.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/OperationWindow.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/PFrame.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/PeripheralVehicleStatus.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Status.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Tile.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/TileType.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/UDP.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/UDPSocket.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$PFrameI.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$projApplet.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/Vehicle.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/VehicleStack.class create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/BasicTile.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Coord.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Demand.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/DemandStack.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/DragStatus.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Hub.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/HubPeripheralVehicle.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/HubStack.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/HubVehicle.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlock.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBase.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBrushs.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/PFrame.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/PeripheralVehicleStatus.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Status.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Tile.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/TileType.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/UDP.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/UDPSocket.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/Vehicle.java create mode 100644 Processing/Misc/UrbanAutonomous/build-tmp/source/VehicleStack.java diff --git a/Processing/Misc/Barebones/CONTROLS.pde b/Processing/Misc/Barebones/CONTROLS.pde index 2a98fb7..017d3a5 100644 --- a/Processing/Misc/Barebones/CONTROLS.pde +++ b/Processing/Misc/Barebones/CONTROLS.pde @@ -1,4 +1,4 @@ - +` void keyPressed() { switch(key) { diff --git a/Processing/Misc/Barebones/UDP.pde b/Processing/Misc/Barebones/UDP.pde index 68308ed..972690d 100644 --- a/Processing/Misc/Barebones/UDP.pde +++ b/Processing/Misc/Barebones/UDP.pde @@ -78,7 +78,7 @@ void receive( byte[] data, String ip, int port ) { // <-- extended handler // get the "real" message = String message = new String( data ); //println("catch!"); - //println(message); + println(message); //saveStrings("data.txt", split(message, "\n")); String[] split = split(message, "\n"); diff --git a/Processing/Misc/Barebones/build-tmp/Barebones$PFrame.class b/Processing/Misc/Barebones/build-tmp/Barebones$PFrame.class new file mode 100644 index 0000000000000000000000000000000000000000..f09ac32770e3bae1102b023f8b486eaa7c7ced1d GIT binary patch literal 935 zcmZuwZBr6a6n?It2;GoK?Y%51VKFf(d%-ltOq59{4X3_c*{iIByUgwyW$$l)qJPm$ z;!Mr-1Nu=-=Rl#&1j9MI=ef^)&Ko~}eft3*i-iz61Y*<5)oYHey~NV2tG09qL4o+D zda9mfyt-v?WagW3fiAydd5KYhL&Y{JN8xeHw)_c!X!1ZjRT2p19aD!v1c^>`MG(MY zi4dX!fn=%_Mhx)~jtGR?_emT@FI`o0olRZ#9e33-{fdAn@acYuV+{AS;W=$>RQw2O zoRBz)Q*@W7{b^_0Ha&q*vOu4f(iw@f|8f`C*Xb;C2PDqp0_92XMW?KM%drJIiJdBi zkPzr?CzxRAsambd%t2h@db&Bcq(lk^wL>*Qf&Tq&93bUbZ&>0oMg%13J=C7Hqt>dL z`jvc=DltAPafR_H;g4)nmmOF6+GOae#I?WBRJE?2dyDppQ)6gM;s$O~ZSS|X1b zfo@83#qzm?zCWr}MT@iSyR<(!UWJ~bW$OpqTWi`~X%!n;cDCKJp0$`3ZTEMClP0Z# zZEH7QRi3A5kX^0a6o~A%pGHQt(khEsjMs~w=u6`u8>Y9<6zw2iGSa(<7<-ULAdvow z9{Tk)aNHn&I?%wm^mhzCPVeF3E`|&Wq>W$$88%ryGt|KK)t0|yG%#+&CmWdh($u?0 zHVaAi6RGWx?h9Jcml(h+4C6J8@eRiCmU{aRGkA{$e83_;QeLyf>A-!=k&n|8{S{Fl JJ4k*W;y02+&IqYu9OX8g|1vh+e5A!p~z`Tz5s@BjY) z{B!Z&k3Rv>fmZ@3(@=jvcVyDGq`M>Q*vGoESyOreRA^Yw_mp&9!^*U!Y)7^Y`9=+u z-lXB~XxC7kDDCd#@_xfIygN12L@rrx9@S70v(qvNZV*_3$`H!2QXqgD4doH#uqt6# zaxgcYl+K8rG^K_WuJm%*AnH&bz#0v~(n$hqv5to*x-#Y2&X|$*CN*er<-I{*qcX25 znfs-Yne?jApkeb;NKrd0t&ABR>T~q$q>*wvxOh2A!FA#K^E&H@p$5xKBKpp zI%OF49IDaTJQ~1O4Gn3jr?bYKG~1@+ao3}WZ3l~!5W?85LfoODF_Kt1_cAGoq&VLw za1$aL%BEa0NL&ZDQ*mq&XjRg!a3n=i0J{XDD(JeAt^xL=kBh zxEUQ9)}Ku$7J*x_M?=6}1ZetSdlmWH z1@>Ye)8}(pRA0jua%jFhXt zuy@c7FXkyaH*H44;bDD7hMB+cgyFbe*q8_(w{ziH-SWbo9acM)HL3#W5$Hu9gU_-S zJd+I8MwTy;xQ0zjwR0$EdB(KtnM=v6XV~1ga@f;TQv-UoSn?HVN1qL00QUwksA2mu zb#P@m1cq>*hBX=KjX1jHPT0=0Ob^&OmsxFyETiXW;mQ>1Xjotb_iG3xNh9OfIV(+> zBJt)?73Y}1130WfIMPZ>C#G97I?Hp*GR0iVQDN%<9u#;853?coTNRV5lN6uUGm;k| zgmLHr9M!P#s#~%MERa+w3?^m9u(}H>jUz1}3)diJO5IT~8G%U{^z)P!CQF@{B+}dK z-?AwI6VtSoI)jD{*W#t%Y=JBuC4`}<@@8H$3U!3q;R<+)Qh<^vn$(t^VTkwCm1))g zW(DSOoL!I0>{u~XpeF?$Q=3+Mb|z!Wm~I+LM^`1HtfvH?P}T~UC8{pplLAlS40E0~ z+^ne+z0d~f-qB6SBO&@cBXG6=nKErxUh1K&&j~!QthMf>J$tE1W?7_Am6s3jQ>EWrFDTn zA3~f{-dI)i1YYM`EozGX2~=jMB9*MIt$94ck!o!`Tb;*5s}FdrnlBdDoh4X5nlHKWB6Io`BmA1s->^WxC1|ch z|3^lz=$|3f%sZU$?-Ym1$x)7BjugjE4wGXqhs)9HA5Be9%%i{bLV=gmetdpWmD8_b zt@0^fz-jf&y*Pn^VGykmbC(o}`Yb|FMV4Y6J*Aiju~_*5;DA6&c)?LS$MLTCU0 literal 0 HcmV?d00001 diff --git a/Processing/Misc/Barebones/build-tmp/Barebones.class b/Processing/Misc/Barebones/build-tmp/Barebones.class new file mode 100644 index 0000000000000000000000000000000000000000..d8e096759695e39ddc9a42c9e0789bdf42803263 GIT binary patch literal 5036 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 K1%2)eJl_EyA|pu(vON1%17uGPs*g&$AeOfL0# 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 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/DragStatus.class b/Processing/Misc/UrbanAutonomous/build-tmp/DragStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..15edb1072846eba3826bfeb7291e703efe955171 GIT binary patch literal 1018 zcmZuv?{Csj6g`*H!b;gDy5BJ8HWfM?ZaOuAEMpr+A{&Vn65^+hRqO)Hl(K~X$q&jj zTQn|y_Kz~&*P(RIe&~Joy>srl=iT@7*VhXG>v$GIfS~R=X2Wnzx7!IJNEkgbPs~iy zY&SB6cDF@P_RFvK@+E>+8bY&#;ET$3{xWP60`?(+iiAjEzp}Sn&6g?#gAjdll@!j^ zn|9lFHwjWQRb~3l@u3xltb!2Ja1*y!F*krrB}>C@4A-&Sjcl=)s*W&tQiBX7jF3oX zG=xMF7D-$~7>ZcUYluK2jFs%Rwcl+WSk7znplPX)a7TzOa-IKaTuLl!7=cQV8osz9<0!)~20N+5Z9QH(NgjI(!~i*NTEs1_TSf@ipKiU}{93d&wK?PasF;$?HncZN!ROc=Fb zAJaxn?qkk4MdB0JA>8JF3_<<}SVcmd*E;V9#N!*Nrg>i=G<_w0h6O$G1xrJ=U_rbw z?mWW16Yk>PfSKS(d@AdovGjo#mx7A78D+wKBzY~Yt+F*yXtIw)?WLq&)N-QpJ!$S7 osr1KxxP0wA)Q1D^BDX7K)EMdKSo;CGjt}55BLdjK6E8mf4e(sSS^xk5 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/FileControl.class b/Processing/Misc/UrbanAutonomous/build-tmp/FileControl.class new file mode 100644 index 0000000000000000000000000000000000000000..8afc3e4f0c403b97058fe3d53b965a648e02b8c1 GIT binary patch literal 457 zcmZvYTT8=05QWdAwU>0;ru9;9FTSM_TJcp8q#zWk2$jC{DUFLn(ridJ#lIzZL&P88 zj}j*lil{6MJM4UC&zz6X*LMJi*e$~#)Xw}s4pgXP6_imVbfQ>!GD-aKrthg(_AgJP zD3F>^_0mME`MDbrjOmb2I`%_fpAZUmcS0x*)U`BGKuw^GN)?2FCy7xc$IoA7dS}oudlYS#s&3r|)zI zcLX-E#j7OlLVk}X1l#^A@Q-F@+#IVk_GFd>!TJ$MFSCF>{-eN=5g*=$ZwB9ZL#|cs zdU+2toM)I$i|}SXLfq#>gKHzFIb0^{OmG}a_JH3Ep0S({$k`@q K5w>~Wz|I#Fpjp-c literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/Hub.class b/Processing/Misc/UrbanAutonomous/build-tmp/Hub.class new file mode 100644 index 0000000000000000000000000000000000000000..e9b5ae03a45abf5adf83b40db58db1c506a512be GIT binary patch literal 1053 zcmaJIP z#l%XYi9f*KWQ=FF7%>tbcIM2TGv}Ur?|%RJPr5xmQ5{FX==rx#`^Qb` z3QYDL%eFf$%aiSguB%QgyQX@4oT>R4`<}APys%DnctapwSNo3T^<612e-)=vdnAu7 zr@gUBcIKepY{&!EvgK<_dCJ)zsz)lyQQoFNxKOPY8v>!NPFp4rM8?1bCRur**oZ@5 z%0L(qjiwDm5s6|(Abo|m1oFse-n;<=qZ%z57{_RW=!StMtvb@RTmU6TH@VKy2q+z5syGvkF;R}vOB65o;%xavnlmO5WWO+j11#&Mpcj*hYiG!tAssb8 zAs5>Vw_|pw&AazV>rnPmi1b@$NDg1c^s9pQ6M*((a$I1>FtS8bbd=+1n!iP!Lz~4W z=261}p0lZU$qXY{N~Q=n(F>bflnOAC4py`oTG@+r-ys~TGYsm4a&&T&G~^FF}EOe)9Xj0C5GjaR2}S literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/HubPeripheralVehicle.class b/Processing/Misc/UrbanAutonomous/build-tmp/HubPeripheralVehicle.class new file mode 100644 index 0000000000000000000000000000000000000000..44007e4bfaf5c8e8b2d946fbe756c20db868da8e GIT binary patch literal 4959 zcmb7IYjjlA75>g-lF5V%goMZ=;UO<)Zh)XDC?V(&z(fWTlaQF;gPX}ExiFcD^N504 zZMF90`#nAoUyKSB#UxU(2rBsKYPasd^uVo9y2}_eYQjdO zx2CCkml;YZs2llfd6{q`(pdB)qu);NgSj^ZX!?g8yH^k5AdVaN3(BfmGTKRReddK>6I8ndG)%pKoxeKZ<# z{Hg(kS;2u=G-Sr(oLv)&#>|@Lz`#J*6qH5r1Tn_N=nO(z?N2mXyr{LKv8}%0y0*aj z;KoH07%I57ljfqeR>VrI!Uqp2?{VzLnY=b6!`q@UM#>O4;CuS zm>`gb#hA(2t!+)sUMQTWVFqSO%depjMbfI);Bi{ZG*sXm8LQEtp~Qpp70Soivl6Vp zJh8h_!(>d6)+!BUPU~U~)11~C4ds}kFg0jJOh-s@ ziWp%V4ZkRKYUsjtg<{hP^=)A!g_*wbWLPVEc@3`f;99b^E!J&B0?9-)677#B;~I9r zpp(92w~bz*B*^@-+qGVVz;y26_w1O4o#-V#+A{|W#kN+^SQ>VLTzPt_EOU^Q#j=o z_!|ArTJuT_@m_Z@$}zGn7%)OsVo%e~Gs>7C ze^Xd_Nt}{~gYe6vTGmA#56VN~q$K5R$;NjzyoXbS$)h1@l7%Yf>4XK_gZC9?=MKWH z(bim(U=FbDbChtG8Qs7SyH)Xk*hOME*B3tmp}@5^iJlRwUsUIZsyHO zX7^d;>^Ezi{brT5->jmvp31fhrEIZ+j_I?uj_I?mj`pW>7VEa{ht(Y@EfF@@7bKOa z;&TprcN1M9-&^!IFjqfO@ti>qF3scNF#%huuB=mPWY@`SONnet8O0oms^)>r%nzg5c9_ zsuz-iMQkl5*-MD@JR(KXQ4lky|OXzS79oCL< zsIYmI$kViv5WC4ikiV@*aV4QH8A03fmpR_SpL`dHqKWzZRr422V~w!6as*eUQNz~q z6iO+QtB24%g1$62!S00Z&J?k|$hIxWF}#MN1TLfV0FUnVRKa={jt%5s6Cqzth8s!d z6=)&PS7QsVLlb&=+U`P|y&x|Hs=n>pBgj=7XE^^;AX;+Wnj*cAs1q3Y&mEtO9PbX#4 zMflsfpsNY^T5Ka=5ym9AKf^K)qOMArz$2dUoYeiMkm{l$1hD$IUQH<9I)S@Ja8C*s zOYepbMom1feop`d|G)uECb17Q71Qd+&e&rI)G3ZhdZyK}JReV_aDCR}5cZ{*o}Hv4 zH}o_e_kYkb1#KpHv#E6 zT}4=8fNn}8#DdtvGH9~&?4-7OnazDn5DTqL0t35oKl*W!H?9vbfRAy#D&n`j>W{cX{R4Nh!rWzRbOxraD0Te{!KHj`SnATf zuBEQJ3NL~166hqBt39LB!#XvYPNA=Q2rqM8t4DCSBUj^BbNF>TyXq**$3&Jmhh`Va zxJcR-_#GWGlufshXFmTlGwrF*KTfNyqk`Tb!M>NmR(?K~!eVFFhVT}rQ@hzlPPFAV zr~L4JT2QUo#;8p3cYdHu^F8XLW}}Uq{mK6o6Ou^OU=t@3cWk{=8cu~#gCDD(Usk%d|9*335OJ5kTt9vl49>s`y z9!J$HIBu(~0_7{qs)}4I=DKR;x)yp}b6q}LW4y&?iuVhwgmNkBDySm?$H{A8Kg!wM zClv2TvAZsfOq~&-F%>KM#W`Df(95L#m?Ks*Iqn>hqvM6{x~kmC>zwc>8Sx$7J>F$4 zevd``6c4!5JbT_pJw7BIAF;gu(1!1oLOw?=aLEmdSNja)U- z<32yAbKL)gbAHO8KjX>qbKALn-1GJbxx9``#@jhEj*U+Swf99b-kyLAj*rFVkns!R z`XzDwie&tnWPCz0enT>TOENws8NVYLe;AL9Eab6d*y?u3u(R=tK^-#w#Grp>(7%w3 zzvh!sS}cD%XUI61x$|9d1SdLA!~JTPt( z53^I`bUI(hiC1}1C}o5y?)My)SU=x76JZtKt9gvq^X=TxxH;UIA{*O6cpE(U;B)@3 ULh&t+)7U)rLGuqe!G(|h3y9~4N&o-= literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/HubStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/HubStack.class new file mode 100644 index 0000000000000000000000000000000000000000..92d211174e93f5098a1e3d35100e474c6e36d81e GIT binary patch literal 1234 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 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlock.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlock.class new file mode 100644 index 0000000000000000000000000000000000000000..bb04789907da8fc06eac77ae7868d57b8a954808 GIT binary patch literal 2055 zcmZ`)OK($06#m9ed=oPy<`qb6NGJgk^9TeA6hceLgSeOkVw04n1+MLja}&qcy|%-n zbWsU)U8$RHyNbl7loA(J6;d}v>b`21{Q;G_uTbfC?u`>EDT!w0e&2b_nR8~2fBpBz z7XbS4nSp>p(-pIHvEXFq4Kyf3=FCO2uV5DQeG{2ED_c=eC5856$#t?;xolIAbzH0O z>R_oestF(MG#CLJQzNV(iwcJ0=Io+b@Ty3k z!x%L%!s1SMPT*8<_CaMv}_5Pzt;M zr<%U@=%|!&7~>ifp8JBh7v`GAq`#rN!lX5>`#N=ITH^y@4A(JpD_S3F%m~+N7b})q z=7X`FB4rZS#~L@K3Win8NevV>rz%W6ADnkV<+7NP;ugtQRwD;SA6hgERjW*8W_>NC z%~Z*2%u3P&W0L~sH0FIcEpS1jC{QQH(<76qk)d>AVq63zjZZwiq-Vz5R($B0Eo$5q z*f2RUIBbBAwqvaaj611nc6QXZ3b_&2bzB22ygwSnD`R-RGT+s9F{!d{*!$nMhU zjSy$Zi}6;z7p_WP2M`I%!HFBm@cnY$LL~M|*!U0F`kkk~opTrg&YRFcQ&Hcsq8=wN zlCY@94=tl@&8Ec*q=h!Ee5$fRD|W5e4bw`(+_h>KZ(2rs{O~fO@fvoodFg;0Vk^CD zqnGUrc?ZARu#^9ghwpn-&v_7fRNe7s=z57*oNF6Ldn7!&vefX_GP*=wLys(5@VbU0 zt6#^1155Zlczy{lpW`IyXskcl{|u*VIDhmpcl(w@k|PoA=NRBfam;ai&hfRldWxYK z_xvI%Qw@nFEc*17b@VNtzPgSc^Xb$&`nXR|t)n}9`o=ms_$Z)a6t#cz`t&2EqWtT1n!`na|f?T6kUknAa>(8_OQ2f;sTiwUWhS{hwP?bq8neaXD(6eF`w59 z#PKux+;2F7KiJv+!ZG}feig(C6+)NVf=(4!(kx>`9 z1dVl2C1~=&jqh>$2@4rv0%EwwV;|s=?(s+`ahmHHw##9zBN)duu9IvtH@W(03wc2{ jddE6~&0_{0yymS`TxGh4%Q7WbzdYzoH2jq33*g~@bvvZ} literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockBase.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockBase.class new file mode 100644 index 0000000000000000000000000000000000000000..b5c1a4dfbf78fb9c055ff28055c88219ca899207 GIT binary patch literal 1443 zcmbW1+iMeB6vn@u%q_{J>BZ63sXgU)n=@B0k z9||5g960(QB7%w!)i)J6ilA@4_$P^|-=6736h(ZPJ!`LT?LB+{)|b5h^!hD;B8GIt z1kA&BeP7M5UfO3j936^4>qYx7yHK;e^Mxaoi%zvEpzU-$x4By&p3R*UQ2z8Moh0H& zm{6e!WX4?28K0i2IKgqdQgZ~_1KXSQr;fWdXCw&hD+e4;pf5XC5B#drXt>IY8Y z=t#X@bDG1sGiSzR@vx2-0b_C2%Fjt5fp#p>(ZP?M2r9NWGTrn&f6AY3n6R)^AW^X! zZdH~Fq{eugXfm8YCzk8zV#PwzL^oFOS{E)y^;-08S-Q$ZPpH*GO{RKHtcl8l=p>z3 zYhqngwUF9iA}dp^uGe&e2D!PuH(%dxVxts|z_%x5QrUYQNMaD1bQA=Z{eX*!KTzaB zBbr2!9nFmjq{~gadWoG2Y3tZ3pwICWSkkCFRrg$U{YChx?4bq70?D#J9aNps5LesR z9vGDEM=#iH+5}Meu*sb3j8^h3WTyWmjAsnE6-Oz{5lF#g%u*2xmjQPS;~mnm!}=R! zCgRW0_5#bw6G|AYEKjImu(~{H~CH3dfECOD$T_y7lE* z6sX-t;yW!zZLT)Iv3=lw3CgXB1&63?24(t5ILT9|kmmUd zd~af|gba3~6$jCV)AZjYI?$xsW|;q%`fYS!Ggo%P_=J*yNIx}ck#99=k(Q{oOIblCny@sQ;^n+e9_JU`v76lne}@MDGc&xU zg)QvqX6zu9J&g8aJC1Q?V+d0i##QXX-^|~neitJlmp&MuS*+<0ItKZKRslT`nk5+` K65L2ya>p0Ub`mWB literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockBrushs.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockBrushs.class new file mode 100644 index 0000000000000000000000000000000000000000..4921d6a5ef53f7ff12df16d88d58c15af7b17c38 GIT binary patch literal 1735 zcmZ{lTT>cm9LAp)Py)V2QKKlUCecK|BqpS1)J9D)q~_3is44Bmf*af@yUYUV^tzc| zw4cJOUbhqIOgqhWC!e8*na=cEWJ;fRVTp%$v+wD7|G)p~g_r;R@&Z5#Uj*S3ID1bo zFYnuhy=A9X*{uW-5Rjccy<%|b=+=&1Y6%2-a%W#n?9rRb$89 z5C|Vu_gb}5-f$i~ZXb%QfUjH>h^>_!yI@o*rd6CP*p4yxaMjVvyJn$6h$st;o>VNA z%lk%^=iT$BWmXpj#^a}|vWYE$z>2+NgyF}KL_f|6_~VJK5Cldf&Y~}fQGqjFbZS2) z(S>d`8QyC{jk_5@!&ifi=@I z?z_3!(DVCrQD9c$3a$zaw2W_<`^J*v=wG|`r%n$vk;|51*T8edvcYZ z-u0?p*kb}ZUfh&;3vUYydHx^uqla;N1_b)^s)@3t;)-MFRnxY@cn=>0@jerLqQ0%_ zNu)8)HY%tahF5ce$#^!KI9W_jkXG4Sl#u8R;}({KSYnHuV0dzg6;*^#-YA;ZZAbq~ zUHV8OqpBCqGv=aW*Q_12eMcgzw!14;$KEqS_!#$sSYwekoxE->)vC5-m+V?a;yxbG z_0o|S#4L0=zV#;PYZQxtC+`_uV1~vt{%#vQ@^LkUyX4O$TlSym^R)$;Gwj~~^ z7=nhiqavW+>vqj47#Y@DV9@K@7W3K@{i%)%Op>3Ey_+N3m^0pQkL){l%~p0tW|AY+ zGvK$2%6>%n9pLH-ttdOGj^B)ECxv&9ZfDwifC18Z`F&YQW`Cg$*#9Yd`HYKOFd6@Liw<)nV zQiO;RI&ska`#4A=Xq+I8@X6yKKL0jovkjV7AdR-P*PvJfDK{2Uf(Olik0UM;F@>0$ zoJ)rhQ5t`zgZPUw70dT-ej@liA_5J(TgL)%3k`gzh6tJs-0sX)y|@>C!d>N5>Ny?` zeA1tZ?S9+9r_bn7>)^#f^N*w2v6go0gqB(Qvqk*ubtEZ1S0K)UCs>yxW0~bo+!aQ1 n6?ZvqV-8>9I-YX;hW}9C;iemD2!U6)A!2>1ZlBYH54ryVB8GP? literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class new file mode 100644 index 0000000000000000000000000000000000000000..eb272129a6a0606f6f67bada347dc75705249a82 GIT binary patch literal 2579 zcmcIlT~kw66kR6?+$3C)AW$WV0-`3N4H7><@uPr(u~DfY)l#jO>TCa>n(T6!4Vt0^v-_ zwz7J;Y?%4ctYzz?^K-UVS~ap|x`>j%o~<5JrBXq!aKHVOVH%Y)0+HA|z2Zv(z8Nd0 z2jRs|6&>gj@W$dx0SI)f2q37ST`qc6w4pu7*?TH>OSgcnnK`RCr<(#hGlr>Ot`=8x zdr?~{=nBFDewUB@RaC`Z>=WoIm-MW0$H*=k1>NE91la#C7^#eOo(!TNgA(JA!0@~M zU3bZChoe7nIH;&{wpy-OMH+Z&00$9MaES1)*(;hkRjpX2RkW&Q6>%g;pllT9HCrnR z1Tzbb`D6g^BdOp6?z=V>qc|*}6nW6Y60z2U3k1WwZGs^&)Mc&l21re*4NQsh{$w46hT7C%@3YE{zXDp`3@3F1Rc zE0|&;w^UcXc2vyZoIr<+vrw^Fe1v=`mbt6l(?$y#Yq4&fj4yAs1u=^Y3g!etE&sGx z(et{kB8`ibt)$syoi zg||xHwyI{1{ToZim*lRY;;!6nFIQ}9%^_Y;Q3U(5dD}SsAp4c_wJs=P>&Gn_;|mow znC>>CsO4G6(QW!HEw?6TXX~d{Ros(E72V89oJ6-^Rqd=kOBs2Iyme4g)&vHrgqOFa zmm@C~&iHfqIYQnz{Q7C>fXeRlYwZ4)CB%&-L0*8sDDv8OoZO*Ikx=^}X1La>)yKyC{0sLWyrVd~qD z1lLCpX`xUZ6y0?clm82feMB)p6oW)D#P1+c3=qZscc3`cMDZ1M^pVE}YT>08QvUAK zHJr^zL6Y7x>ll!#L{pKvDkDtEYV>yM8=R*;UJ;dv`NK`suPuFsoVq$lWQT|<#`=g; zp#+X`Jj3-IMjUh@`2Iqlf{z@TB6XQAZ41!n0=)d+0ZbC$C;=WOz%c?$5#SgB9wtC3 zAh@>;!1*S?XVgzt{ta11^HQ~GsoF8`ao;))Zs6mHf3??lI~Dd*wnl-ap5j`sFBPSN zKGEy*KYsn2l#=65u9DB)l6%sUG~u-9aUM6$*#vg-jq1foB0fRH6MO*1afJ`sb)0pO zN8opxKsJJ$4^iKjQ0gjQZ<6?)F=b<#PXC3x1N^Vy#wKnO@y!}OmqQ4zYsfWctCDa^ z5+0Ve4Xo8$ndGcUS8Daku>90eaw)xVDg9gzT4^y$^3sskO^7exZk%HgpXXyg%S_CX f&jl=Uyvg+)K4e8)Y?bwxQ#Av1KKB{Jg9rZrO?o&^ literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/OperationDisp.class b/Processing/Misc/UrbanAutonomous/build-tmp/OperationDisp.class new file mode 100644 index 0000000000000000000000000000000000000000..3e0a72d5acc2dfb8fab5597aa8e8abde9a032638 GIT binary patch literal 6370 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 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/PFrame.class b/Processing/Misc/UrbanAutonomous/build-tmp/PFrame.class new file mode 100644 index 0000000000000000000000000000000000000000..c8aec2d81f9a5caed3ead2bf4886bb5864f9fdfe GIT binary patch literal 473 zcmZuuT}uK%6g{Kny6cu{nUx=X3c5i;uSQToP)G%pQa!Eh5ED5g`;q;v3KR2oH_T-nXm8nPXIfp8%Qvu&yRd}zzw7r3J>m+``ijfLf*Gd;yMv_g%sf) zgV8vq)$B5)4wc6(Bw^Z^g2j+*G`kiUY#Y-^GnfGn4^$+*z(9^6cQ)j{8ww?RLV9Xs zVFsp&0_F|O5q#zMUAZ5HN~(d10vkmvkf<7t81kJzm)pA0qKzdi6UX&D2B*={legSa z*g8~$p^{vN?dE?)-MV6?7juxRYA2t@yp6WX}ZZ_Rat<4D9CzyRh t-g!lSj8ZR7Wrx7pODwWZu@+0v{~$x=nkd1-3bLrfhC>yG4Pqs*`2$zQU(x^o literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/PeripheralVehicleStatus.class b/Processing/Misc/UrbanAutonomous/build-tmp/PeripheralVehicleStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..872a0d533e49ef3572013001ec5f344d4094feb0 GIT binary patch literal 1168 zcmaJ3Ou4Tzm$hIZn%^&20 z77aur@!20`oV!%msC75lyXR)k%$zy%E?+Pe(0RVr*S#PdB^X@Hv&F!241L-4^4cWbm9rMZ@SFc+3}0A;%~x$flCYn zd8fhG+q;|GE7_Ya*CFAysC3Y`vQ7pXEmyIf8`T_EcuT5|PiTo?|}NnZOW+3cU>FhxX#LBQa!@R_heYtWAY z;tvvfM_4?szk*exmnHca(IdosbX`__6!+1HqWUP|qZ_K`qcQCp5v2}dR#omGZdH{I z5>{31V9Ywg_(#gkaErb%zmi0?WhCg|r0yOeL@#Z3x0@N#BvY(mPA85rX^wuz)J2AV zU$IWSK6(w}q$taoj!`-pF%|O@rrw_yRsG8WTJ~wobVKK;xENimgYoJs$vmxQgoZU~ q%Tw$0$>v5I3flT zYfgF9_H1e~1LnScXit=EcXuL}-{;uDN}KG<$>>1+^js5B?FOd`u7%Uo+n*@{i7~zhe7N`=fJOcM{Caa+@|SliBqQ5 zdO_Q&xXMzLW!o((=Q+=_k5p2@CiCYL23i8ICD)hUq0MwcL)O`mzK(2uh?A*t|1wXw zWgxj%%RhJRygG54!aF;xhjS>i(%tp58wO&TN>Qc|#T9|e=t;uBfItV@6&ey~3(z%zZZs;} zb%Evp-4GA~8WV^I=%zqJfNl%4253US4A5PHrU2a&NCoHh!GoIkU%g|%vt97r z+NDxOQzP7kG!5yk9BqL-3I@9W=UBBpzvjs-uYrNitiFsj-ziOKf-5sKkl2l5$3Xi> zrUmxkkVOaj29Z*{dd>P6%OqUTmDF0L<`v|EqnO=%cKydyGz_utQN9joN)m_2P*l>A zw9t}7(UR2BlBCm;G}Mx$(UNr2l4R486w;Cu){>;wl7!NdbkdS!(vk$Hj4}gW1dhE- zCd;f0TK}=$q0frd(QifT7*y!0Lc><1ju9(f$EdPd%67{#Q+146W`7-blws0JM}B)x z+kMOIexKTmCUToG{tf&a`N#Pu%v5gEY&1JK#?48N2|XsYC8cMZ^eD8YS>qOsTg`s@ zo7z9E$2L8-YkPD2yRdc4H3jt4r;Da&lF8aTtkoPKf4cy%gy&I21a#YX{B|n}RUmQT96Jkjr%_wj zXtWQxxmGT17G4U(id|SvKzXxM5>V~!@@s*Jw=WLkHTWTNfxy@~7ukIR9a94^=@tpr@bR}j?#9;_%HP6AO4Oup9=i)ty!=7dril*>@@j%xN0-QM*}n zH@&*cc-3mB`og+K< l=`Su@&S5_4ai?fk${0yuon!GQ#J~6mo)8hiGM)zOvp>=Qwz>cS literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/Tile.class b/Processing/Misc/UrbanAutonomous/build-tmp/Tile.class new file mode 100644 index 0000000000000000000000000000000000000000..8edacc42983be5b6e8312f83314e39e4888059d6 GIT binary patch literal 370 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 B73Kf{ literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UDPSocket.class b/Processing/Misc/UrbanAutonomous/build-tmp/UDPSocket.class new file mode 100644 index 0000000000000000000000000000000000000000..8e641c8b8b85b7c3e9eba8f3c630782ee23b63a4 GIT binary patch literal 5280 zcmcgvd05RHjqlI5^iK@vnsA`%-&GzS7+FPoQSVY9ow-3`Q} zMWJ3;uUZwnk2cn$Y9tAQ_u1ORUTU?iwzb;Y`!2N>{ms0$hmifZf9&ix^L_K1@1A+D z9N7C5fJI`y2QGp9uIBcRNMMs0_rNVsw9yzc7KV&)|H8JOjbPmkZ3P$tqRbE#Pj7^qK|8!BmNS6!Msw z+U|T%0|^hj9{9M#BMUGcGnGiOKuJyO!Rj@%*t=#)%{7U^9@FYHdP1gv$1($EaER3GnhlK^M|H$4TB?rnp!!oj zvN;8)!cj`cx%3masuOEa=RvK&tSqjQ@M9kJBlMua+)T@y<7yApKpnI|9kfuOc(N^2 z@H0F!?IjzlF%b;)nwA&G3KTe2)>l>);211W!(xdgIG)ZiqER#4D=>dD@I&-*U>m%s zr}wHV`>e=dr5DSXRh5x&Wi(>ND;4~51%IMSiIzi+N`ffC6%vhT67a?&w&DUaYYyGg zpxk@1#7gA{Pn5xlhr(X0;>L}!NO(bfOI%5uD)BkA3QUO^L#B-v6R4TQv<-)t)?mkQ zjYJ#T1qwqEqxaN~wl&G3IA#)*+RTLSHR8s?^bV>laJobXI_aH3Bia?E1XJzsPnF5R zyOb6J-4binzNtgzKrj$8?Y)Y#PGY^{$X;{M2=}HLXG)xPl! z?(%}MHHlCtO9HP~P*I8VRB`0@n{hjC`G_ImL7ZjVW%U^06^VEx92txxViH5x%)rNj zgYAZ8u$Bs1I~x+svaEHfPMqzBj-TNt2@xDnX2+KB3o;>D%x2ilJ+9WR%-LODR{6B{FukZFVq zh`vMOD%Anqs&jgAwLm$e)@=3$15AM1FG3i=D&|IACpk?WPrs4loTu&N&MI7KxqM=EZGPioh$B`gcg& ziMwb}EE)>ZTa(pMQ|%;`lusq@k+@g6%w=p*)2~U4*wbMzzHT4Vs2C4OJg6BxTJ9SX z58G49J<2k)^HxRB8Ztsk)yE_rRjQ7qxUIoHQzfP1PDqR??&Hh=CtA(AQaXa?Yk_?d zk1K&E+171v#c4{!;*miG@U+B}c!tqk@5OV>$i9%toOCw7An~G7Z(3MiBW-;t7sl|i z#5eIRM%$@bCpd+zj*Ol&K;Oo9J@^jgGS?-(rxK#T*~>ch;`=yeu;NI_!T8T#gO>5vOuc7sVkOTCHua_Z&HlY6HGgY@qxtew9Vm2*yI{* zR`P$4_@i1bO6Y#s6p2{9!7$50G5;*_7sV_bG@>no{Y{pso0%7XW26Q)uduA3&XO4Z zA@NWAi>p0GEEwnvs_TAAYh!ZKkdOWN(1ZU_BDE;-Uwp)VHL%&1&udlx6g@zv;bUg4 znoA)BpHZ_6`>=K^(qr@lSs}wb-WX=eZ&+C%+#=5-av8yN8(K-%#HH{EF9WSxf?mne zhE{q-0hJ4-joL4y6jQZ^A+4cTOjBlCDYN&B=~DP?8!V-(SIkrxnGz*Z%(5{YiBdXd zU~{ucjp7N5S#dy=OEE{;SlXLhJ=jXGIE>pu>1|$7sc@_mj#pGEiOhu~xe$-UjgVcD ztTr)Milaph-IOlHlowk(qE2AOBn^iC>xd+*fVon~wJ`OfU7);;BY02d@Wt!mk8ebd zP%li5>baQ@b&pQrtczSFQ(HFyS?3?aw7PwmzOHV1@r4tZF@}=5-6(O7W47}@=TQpt z0_Rw!Ve{c8SU$mKL!uH>*)N4!o65C5;+hpKh{2^?APR#d5b500L|d^I~} zoo~?uK3mFzj`J<$Fi#N;94f|f!Z=RagJ$=W+>}%5?x@eDF4KIcl;)13#U{tGx<0S2 zG;bWI>9I?XXXtT*9?#aJp~v2|4fWI&d?**dNBw7DIcA~-#ppx{&f$uQQf#87=b;>% zF$Wi+0^9hezJhO3sJDUR##MBpa(B7k*FTQnF3i+KWc4Vld3&&B44+qry0qhbbO4GAqzH)&kzGlV zt$yFFTBKeRRI!Lk-oA$X`8kW|0q;QWxnsCn&E4twSCjis^84=7`UpW9_n!{8gK%Z@dbSXAGpiWjT7mQllVeg!N4}+QZ(Tj zH1kG28MjgDA)LZ{a21}%soI5ka93BIxQzIGemWs~$qA9=_dTNZXNX8-xM*|)YyH06 zNhXO5=J*Kcusum8i45l65illCXeRTCM3Q;g7@kVoyqHA?tftLtXmcAw-p=egjfrqN zt?r;zowT5f&*^Tygx8`UXE34HCvB>jGpCgM`Pg=B+UwZV@Ao~c52qF+l7};ypC83b z<9KBREB(G#lOiNCM1GJIsrLJRtVPN+ksd&PaHv-I8wX4p%)cdCM;)Nl3pdp-Ust^6XkKOjuyBUC=Bn?^M(Dj#Dm#+hpg zww56(zlE_F#s*xV6`u(QHkA!POvw&Vm;xY` z6`&|Pz>E|CsjL9S*#Ty!07zv6pbtb@79a2~VP{r8Ae9Y(KFA7icnW}2R)C`H07s+% zNM!{m&JIwm0hZ7NQj-9bs9Y6CIS#;)kjhlyV$TDg`T5w&Oud-b#3j7iw(&~a z&d#}wnR*#B^>TKQE7&QnWRKjz;=78uyMsHf;mWnR9@p_}>3ZDGFR^=Z119+YENCTcL;t7N2;D?Uv&_np5*8DsvKLH4%tV=VQgQ0r%3ft1*h{;MR6nJE(M;k@ z&GZBMQBCK9y-~Zf_uM_teeQYA%eU{JzXHf$BZMBp=&rkOI=P0g992^dFTSEQ1TSWBZGQ;lw{^vP1~xl_kRg4d*d zSn(qq>9W8Wt`NeW^p{n`u{=U3QQ)T&@2bGHzqy+S2Ygm@Cj@TbCadNDqAHudtsFux zvy-I|;)Jm-nQ<*3SFcw!e-gKKZv9$eLLdo)3uLxI!gzOm{-9=c>}i2Jm>~#`{Ze}N zdvm`kxq^w;$&$ur1?Dt9!1%6X$+B`yUs@WvD{${8l&dz)ciyJ6qv{%(7kGe&Ty4{` z2u7l)TbwqVembveb>&FM&nExp)ag7H$m&)Fb(8gNPXrd*4zHq`{dmf1w>k~tLSg1cn$O42ln=`Eg7j3M2u4i zBM?Y^LX^Le7A_fV#{(@~Pkq7UtJEoOonXpfN6HAckk(5^pP6dm{$9sEGFn(LVoNRL zKDOgM<23`pp_}NXD#BF5C^?uQg=wl|j^1FNTx7}Pg8A5>1~%!Kb*(b92hXv_HpV;R MfhzDi$#xy|1HOaclmGw# literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$projApplet.class b/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$projApplet.class new file mode 100644 index 0000000000000000000000000000000000000000..6a03e12b29729898dd93205ef6b71344e11d974b GIT binary patch literal 2416 zcma)8-A^1<6#reIEG)M`DgA`X_5-^>yCBtSORLi5Yug2}P_Xrb&hB28DYG-{%q-AW zYi+fDo9Kh_Bhf^SJQyFEl&!H^O?=Q8eb7WreemD#&3MkvvfBb}gxr}sbI$$U-}#+$ z&+JeCesvu{C*Jg-L}2qVJEoc48P_tcl$CLIq;2a|cRFn-*M~BJ4fGsWj-#8&_PAxM z_F>N`Q0`9Y&W;X&HPIy)U1U6#$y+ngdXA*Rsd;ggYf5BD`j! z#3nY^6wCukPfocNXb{*^3^HV;m6t^XOEv~ZjrbPO~l*L&k&al!AK-} zN}JKz4UL2uac$D4t7XiGtpW`Rr6tn(oHE*{)oF*6RqaRe6F&mj&VlX_XbeV+``#ih zAu;E>C3YexP%`ZhgXkS#yO?9EL>mjZ%2p&51MHRvanN<6-G`#R6OqC0{@#g!-bnwz zC==*Kc4Totx#Q`y71Ig+s_wK#>@N?}G?R@!)}Zx?TOuf%=WE8ue$0h<5U zS|5tIV*p zLbBzs^vS?!D-)R2OgG?K0ba@05C_mJ(T9Et zK25dY8pL2-aODz-(5Wld&e4qN>M7Mb7guRlw`kq!5m$>(4{GUr;g=w^c>3_nOq%>NQ~l`fImhwlD3sG z6C_hG(lW+zj!Qg-;{wuFW$^aE>rT6WK5H^rOq%+=hRUN z?t-%tb2v@Ck6u&93Uh&;m3W31t#Pen(okW|&||j7CBoKo63?-<%%KwH!}q+z1ze<@ zCv+!mXoQ|?gXG@XLy#x@2U}m3c!jOC&XhHKvyteISQ$I6`gCr@ z^-CIWh>MvDB4See2pbv&MFrt!IlXTMwo-_t^wANuwcPD#R!(nxsGw^lJ#9k?{R95i zwgtLeg}lt(sL6XmyiHHFsLuOGQART$*xGsp{wrAH-8R&1&Z3d$*AO^PFxwW;+?qv8 z5v`6^LcD`|@h-ND_pwuaKuFX!^T=-zKSmy66c4r8yY0%~YU{ITU%;N6!>y()?q5Kc z_pUjMhvrc^UU%qA^js#){pdkI1}ILBYBQ@KKBUjZN7VH`rpECJ2E?Zr6rbTR*(*`< z5Bhx=U^+(%^u|a=rWf)y*^@=>pF4J&PCSQOC2g!kd?vyqAi-SWTLIj}GwzrQ$~%6hBis ze!*e!D@Mg{7#F`o6Ms+x`4f(~fwST-To8Zf(o})+4k=|rHDSG)LwpUd)14b7eRlB% F#DDQ6P2>Oo literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class b/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class new file mode 100644 index 0000000000000000000000000000000000000000..a7b319e6b094c5872a6445f37bbabf59372b4ee1 GIT binary patch literal 11205 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 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/Vehicle.class b/Processing/Misc/UrbanAutonomous/build-tmp/Vehicle.class new file mode 100644 index 0000000000000000000000000000000000000000..e1e330b150849c861d5b93dd3471e7d6a474752c GIT binary patch literal 2820 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 unallocatedArrivalList; + public ArrayList unallocatedDepartureList; + public ArrayList unallocatedHubArrivalList; + public ArrayList unallocatedHubDepartureList; + boolean isHorizontalStreet; + public int[] unallocatedDemandSizeHistory; + public int missedDemand; + public int[] missedDemandHistory; + + public DemandStack() { + missedDemand = 0; + missedDemandHistory = new int[720]; + unallocatedArrivalList = new ArrayList(); + unallocatedDepartureList = new ArrayList(); + unallocatedHubArrivalList = new ArrayList(); + unallocatedHubDepartureList = new ArrayList(); + isHorizontalStreet = true; + unallocatedDemandSizeHistory = new int[720]; + for (int i = 0; i < 720; i++) + unallocatedDemandSizeHistory[i] = 0; + } + + public void init() { + missedDemand = 0; + missedDemandHistory = new int[720]; + unallocatedArrivalList = new ArrayList(); + unallocatedDepartureList = new ArrayList(); + unallocatedHubArrivalList = new ArrayList(); + unallocatedHubDepartureList = new ArrayList(); + isHorizontalStreet = true; + unallocatedDemandSizeHistory = new int[720]; + for (int i = 0; i < 720; i++) + unallocatedDemandSizeHistory[i] = 0; + } + + // Demand Generation + public void demandGen(int _numberOfDemand, int _updateInterval) { + if (UrbanAutonomous.simParam.currentTime % _updateInterval == 0) { + for (int i = 0; i < _numberOfDemand; i++) { + isHorizontalStreet = !isHorizontalStreet; + Demand tmpArrivalDemand = demandCreation(false); + Demand tmpDepartureDemand = demandCreation(true); + // Demand Clarification + if (UrbanAutonomous.simParam.hubEnable) { + if (isHubEffective(tmpArrivalDemand, tmpDepartureDemand)) { + unallocatedHubArrivalList.add(tmpArrivalDemand); + unallocatedHubDepartureList.add(tmpDepartureDemand);// departureDemand + } else { + unallocatedArrivalList.add(tmpArrivalDemand); + unallocatedDepartureList.add(tmpDepartureDemand);// departureDemand + } + } + } + } + } + + // DemandCreation + Demand demandCreation(boolean isDepartureDemand) { + while (true) { + Demand demandCandidate = demandCandidateGen(isHorizontalStreet, isDepartureDemand); + if (probabilityCheck(demandCandidate)) { + return demandCandidate; + } + } + } + + // Demand Candidate Generation + Demand demandCandidateGen(boolean isHorizontalStreet, boolean isDepartureDemand) { + Demand _demandCandidate; + if (isHorizontalStreet) { + int streetNumber = (int) random(16); + int y = streetNumber * 5 + 2; + int x = (int) random(80); + _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); + } else { + int streetNumber = (int) random(16); + int x = streetNumber * 5 + 2; + int y = (int) random(80); + _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); + } + return _demandCandidate; + } + + // probability check + boolean probabilityCheck(Demand _demandCandidate) { + boolean determination = false; + float sum = 0; + float avgProbability; + if (_demandCandidate.isDepartureDemand) { + if (_demandCandidate.isHorizontalStreet) { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 2].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 1].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 1].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 2].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } else { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x + - 2][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + - 1][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 1][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 2][_demandCandidate.y].departureProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } + } else { + if (_demandCandidate.isHorizontalStreet) { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 2].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + - 1].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 1].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x][_demandCandidate.y + + 2].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } else { + sum = UrbanAutonomous.simCoordinate[_demandCandidate.x + - 2][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + - 1][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 1][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone] + + UrbanAutonomous.simCoordinate[_demandCandidate.x + + 2][_demandCandidate.y].arrivalProbabilityArray[UrbanAutonomous.simParam.currentTimeZone]; + } + } + if (sum != 0) { + avgProbability = sum * 100 / 4; + if ((int) random(1 / (avgProbability / 100)) == 0) + determination = true; + } + return determination; + } + + // DemandAllocation for Hub + public void demandHubAllocation() { + if (unallocatedHubListIsNotEmpty()) { + if (UrbanAutonomous.hubStack.hubPeripheralVehicleA.status == PeripheralVehicleStatus.STOP) { + for (int i = 0; i < unallocatedHubDepartureList.size(); i++) { + if (fromHubAtoB(unallocatedHubArrivalList.get(i), unallocatedHubDepartureList.get(i))) { + UrbanAutonomous.hubStack.hubPeripheralVehicleA.status = PeripheralVehicleStatus.DEPARTURE; + UrbanAutonomous.hubStack.hubPeripheralVehicleA.departureList + .add(unallocatedHubDepartureList.remove(i)); + UrbanAutonomous.hubStack.hubPeripheralVehicleA.reserveArrivalList + .add(unallocatedHubArrivalList.remove(i)); + } + } + } + if (UrbanAutonomous.hubStack.hubPeripheralVehicleB.status == PeripheralVehicleStatus.STOP) { + for (int i = 0; i < unallocatedHubDepartureList.size(); i++) { + if (fromHubBtoA(unallocatedHubArrivalList.get(i), unallocatedHubDepartureList.get(i))) { + UrbanAutonomous.hubStack.hubPeripheralVehicleB.status = PeripheralVehicleStatus.DEPARTURE; + UrbanAutonomous.hubStack.hubPeripheralVehicleB.departureList + .add(unallocatedHubDepartureList.remove(i)); + UrbanAutonomous.hubStack.hubPeripheralVehicleB.reserveArrivalList + .add(unallocatedHubArrivalList.remove(i)); + } + } + } + } + } + + boolean hubPeripheralVehicleIsEmpty(HubPeripheralVehicle v) { + boolean result = false; + if (v.arrivalList.size() == 0 && v.departureList.size() == 0 && v.reserveArrivalList.size() == 0) + result = true; + return result; + } + + boolean unallocatedHubListIsNotEmpty() { + boolean result = false; + if (unallocatedHubDepartureList.size() > 0 || unallocatedHubArrivalList.size() > 0) { + result = true; + } + return result; + } + + // DemandAllocation except hub + public void demandAllocation() { + if (unallocatedDepartureList.size() > 0 || unallocatedArrivalList.size() > 0) { + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + if (vehicle.arrivalList.size() == 0 && vehicle.departureList.size() == 0) { + while (vehicle.arrivalList.size() < UrbanAutonomous.simParam.capacityOfVehicle + && vehicle.departureList.size() < UrbanAutonomous.simParam.capacityOfVehicle) { + if (unallocatedDepartureList.size() > 0 || unallocatedArrivalList.size() > 0) { + vehicle.arrivalList.add(unallocatedArrivalList.get(0)); + vehicle.departureList.add(unallocatedDepartureList.get(0)); + unallocatedArrivalList.remove(0); + unallocatedDepartureList.remove(0); + } else { + break; + } + } + } + } + } + } + + // Hub effectiveCheck + boolean isHubEffective(Demand arrivalDemand, Demand departureDemand) { + boolean result = false; + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + return result; + } + + // fromHubA to fromHubB + boolean fromHubBtoA(Demand arrivalDemand, Demand departureDemand) { + boolean result = false; + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + return result; + } + + // fromHubA to fromHubB + boolean fromHubAtoB(Demand arrivalDemand, Demand departureDemand) { + boolean result = false; + if (arrivalDemand.x > UrbanAutonomous.hubStack.hubB.x - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.x < UrbanAutonomous.hubStack.hubB.x + UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y > UrbanAutonomous.hubStack.hubB.y - UrbanAutonomous.simParam.hubEffectiveLength + && arrivalDemand.y < UrbanAutonomous.hubStack.hubB.y + UrbanAutonomous.simParam.hubEffectiveLength) + if (departureDemand.x > UrbanAutonomous.hubStack.hubA.x - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.x < UrbanAutonomous.hubStack.hubA.x + UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y > UrbanAutonomous.hubStack.hubA.y - UrbanAutonomous.simParam.hubEffectiveLength + && departureDemand.y < UrbanAutonomous.hubStack.hubA.y + UrbanAutonomous.simParam.hubEffectiveLength) + result = true; + return result; + } + + // DemandLifeTime + public void demandLifetimeControl() { + if (unallocatedArrivalList.size() > 0) { + Iterator iter = unallocatedArrivalList.iterator(); + while (iter.hasNext()) { + Demand tmpDemand = iter.next(); + if (tmpDemand.lifetime == 0) { + iter.remove(); + missedDemand++; + // missedDemandHistory[UrbanAutonomous.simParam.currentTime/20]=missedDemand; + } else { + tmpDemand.lifetime -= 1; + } + } + missedDemandHistory[UrbanAutonomous.simParam.currentTime / 20] = missedDemand; + iter = unallocatedDepartureList.iterator(); + while (iter.hasNext()) { + Demand tmpDemand = iter.next(); + if (tmpDemand.lifetime == 0) { + iter.remove(); + } else { + tmpDemand.lifetime -= 1; + } + } + } + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java new file mode 100644 index 0000000..0cc9bfa --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java @@ -0,0 +1,180 @@ + + +import processing.core.PApplet; +import processing.core.PConstants; +import processing.core.PGraphics; +//import com.y; + +public class Disp { + PApplet pa; + PGraphics p; + + //public Disp(PApplet _pa) { + public Disp(PGraphics _p,PApplet _pa) { + p = _p; + pa = _pa; + } + + // ShowALl + public void show() { + // showMap(); + p.beginDraw(); + oldshowMap(); + showUnallocatedDemand(); + showAllocatedDemand(); + showVehicle(); + showCongestion(); + if (UrbanAutonomous.simParam.hubEnable) { + showHub(); + showHubVehicle(); + showHubPeripheralVehicle(); + showHubRelocation(); + } + p.endDraw(); + } + //ShowHubRelocation + void showHubRelocation(){ + if (UrbanAutonomous.dragStatus == DragStatus.HUBA || UrbanAutonomous.dragStatus == DragStatus.HUBB) { + p.ellipseMode(PConstants.CENTER); + p.stroke(UrbanAutonomous.hubColor); + p.ellipse(pa.mouseX, pa.mouseY, 10, 10); + } + } + + // ShowMap + void oldshowMap() { + for (int y = 0; y < 16; y++) + for (int x = 0; x < 16; x++) + p.image(UrbanAutonomous.mapBlockStack.mapBlockArray[x][y].pg, x * 50, y * 50); + } + + void showMap() { + p.image(UrbanAutonomous.mapBlockStack.pg, 0, 0); + } + + // ShowDemand + // ShowUnallocatedDemand + void showUnallocatedDemand() { + for (Demand tmpDemand : UrbanAutonomous.demandStack.unallocatedArrivalList) { + showEachDemand(tmpDemand); + } + for (Demand tmpDemand : UrbanAutonomous.demandStack.unallocatedDepartureList) { + showEachDemand(tmpDemand); + } + } + + // ShowAllocatedDemand + void showAllocatedDemand() { + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + for (Demand tmpDemand : vehicle.arrivalList) { + showEachAllocatedDemand(tmpDemand); + } + for (Demand tmpDemand : vehicle.departureList) { + showEachAllocatedDemand(tmpDemand); + } + } + } + + void showEachAllocatedDemand(Demand tmpDemand) { + p.ellipseMode(PConstants.CENTER); + if (tmpDemand.isDepartureDemand) + p.fill(UrbanAutonomous.allocatedDepartureColor); + else + p.fill(UrbanAutonomous.allocatedArrivalColor); + p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 5, 5); + } + + void showEachDemand(Demand tmpDemand) { + p.ellipseMode(PConstants.CENTER); + if (tmpDemand.isDepartureDemand) + p.fill(UrbanAutonomous.unallocatedDepartureColor); + else + p.fill(UrbanAutonomous.unallocatedArrivalColor); + p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 5, 5); + } + + // ShowVehicle + void showVehicle() { + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + p.ellipseMode(PConstants.CENTER); + p.fill(UrbanAutonomous.vehicleColor); + p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 15, 15); + } + } + + // Show Congestion + void showCongestion() { + int totalCongestionLevel = 0; + // Vehicle + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + for (Demand position : vehicle.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + } + if (UrbanAutonomous.simParam.hubEnable) { + // HubVehicle + for (Coord position : UrbanAutonomous.hubStack.hubVehicleArray[0].movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + // HubPeripheralVehicle + for (Coord position : UrbanAutonomous.hubStack.hubPeripheralVehicleA.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + for (Coord position : UrbanAutonomous.hubStack.hubPeripheralVehicleB.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + } + UrbanAutonomous.simParam.totalCongestionLevel[UrbanAutonomous.simParam.currentTime / 20] = totalCongestionLevel; + UrbanAutonomous.simParam.currentTotalCongestionLevel = totalCongestionLevel; + } + + // oldShow Congestion + void oldshowCongestion() { + int totalCongestionLevel = 0; + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + for (Demand position : vehicle.movingHistoryList) { + p.image(UrbanAutonomous.congestionImg, position.x * 10, position.y * 10); + totalCongestionLevel++; + } + } + UrbanAutonomous.simParam.totalCongestionLevel[UrbanAutonomous.simParam.currentTime / 20] = totalCongestionLevel; + UrbanAutonomous.simParam.currentTotalCongestionLevel = totalCongestionLevel; + } + + // Show Hub + void showHub() { + p.ellipseMode(PConstants.CENTER); + p.rectMode(PConstants.CENTER); + for (int i = 0; i < UrbanAutonomous.hubStack.hubArray.length; i++) { + p.fill(UrbanAutonomous.hubColor); + p.ellipse(UrbanAutonomous.hubStack.hubArray[i].x * 10 + 5, UrbanAutonomous.hubStack.hubArray[i].y * 10 + 5, 15, 15); + p.fill(UrbanAutonomous.hubEffectiveLengthColor); + p.rect(UrbanAutonomous.hubStack.hubArray[i].x * 10 + 5, UrbanAutonomous.hubStack.hubArray[i].y * 10 + 5, + UrbanAutonomous.simParam.hubEffectiveLength * 10 * 2, UrbanAutonomous.simParam.hubEffectiveLength * 10 * 2); + } + } + + // Show HubVehicle + void showHubVehicle() { + p.ellipseMode(PConstants.CENTER); + p.fill(UrbanAutonomous.hubVehicleColor); + for (int i = 0; i < UrbanAutonomous.hubStack.hubVehicleArray.length; i++) { + p.ellipse(UrbanAutonomous.hubStack.hubVehicleArray[i].x * 10 + 5, UrbanAutonomous.hubStack.hubVehicleArray[i].y * 10 + 5, + 15, 15); + } + } + + // Show HubPeripheralVehicle + void showHubPeripheralVehicle() { + p.ellipseMode(PConstants.CENTER); + p.fill(UrbanAutonomous.hubPeripheralVehicleColor); + p.ellipse(UrbanAutonomous.hubStack.hubPeripheralVehicleA.x * 10 + 5, + UrbanAutonomous.hubStack.hubPeripheralVehicleA.y * 10 + 5, 15, 15); + p.ellipse(UrbanAutonomous.hubStack.hubPeripheralVehicleB.x * 10 + 5, + UrbanAutonomous.hubStack.hubPeripheralVehicleB.y * 10 + 5, 15, 15); + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/DragStatus.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/DragStatus.java new file mode 100644 index 0000000..20b1e51 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/DragStatus.java @@ -0,0 +1,16 @@ +public enum DragStatus { + NORMAL(1), + HUBA(2), + HUBB(3); + + private final int id; + + private DragStatus(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java new file mode 100644 index 0000000..f0ca7f7 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java @@ -0,0 +1,15 @@ + +import processing.core.PApplet; + +public class FileControl extends PApplet { + public int [] customMap; + + public FileControl() { + customMap = new int[(16*16)]; + } + + public void outputCSV() { + String []outData=str(customMap); + saveStrings("customMap.txt", outData); + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/Hub.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/Hub.java new file mode 100644 index 0000000..d31f003 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/Hub.java @@ -0,0 +1,48 @@ + +import java.util.ArrayList; + +public class Hub { + public int x; + public int y; + public boolean isHorizontalStreet; + public boolean isIntersection; + public int streetNumber; + public ArrayList unallocatedArrivalList; + public ArrayList hubVehicleWaitingList; + + public Hub(int _x, int _y) { + x = _x; + y = _y; + unallocatedArrivalList = new ArrayList(); + hubVehicleWaitingList = new ArrayList(); + paramUpdate(); + } + + void paramUpdate() { + isHorizontalStreet = false; + isIntersection = false; + streetNumber = 0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet = true; + streetNumber = ((y + 5 - 2) / 5) - 1; + } else { + streetNumber = ((x + 5 - 2) / 5) - 1; + } + if (isVerticalStreetCheck() && isHorizontalStreetCheck()) + isIntersection = true; + } + + boolean isHorizontalStreetCheck() { + boolean result = false; + if ((y - 2 + 5) % 5 == 0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result = false; + if ((x - 2 + 5) % 5 == 0) + result = true; + return result; + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/HubPeripheralVehicle.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/HubPeripheralVehicle.java new file mode 100644 index 0000000..3e2e6b3 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/HubPeripheralVehicle.java @@ -0,0 +1,237 @@ + +import java.util.ArrayList; + +import processing.core.PApplet; + +public class HubPeripheralVehicle { + public int x; + public int y; + public int streetNumber; + public boolean isHorizontalStreet; + public boolean isIntersection; + public boolean forHubA; + + public ArrayList departureList; + public ArrayList reserveArrivalList; + public ArrayList arrivalList; + public ArrayList movingHistoryList; + PApplet p; + public PeripheralVehicleStatus status; + + public HubPeripheralVehicle(int _x, int _y, PApplet _p, boolean _forHubA) { + status = PeripheralVehicleStatus.STOP; + x = _x; + y = _y; + p = _p; + forHubA = _forHubA; + departureList = new ArrayList(); + arrivalList = new ArrayList(); + reserveArrivalList = new ArrayList(); + movingHistoryList = new ArrayList(); + } + + // Parameter Update + void paramUpdate() { + isHorizontalStreet = false; + isIntersection = false; + streetNumber = 0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet = true; + streetNumber = ((y + 5 - 2) / 5) - 1; + } else { + streetNumber = ((x + 5 - 2) / 5) - 1; + } + if (isVerticalStreetCheck() && isHorizontalStreetCheck()) + isIntersection = true; + } + + boolean isHorizontalStreetCheck() { + boolean result = false; + if ((y - 2 + 5) % 5 == 0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result = false; + if ((x - 2 + 5) % 5 == 0) + result = true; + return result; + } + + // Vehicle Movement + public void move() { + paramUpdate(); + movingHistoryUpdate(); + switch (status) { + case STOP: + break; + case DEPARTURE: + eachMove(departureList); + break; + case TOHUB: + if (forHubA) + goToHub(UrbanAutonomous.hubStack.hubA); + else + goToHub(UrbanAutonomous.hubStack.hubB); + break; + case ARRIVAL: + eachMove(arrivalList); + break; + default: + break; + } + } + + void movingHistoryUpdate() { + Coord tmpVehiclePosition = new Coord(x, y); + if (status == PeripheralVehicleStatus.STOP) { + if (movingHistoryList.size() > 0) + movingHistoryList.remove(0); + } else if (movingHistoryList.size() >= UrbanAutonomous.simParam.vehicleHistorySize) + movingHistoryList.remove(0); + else + movingHistoryList.add(tmpVehiclePosition); + } + + void eachMove(ArrayList tmpList) { + if (isSamePoint(tmpList.get(0))) { + tmpList.remove(0); + if (tmpList.size() == 0) + if (status == PeripheralVehicleStatus.DEPARTURE) + status = PeripheralVehicleStatus.TOHUB; + else if (status == PeripheralVehicleStatus.ARRIVAL) + status = PeripheralVehicleStatus.STOP; + } else if (isSameStreet(tmpList.get(0))) { + if (tmpList.get(0).isHorizontalStreet) + x += (tmpList.get(0).x - x) / p.abs(tmpList.get(0).x - x); + else + y += (tmpList.get(0).y - y) / p.abs(tmpList.get(0).y - y); + } else { + if (isIntersection) { + if (tmpList.get(0).isHorizontalStreet) + y += (tmpList.get(0).y - y) / p.abs(tmpList.get(0).y - y); + else + x += (tmpList.get(0).x - x) / p.abs(tmpList.get(0).x - x); + } else { + if (isHorizontalStreet) { + if (tmpList.get(0).isHorizontalStreet) { + if (x > 77) { + x -= 1; + } else { + x += 1; + } + } else { + x += (tmpList.get(0).x - x) / p.abs(tmpList.get(0).x - x); + } + } else { + if (tmpList.get(0).isHorizontalStreet) { + y += (tmpList.get(0).y - y) / p.abs(tmpList.get(0).y - y); + } else { + if (y > 77) { + y -= 1; + } else { + y += 1; + } + } + } + } + } + } + + void goToHub(Hub tmpHub) { + if (isSamePoint(tmpHub)) { + tmpHub.hubVehicleWaitingList.addAll(reserveArrivalList); + reserveArrivalList = new ArrayList(); + if (tmpHub.unallocatedArrivalList.size() > 0) { + status = PeripheralVehicleStatus.ARRIVAL; + while (arrivalList.size() < UrbanAutonomous.simParam.capacityOfPeripheralVehicle + || tmpHub.unallocatedArrivalList.size() > 0) { + arrivalList.add(tmpHub.unallocatedArrivalList.remove(0)); + } + } else { + status = PeripheralVehicleStatus.STOP; + } + } else if (isSameStreet(tmpHub)) { + if (tmpHub.isHorizontalStreet) + x += (tmpHub.x - x) / p.abs(tmpHub.x - x); + else + y += (tmpHub.y - y) / p.abs(tmpHub.y - y); + } else { + if (isIntersection) { + if (tmpHub.isHorizontalStreet) + y += (tmpHub.y - y) / p.abs(tmpHub.y - y); + else + x += (tmpHub.x - x) / p.abs(tmpHub.x - x); + } else { + if (isHorizontalStreet) { + if (tmpHub.isHorizontalStreet) { + if (x > 77) { + x -= 1; + } else { + x += 1; + } + } else { + x += (tmpHub.x - x) / p.abs(tmpHub.x - x); + } + } else { + if (tmpHub.isHorizontalStreet) { + y += (tmpHub.y - y) / p.abs(tmpHub.y - y); + } else { + if (y > 77) { + y -= 1; + } else { + y += 1; + } + } + } + } + } + } + + boolean isSameStreet(Demand tmpDemand) { + boolean result = false; + if (tmpDemand.streetNumber == streetNumber && tmpDemand.isHorizontalStreet == isHorizontalStreet) + result = true; + else if (isIntersection) { + if (tmpDemand.isHorizontalStreet) { + if ((((y - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } else { + if ((((x - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } + } + return result; + } + + boolean isSamePoint(Demand tmpDemand) { + boolean result = false; + if (tmpDemand.x == x && tmpDemand.y == y) + result = true; + return result; + } + + boolean isSameStreet(Hub tmpDemand) { + boolean result = false; + if (tmpDemand.streetNumber == streetNumber && tmpDemand.isHorizontalStreet == isHorizontalStreet) + result = true; + else if (isIntersection) { + if (tmpDemand.isHorizontalStreet) { + if ((((y - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } else { + if ((((x - 2 + 5) / 5) - 1) == tmpDemand.streetNumber) + result = true; + } + } + return result; + } + + boolean isSamePoint(Hub tmpDemand) { + boolean result = false; + if (tmpDemand.x == x && tmpDemand.y == y) + result = true; + return result; + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/HubStack.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/HubStack.java new file mode 100644 index 0000000..980eafb --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/HubStack.java @@ -0,0 +1,36 @@ +import processing.core.PApplet; + +public class HubStack { + public PApplet p; + public Hub hubA; + public Hub hubB; + public int ax,ay,bx,by; + public static HubVehicle hubVehicleA; + public Hub [] hubArray; + public HubVehicle [] hubVehicleArray; + public HubPeripheralVehicle hubPeripheralVehicleA,hubPeripheralVehicleB; + + public HubStack(PApplet _p) { + p=_p; + ax=72; + ay=7; + bx=7; + by=72; + hubA = new Hub(ax, ay); + hubB = new Hub(bx, by); + hubArray = new Hub[]{hubA,hubB}; + hubVehicleA = new HubVehicle(0,0,p); + hubVehicleArray = new HubVehicle[]{hubVehicleA}; + hubPeripheralVehicleA = new HubPeripheralVehicle(0,0,p,true); + hubPeripheralVehicleB = new HubPeripheralVehicle(0,0,p,false); + } + public void init(){ + hubA = new Hub(ax, ay); + hubB = new Hub(bx, by); + hubArray = new Hub[]{hubA,hubB}; + hubVehicleA = new HubVehicle(0,0,p); + hubVehicleArray = new HubVehicle[]{hubVehicleA}; + hubPeripheralVehicleA = new HubPeripheralVehicle(0,0,p,true); + hubPeripheralVehicleB = new HubPeripheralVehicle(0,0,p,false); + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/HubVehicle.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/HubVehicle.java new file mode 100644 index 0000000..8f24dd8 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/HubVehicle.java @@ -0,0 +1,167 @@ +import java.util.ArrayList; + + +import processing.core.PApplet; + +public class HubVehicle { + + public int x; + public int y; + public int streetNumber; + public boolean isHorizontalStreet; + public boolean isIntersection; + public boolean toHubA; + ArrayList arrivalList; + public ArrayList movingHistoryList; + PApplet p; + + public HubVehicle(int _x, int _y, PApplet _p) { + x = _x; + y = _y; + p = _p; + toHubA = false; + arrivalList = new ArrayList(); + movingHistoryList = new ArrayList(); + } + + // Parameter Update + void paramUpdate() { + isHorizontalStreet = false; + isIntersection = false; + streetNumber = 0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet = true; + streetNumber = ((y + 5 - 2) / 5) - 1; + } else { + streetNumber = ((x + 5 - 2) / 5) - 1; + } + if (isVerticalStreetCheck() && isHorizontalStreetCheck()) + isIntersection = true; + } + + boolean isHorizontalStreetCheck() { + boolean result = false; + if ((y - 2 + 5) % 5 == 0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result = false; + if ((x - 2 + 5) % 5 == 0) + result = true; + return result; + } + + // Vehicle Movement + public void move() { + paramUpdate(); + movingHistoryUpdate(); + eachMove(); + } + + void movingHistoryUpdate() { + Coord tmpVehiclePosition = new Coord(x, y); + if (!(isInHub())) + movingHistoryList.add(tmpVehiclePosition); + if (isInHub() && movingHistoryList.size() > 0) + movingHistoryList.remove(0); + if (movingHistoryList.size() >= UrbanAutonomous.simParam.vehicleHistorySize) + movingHistoryList.remove(0); + } + + boolean isInHub() { + boolean result = false; + if (UrbanAutonomous.hubStack.hubA.y == y && UrbanAutonomous.hubStack.hubA.y == y) + result = true; + if (UrbanAutonomous.hubStack.hubB.y == y && UrbanAutonomous.hubStack.hubB.y == y) + result = true; + return result; + } + + void eachMove() { + if (toHubA) + eachSubMove(UrbanAutonomous.hubStack.hubA); + else + eachSubMove(UrbanAutonomous.hubStack.hubB); + } + + boolean hubIsNotEmpty() { + boolean result = false; + if (UrbanAutonomous.hubStack.hubA.hubVehicleWaitingList.size() > 0 + || UrbanAutonomous.hubStack.hubB.hubVehicleWaitingList.size() > 0) + result = true; + return result; + } + + void eachSubMove(Hub hubX) { + if (isSamePoint(hubX)) { + hubX.unallocatedArrivalList.addAll(arrivalList); + if (hubIsNotEmpty()) { + toHubA = !toHubA; + arrivalList = new ArrayList(); + while (arrivalList.size() < UrbanAutonomous.simParam.hubDedicatedVehicleCapacity + && hubX.hubVehicleWaitingList.size() != 0) { + arrivalList.add(hubX.hubVehicleWaitingList.get(0)); + } + } + } else if (isSameStreet(hubX)) { + if (hubX.isHorizontalStreet) + x += (hubX.x - x) / p.abs(hubX.x - x); + else + y += (hubX.y - y) / p.abs(hubX.y - y); + } else { + if (isIntersection) { + if (hubX.isHorizontalStreet) + y += (hubX.y - y) / p.abs(hubX.y - y); + else + x += (hubX.x - x) / p.abs(hubX.x - x); + } else { + if (isHorizontalStreet) { + if (hubX.isHorizontalStreet) { + if (x > 77) { + x -= 1; + } else { + x += 1; + } + } else { + x += (hubX.x - x) / p.abs(hubX.x - x); + } + } else { + if (hubX.isHorizontalStreet) { + y += (hubX.y - y) / p.abs(hubX.y - y); + } else { + if (y > 77) { + y -= 1; + } else { + y += 1; + } + } + } + } + } + } + + boolean isSameStreet(Hub hubA) { + boolean result = false; + if (hubA.streetNumber == streetNumber && hubA.isHorizontalStreet == isHorizontalStreet) + result = true; + else if (isIntersection) { + if (hubA.isHorizontalStreet) { + if ((((y - 2 + 5) / 5) - 1) == hubA.streetNumber) + result = true; + } else { + if ((((x - 2 + 5) / 5) - 1) == hubA.streetNumber) + result = true; + } + } + return result; + } + + boolean isSamePoint(Hub hub) { + boolean result = false; + if (hub.x == x && hub.y == y) + result = true; + return result; + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlock.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlock.java new file mode 100644 index 0000000..27fcb68 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlock.java @@ -0,0 +1,59 @@ + +import processing.core.PApplet; +import processing.core.PGraphics; + +public class MapBlock { + PApplet p; + int blockSize; + Tile[][] tileArray; + public PGraphics pg; + + public MapBlock() { + } + + public MapBlock(PApplet _p) { + p = _p; + } + + public MapBlock(PApplet _p, Tile[][] _tileArray) { + p = _p; + blockSize = 5; + tileArray = _tileArray; + gen(); + } + + void gen() { + if (pg == null) + pg = p.createGraphics(blockSize * 10, blockSize * 10); + pg.beginDraw(); + pg.background(255); + pg.stroke(255); + for (int y = 0; y < blockSize; y++) { + for (int x = 0; x < blockSize; x++) { + switch (tileArray[x][y].tileType) { + case HW: + pg.image(UrbanAutonomous.hwImg, x * 10, y * 10); + break; + case LW: + pg.image(UrbanAutonomous.lwImg, x * 10, y * 10); + break; + case HR: + pg.image(UrbanAutonomous.hrImg, x * 10, y * 10); + break; + case LR: + pg.image(UrbanAutonomous.lrImg, x * 10, y * 10); + break; + case ROAD: + pg.image(UrbanAutonomous.roadImg, x * 10, y * 10); + break; + case INTERSECTION: + pg.image(UrbanAutonomous.intersectionImg, x * 10, y * 10); + break; + default: + break; + } + } + } + pg.endDraw(); + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBase.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBase.java new file mode 100644 index 0000000..0503839 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBase.java @@ -0,0 +1,67 @@ + + +import processing.core.PApplet; + +public class MapBlockBase { + MapBlockBase() {} + + //RandomMapBlock + Tile[][] randomTileArrayGen(PApplet p) { + Tile[][] tileArray=new Tile[5][5]; + Tile [] basicTileArray= { + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + }; + for (int y=0; y<5; y++) { + for (int x=0; x<5; x++) { + if (x==2&&y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.intersectionTile; + else if (x==2||y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.roadTile; + else { + tileArray[x][y]=basicTileArray[(int) p.random(4)]; + } + } + } + return tileArray; + } + + //SpecificTile + Tile[][] specificTileArrayGen(int number) { + Tile[][] tileArray=new Tile[5][5]; + Tile [] basicTileArray= { + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + }; + for (int y=0; y<5; y++) { + for (int x=0; x<5; x++) { + if (x==2&&y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.intersectionTile; + else if (x==2||y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.roadTile; + else { + tileArray[x][y]=basicTileArray[number]; + } + } + } + return tileArray; + } + + Tile[][] specificTileArrayGen(PApplet p) { + int number=(int)p.random(4); + Tile[][] tileArray=new Tile[5][5]; + Tile [] basicTileArray= { + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + }; + for (int y=0; y<5; y++) { + for (int x=0; x<5; x++) { + if (x==2&&y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.intersectionTile; + else if (x==2||y==2) + tileArray[x][y]=UrbanAutonomous.basicTile.roadTile; + else { + tileArray[x][y]=basicTileArray[number]; + } + } + } + return tileArray; + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBrushs.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBrushs.java new file mode 100644 index 0000000..f835ae1 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockBrushs.java @@ -0,0 +1,53 @@ +import processing.core.PApplet; +import processing.core.PGraphics; + +public class MapBlockBrushs extends MapBlockBase { + public MapBlock[] randomBrushs; + public MapBlock[] specificBrushs; + public MapBlock selectedBrush; + public int numberOfBrush; + public PGraphics pg; + PApplet p; + + public MapBlockBrushs(PApplet _p,int _numberOfBrush) { + p=_p; + randomBrushs = new MapBlock[_numberOfBrush]; + specificBrushs = new MapBlock[_numberOfBrush]; + numberOfBrush=_numberOfBrush; + randomBrushsGen(_numberOfBrush); + specificBrushsGen(); + selectedBrush = specificBrushs[0]; + } + + public void randomBrushsGen(int _numberOfBrush) { + for (int i=0; i<_numberOfBrush; i++) { + randomBrushs[i] = new MapBlock(p,randomTileArrayGen(p)); + } + } + public void randomBrushsGen() { + for (int i=0; i1130 && mouseX <1850) { + if (mouseY >150-50 && mouseY<150+50) { + UrbanAutonomous.simParam.currentTime=(mouseX-1130)*20 ; + } + } + //save file for custom map + if (mouseX > 200 && mouseX<300) + if (mouseY> 200 && mouseY<230) + UrbanAutonomous.fileControl.outputCSV(); + + //MAP + if (mouseX > 50 && mouseX<200) { + if (mouseY> 100 && mouseY<130) { + UrbanAutonomous.mapBlockStack.loadUrbanMap(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } else if (mouseY> 150 && mouseY<180) { + UrbanAutonomous.mapBlockStack.loadRuralMap(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } else if (mouseY> 200 && mouseY<230) { + UrbanAutonomous.mapBlockStack.noneMapGen(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } + } + //MAP change brush + if (mouseX >50 && mouseX <200) { + if (mouseY >530 && mouseY<600) { + UrbanAutonomous.mapBlockBrushs.randomBrushsGen(); + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + } + } + //Map Brush select + if (mouseX >50 && mouseX <100) { + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + if (mouseY >250 && mouseY<300) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + UrbanAutonomous.brushNumber=0; + } else if (mouseY >320 && mouseY<370) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[1]; + UrbanAutonomous.brushNumber=1; + } else if (mouseY >390 && mouseY<440) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[2]; + UrbanAutonomous.brushNumber=2; + } else if (mouseY >460 && mouseY<510) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; + UrbanAutonomous.brushNumber=3; + } + } else if (mouseX >150 && mouseX <200) { + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + if (mouseY >250 && mouseY<300) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[0]; + } else if (mouseY >320 && mouseY<370) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[1]; + } else if (mouseY >390 && mouseY<440) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[2]; + } else if (mouseY >460 && mouseY<510) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[3]; + } + } + + + int offsetSecond=580; + //Fleet Demand + + if (mouseX > offsetSecond && mouseX<= offsetSecond+200) { + //Fleet Size + + //number of vehicle + if (mouseY>100 && mouseY <100+30) { + UrbanAutonomous.simParam.numberOfVehicle=(int)((mouseX-offsetSecond)/2); + UrbanAutonomous.vehicleStack.vehicleGen(); + } + + //capacity of vehicle + else if (mouseY>171 && mouseY<170+30) { + UrbanAutonomous.simParam.capacityOfVehicle=(int)((mouseX-offsetSecond)/2); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseY>520 && mouseY<520+30) { + //currentDemandSize + UrbanAutonomous.simParam.currentDemandSize=(int)((mouseX-offsetSecond)/2); + } else if (mouseY>630 && mouseY<630+30) { + //demandInterval + UrbanAutonomous.simParam.demandInterval=(int)((mouseX-offsetSecond)/2); + } else if (mouseY>700 && mouseY<700+30) { + //demandLifetime + UrbanAutonomous.simParam.demandLifetime=(int)((mouseX-offsetSecond)/2); + } + } + + //FleetPreset Button + if (mouseY>340 && mouseY<340+30) { + if (mouseX>420 && mouseX<420+100) { + //PEV + UrbanAutonomous.simParam.numberOfVehicle=80; + UrbanAutonomous.simParam.capacityOfVehicle=1; + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseX>550 && mouseX<550+100) { + //Car + UrbanAutonomous.simParam.numberOfVehicle=20; + UrbanAutonomous.simParam.capacityOfVehicle=4; + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseX>680 && mouseX<680+100) { + //Bus + UrbanAutonomous.simParam.numberOfVehicle=1; + UrbanAutonomous.simParam.capacityOfVehicle=80; + UrbanAutonomous.vehicleStack.vehicleGen(); + } + } + + //DemandSize preset + if (mouseX>300 && mouseX<780) { + if (mouseY > 450 && mouseY<480) { + UrbanAutonomous.simParam.demandSizeCustom=false; + } else if (mouseY > 520 && mouseY<550) { + UrbanAutonomous.simParam.demandSizeCustom=true; + } + } + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/PFrame.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/PFrame.java new file mode 100644 index 0000000..2532419 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/PFrame.java @@ -0,0 +1,14 @@ + +import javax.swing.JFrame; + + + +public class PFrame extends JFrame { + public PFrame(int _x, int _y, int _width, int _height) { + setBounds(_x, _y, _width, _height); + UrbanAutonomous.opw = new OperationWindow(); + add(UrbanAutonomous.opw); + UrbanAutonomous.opw.init(); + setVisible(true); + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/PeripheralVehicleStatus.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/PeripheralVehicleStatus.java new file mode 100644 index 0000000..9c4478c --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/PeripheralVehicleStatus.java @@ -0,0 +1,18 @@ + +public enum PeripheralVehicleStatus { + STOP(1), + DEPARTURE(2), + TOHUB(3), + ARRIVAL(4); + + private final int id; + + private PeripheralVehicleStatus(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java new file mode 100644 index 0000000..f576c38 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java @@ -0,0 +1,66 @@ + +public class SimParam { + //Vehicle + public int numberOfVehicle; + public int capacityOfVehicle; + //Congestion + public int[] totalCongestionLevel; + public int currentTotalCongestionLevel; + public int vehicleHistorySize; + //Time + public int currentTime; //0-14400 + public int currentTimeZone; + //Demand + public int[] demandSizeArray; + public int currentDemandSize; + public int demandInterval;// unit:min (=#ofstep/10) + public int demandLifetime;// unit:min + public boolean demandSizeCustom; + //Hub + public boolean hubEnable; + public int hubEffectiveLength; + public int hubDedicatedVehicleCapacity; + public int capacityOfPeripheralVehicle; + //Map + public int mapType;// 0:urban,1:Rural,2:custom + + public SimParam() { + hubEnable=true; + demandSizeCustom = false; + mapType = 1; + currentTimeZone = 0; + currentTime = -1; + capacityOfVehicle = 4; + numberOfVehicle = 1; + currentDemandSize = 0; + demandInterval = 10; + vehicleHistorySize = 30; + currentTotalCongestionLevel = 0; + totalCongestionLevel = new int[720]; + demandSizeArray = new int[] { 5, 5, 5, 5, 5, 10, 20, 50, 50, 20, 10, 10, 20, 10, 20, 30, 50, 50, 50, 30, 20, 10, 10, 10 }; + demandLifetime = 10; + hubEffectiveLength = 15; + hubDedicatedVehicleCapacity = 50; + capacityOfPeripheralVehicle=10; + } + + public void init(){ + UrbanAutonomous.vehicleStack.vehicleGen(); + UrbanAutonomous.demandStack.init(); + UrbanAutonomous.hubStack.init(); + currentTime=0; + } + + public void update() { + currentTime++; + if (currentTime >= 14400) + currentTime = 0; + // unallocatedDemandSizeHistory + if (currentTime % 20 == 0) + UrbanAutonomous.demandStack.unallocatedDemandSizeHistory[currentTime / 20] = UrbanAutonomous.demandStack.unallocatedDepartureList.size(); + currentTimeZone = currentTime / 600;// 600step = 1hour + if (!demandSizeCustom) + currentDemandSize = demandSizeArray[currentTimeZone]; + } + +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/Status.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/Status.java new file mode 100644 index 0000000..f7ead1a --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/Status.java @@ -0,0 +1,16 @@ + +public enum Status { + CONFIG(1), + RUN(2), + STOP(3); + + private final int id; + + private Status(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/Tile.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/Tile.java new file mode 100644 index 0000000..a60174a --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/Tile.java @@ -0,0 +1,11 @@ + +public class Tile { + public float [] departureProbabilityArray; + public float [] arrivalProbabilityArray; + public TileType tileType; + Tile(float [] departure, float [] arrival,TileType _tileType) { + departureProbabilityArray = departure; + arrivalProbabilityArray = arrival; + tileType=_tileType; + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/TileType.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/TileType.java new file mode 100644 index 0000000..d64d543 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/TileType.java @@ -0,0 +1,19 @@ + +public enum TileType { + HW(1), + LW(2), + HR(3), + LR(4), + ROAD(5), + INTERSECTION(6); + + private final int id; + + private TileType(final int id) { + this.id = id; + } + + public int getId() { + return id; + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/UDP.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/UDP.java new file mode 100644 index 0000000..5a68c9d --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/UDP.java @@ -0,0 +1,881 @@ +/** + * (./) UDP.java v0.2 06/01/26 + * (by) Douglas Edric Stanley & Cousot Stéphane + * (cc) some right reserved + * + * Part of the Processing Libraries project, for the Atelier Hypermedia, art + * school of Aix-en-Provence, and for the Processing community of course. + * - require Java version 1.4 or later - + * -> http://hypermedia.loeil.org/processing/ + * -> http://www.processing.org/ + * + * THIS LIBRARY IS RELEASED UNDER A CREATIVE COMMONS LICENSE BY. + * -> http://creativecommons.org/licenses/by/2.5/ + */ + + + +import java.net.*; +import java.io.*; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; +import java.util.Date; +import java.text.SimpleDateFormat; + +import processing.core.*; + +/** + * Create and manage unicast, broadcast or multicast socket to send and receive + * datagram packets over the network. + *

+ * The socket type is define at his initialyzation by the passed IP address. + * To reach a host (interface) within a network, you need to specified the kind + * of address: + *

    + *
  • An unicast address refer to a unique host within a subnet.
  • + *
  • A broadcast address allow you to call every host within a subnet. + *
  • + *
  • A multicast address allows to call a specific group of hosts within + * the subnet. A multicast group is specified by a IP address in the range + * 224.0.0.0 (reserved, should not be used) to + * 239.255.255.255 inclusive, and by a standard UDP port number. + *
    + * notes: the complete reference of special multicast addresses should be + * found in the latest available version of the "Assigned Numbers RFC" + *
  • + *
+ * A packet sent to a unicast or broadcast address is only delivered to the + * host identified by that address. To the contrary, when packet is send to a + * multicast address, all interfaces identified by that address receive the data + * . + *

+ * To perform actions on receive and/or timeout events, you must implement + * specific method(s) in your code. This method will be automatically called + * when the socket receive incoming data or a timeout event. By default, the + * "receive handler" is typically receive(byte[] data) but you can + * retrieve more informations about the datagram packet, see + * {@link UDP#setReceiveHandler(String name)} for more informations. In the same + * logic, the default "timeout handler" is explicitly timeout(). + *

+ * + * note: currently applets are not allowed to use multicast sockets + * + * + * @version 0.1 + * @author Cousot Stéphane - stef@ubaa.net + * @author Douglas Edric Stanley - http://www.abstractmachine.net/ + */ +public class UDP implements Runnable { + + + // the current unicast/multicast datagram socket + DatagramSocket ucSocket = null; + MulticastSocket mcSocket = null; + + boolean log = false; // enable/disable output log + boolean listen = false; // true, if the socket waits for packets + int timeout = 0; // reception timeout > 0=infinite timeout + int size = 65507; // the socket buffer size in bytes + InetAddress group = null; // the multicast's group address to join + + // the reception Thread > wait automatically for incoming datagram packets + // without blocking the current Thread. + Thread thread = null; + + // the parent object (could be an application, a componant, etc...) + Object owner = null; + + // the default "receive handler" and "timeout handler" methods name. + // these methods must be implemented (by the owner) to be called + // automatically when the socket receive incoming datas or a timeout event + String receiveHandler = "receive"; + String timeoutHandler = "timeout"; + + // the log "header" to be set for debugging. Because log is disable by + // default, this value is automatically replaced by the principal socket + // settings when a new instance of UDP is created. + String header = ""; + + ///////////////////////////////// fields /////////////////////////////// + + /** + * The default socket buffer length in bytes. + */ + public static final int BUFFER_SIZE = 65507; + + + ///////////////////////////// constructors //////////////////////////// + + /** + * Create a new datagram socket and binds it to an available port and every + * address on the local host machine. + * + * @param owner the target object to be call by the receive handler + */ + public UDP( Object owner ) { + this( owner, 0 ); + } + + /** + * Create a new datagram socket and binds it to the specified port on the + * local host machine. + *

+ * Pass zero as port number, will let the system choose an + * available port. + * + * @param owner the target object to be call by the receive handler + * @param port local port to bind + */ + public UDP( Object owner, int port ) { + this( owner, port, null ); + } + + /** + * Create a new datagram socket and binds it to the specified port on the + * specified local address or multicast group address. + *

+ * Pass zero as port number, will let the system choose an + * available port. The absence of an address, explicitly null + * as IP address will assign the socket to the Unspecified Address (Also + * called anylocal or wildcard address). To set up the socket as multicast + * socket, pass the group address to be joined. If this address is not a + * valid multicast address, a broadcast socket will be created by default. + * + * @param owner the target object to be call by the receive handler + * @param port local port to bind + * @param ip host address or group address + */ + public UDP( Object owner, int port, String ip ) { + + this.owner = owner; + + // register this object to the PApplet, + // if it's used with Processing + try { + if ( owner instanceof PApplet ) ((PApplet)owner).registerMethod("dispose", this); + } + catch( NoClassDefFoundError e ) {;} + + // open a new socket to the specified port/address + // and join the group if the multicast socket is required + try { + + InetAddress addr = InetAddress.getByName(ip); + InetAddress host = (ip==null) ? (InetAddress)null: addr; + + if ( !addr.isMulticastAddress() ) { + ucSocket = new DatagramSocket( port, host ); // as broadcast + log( "bound socket to host:"+address()+", port: "+port() ); + } + else { + mcSocket = new MulticastSocket( port ); // as multicast + mcSocket.joinGroup( addr ); + this.group = addr; + log( "bound multicast socket to host:"+address()+ + ", port: "+port()+", group:"+group ); + } + } + catch( IOException e ) { + // caught SocketException & UnknownHostException + error( "opening socket failed!"+ + "\n\t> address:"+ip+", port:"+port+" [group:"+group+"]"+ + "\n\t> "+e.getMessage() + ); + } + catch( IllegalArgumentException e ) { + error( "opening socket failed!"+ + "\n\t> bad arguments: "+e.getMessage() + ); + } + catch( SecurityException e ) { + error( (isMulticast()?"could not joined the group":"warning")+ + "\n\t> "+e.getMessage() ); + } + + } + + /////////////////////////////// methods /////////////////////////////// + + /** + * Close the socket. This method is automatically called by Processing when + * the PApplet shuts down. + * + * @see UDP#close() + */ + public void dispose() { + close(); + } + + /** + * Close the actuel datagram socket and all associate resources. + */ + public void close() { + if ( isClosed() ) return; + + int port = port(); + String ip = address(); + + // stop listening if needed + //listen( false ); + + // close the socket + try { + if ( isMulticast() ) { + if ( group!=null ) { + mcSocket.leaveGroup( group ); + log( "leave group < address:"+group+" >" ); + } + mcSocket.close(); + mcSocket = null; + } + else { + ucSocket.close(); + ucSocket = null; + } + } + catch( IOException e ) { + error( "Error while closing the socket!\n\t> " + e.getMessage() ); + } + catch( SecurityException e ) {;} + finally { + log( "close socket < port:"+port+", address:"+ip+" >\n" ); + } + } + + /** + * Returns whether the current socket is closed or not. + * @return boolean + **/ + public boolean isClosed() { + if ( isMulticast() ) return mcSocket==null ? true : mcSocket.isClosed(); + return ucSocket==null ? true : ucSocket.isClosed(); + } + + /** + * Return the actual socket's local port, or -1 if the socket is closed. + * @return int + */ + public int port() { + if ( isClosed() ) return -1; + return isMulticast()? mcSocket.getLocalPort() : ucSocket.getLocalPort(); + } + + /** + * Return the actual socket's local address, or null if the + * address correspond to any local address. + * + * @return String + */ + public String address() { + if ( isClosed() ) return null; + + InetAddress laddr = isMulticast() ? mcSocket.getLocalAddress(): + ucSocket.getLocalAddress(); + return laddr.isAnyLocalAddress() ? null : laddr.getHostAddress(); + } + + /** + * Send message to the current socket. Explicitly, send message to the + * multicast group/port or to itself. + * + * @param message the message to be send + * + * @see UDP#send(String message, String ip) + * @see UDP#send(String message, String ip, int port) + * + * @return boolean + */ + public boolean send( String message ) { + return send( message.getBytes() ); + } + + /** + * Send data to the current socket. Explicitly, send data to the multicast + * group/port or to itself. + * + * @param buffer data to be send + * + * @see UDP#send(byte[] data, String ip) + * @see UDP#send(byte[] data, String ip, int port) + * + * @return boolean + */ + public boolean send( byte[] buffer ) { + // probably if the group could not be joined for a security reason + if ( isMulticast() && group==null ) return false; + + String ip = isMulticast() ? group.getHostAddress() : address(); + return send( buffer, ip, port() ); + } + + /** + * Send message to the requested IP address, to the current socket port. + * + * @param message the message to be send + * @param ip the destination host's IP address + * + * @see UDP#send(String message) + * @see UDP#send(String message, String ip, int port) + * + * @return boolean + */ + public boolean send( String message, String ip ) { + return send( message.getBytes(), ip ); + } + + /** + * Send data to the requested IP address, to the current socket port. + * + * @param buffer data to be send + * @param ip the destination host's IP address + * + * @see UDP#send(byte[] buffer) + * @see UDP#send(byte[] buffer, String ip, int port) + * + * @return boolean + */ + public boolean send( byte[] buffer, String ip ) { + return send( buffer, ip, port() ); + } + + /** + * Send message to the requested IP address and port. + *

+ * A null IP address will assign the packet address to the + * local host. Use this method to send message to another application by + * passing null as the destination address. + * + * @param message the message to be send + * @param ip the destination host's IP address + * @param port the destination host's port + * + * @see UDP#send(String message) + * @see UDP#send(String message, String ip) + * + * @return boolean + */ + public boolean send( String message, String ip, int port ) { + return send( message.getBytes(), ip, port ); + } + + /** + * Send data to the requested IP address and port. + *

+ * A null IP address will assign the packet address to the + * local host. Use this method to send data to another application by + * passing null as the destination address. + * + * @param buffer data to be send + * @param ip the destination host's IP address + * @param port the destination host's port + * + * @see UDP#send(byte[] buffer, String ip) + * @see UDP#send(byte[] buffer, String ip, int port) + * + * @return boolean + */ + public boolean send( byte[] buffer, String ip, int port ) { + + boolean success = false; + DatagramPacket pa = null; + + try { + + pa = new DatagramPacket( buffer, buffer.length, InetAddress.getByName(ip), port ); + + // send + if ( isMulticast() ) mcSocket.send( pa ); + else ucSocket.send( pa ); + + success = true; + log( "send packet -> address:"+pa.getAddress()+ + ", port:"+ pa.getPort() + + ", length: "+ pa.getLength() + ); + } + catch( IOException e ) { + error( "could not send message!"+ + "\t\n> port:"+port+ + ", ip:"+ip+ + ", buffer size: "+size+ + ", packet length: "+pa.getLength()+ + "\t\n> "+e.getMessage() + ); + } + finally{ return success; } + } + + /** + * Set the maximum size of the packet that can be sent or receive on the + * current socket. This value must be greater than 0, otherwise the buffer + * size is set to the his default value. + *

+ * return true if the new buffer value have been correctly set, + * false otherwise. + *

+ * note : this method has no effect if the socket is listening. To define + * a new buffer size, call this method before implementing a new buffer in + * memory. Explicitly before calling a receive methods. + * + * @param size the buffer size value in bytes or n<=0 + * @return boolean + * @see UDP#getBuffer() + */ + public boolean setBuffer( int size ) { + boolean done = false; + + // do nothing if listening (block the thread otherwise) + if ( isListening() ) return done; + + try { + // set the SO_SNDBUF and SO_RCVBUF value + if ( isMulticast() ) { + mcSocket.setSendBufferSize( size>0 ? size : BUFFER_SIZE ); + mcSocket.setReceiveBufferSize( size>0 ? size : BUFFER_SIZE ); + } + else { + ucSocket.setSendBufferSize( size>0 ? size : BUFFER_SIZE ); + ucSocket.setReceiveBufferSize( size>0 ? size : BUFFER_SIZE ); + } + // set the current buffer size + this.size = size>0 ? size : BUFFER_SIZE; + done = true; + } + catch( SocketException e ) { + error( "could not set the buffer!"+ + "\n> "+e.getMessage() + ); + } + finally{ return done; } + } + + /** + * Return the actual socket buffer length + * @return int + * @see UDP#setBuffer(int size) + */ + public int getBuffer() { + return size; + } + + /** + * Returns whether the socket wait for incoming data or not. + * @return boolean + */ + public boolean isListening() { + return listen; + } + + + /** + * Start/stop waiting constantly for incoming data. + * + * @param on the required listening status. + * + * @see UDP#listen() + * @see UDP#listen(int millis) + * @see UDP#setReceiveHandler(String name) + */ + public void listen( boolean on ) { + + listen = on; + timeout = 0; + + // start + if ( on && thread==null && !isClosed() ) { + thread = new Thread( this ); + thread.start(); + } + // stop + if ( !on && thread!=null ) { + send( new byte[0] ); // unblock the thread with a dummy message + thread.interrupt(); + thread = null; + } + } + + /** + * Set the socket reception timeout and wait one time for incoming data. + * If the timeout period occured, the owner timeout() method is + * automatically called. + * + * @param millis the required timeout value in milliseconds. + * + * @see UDP#listen() + * @see UDP#listen(boolean on) + */ + public void listen( int millis ) { + if ( isClosed() ) return; + + listen = true; + timeout = millis; + + // unblock the thread with a dummy message, if already listening + if ( thread!=null ) send( new byte[0] ); + if ( thread==null ) { + thread = new Thread( this ); + thread.start(); + } + } + + /** + * Wait for incoming data, and call the appropriate handlers each time a + * message is received. If the owner's class own the appropriate target + * handler, this method send it the receive message as byte[], the sender + * IP address and port. + *

+ * This method force the current Thread to be ceased for a + * temporary period. If you prefer listening without blocking the current + * thread, use the {@link UDP#listen(int millis)} or + * {@link UDP#listen(boolean on)} method instead. + * + * @see UDP#listen() + * @see UDP#listen(boolean on) + * @see UDP#setReceiveHandler(String name) + */ + public void listen() { + try { + + byte[] buffer = new byte[ size ]; + DatagramPacket pa = new DatagramPacket(buffer,buffer.length); + + // wait + if ( isMulticast() ) { + mcSocket.setSoTimeout( timeout ); + mcSocket.receive( pa ); // <-- block the Thread + } + else { + ucSocket.setSoTimeout( timeout ); + ucSocket.receive( pa ); // <-- block + } + + + log( "receive packet <- from "+pa.getAddress()+ + ", port:"+ pa.getPort() + + ", length: "+ pa.getLength() + ); + + + // get the required data only (not all the buffer) + // and send it to the appropriate target handler, if needed + if ( pa.getLength()!=0 ) { + + byte[] data = new byte[ pa.getLength() ]; + System.arraycopy( pa.getData(), 0, data, 0, data.length ); + + try { + // try with one argument first > byte[] + callReceiveHandler( data ); + } + catch( NoSuchMethodException e ) { + // try with many argument > byte[], String, int + callReceiveHandler( data, + pa.getAddress().getHostAddress(), + pa.getPort() + ); + } + } + } + catch( NullPointerException e ) { + // *socket=null from the close() method; + listen = false; + thread = null; + } + catch( IOException e ) { + + listen = false; + thread = null; + + if ( e instanceof SocketTimeoutException ) callTimeoutHandler(); + else { + // do not print "Socket closed" error + // if the method close() has been called + if ( ucSocket!=null && mcSocket!=null ) + error( "listen failed!\n\t> "+e.getMessage() ); + } + } + } + + /** + * Wait for incoming datagram packets. This method is called automaticlly, + * you do not need to call it. + */ + public void run() { + while ( listen ) listen(); + } + + /** + * Register the target's receive handler. + *

+ * By default, this method name is "receive" with one argument + * representing the received data as byte[]. For more + * flexibility, you can change this method with another useful method by + * passing his name. You could get more informations by implementing two + * additional arguments, a String representing the sender IP + * address and a int representing the sender port : + *

+	 * void myCustomReceiveHandler(byte[] message, String ip, int port) {
+	 *	// do something here...
+	 * }
+	 * 
+ * + * @param name the receive handler name + * @see UDP#setTimeoutHandler(String name) + */ + public void setReceiveHandler( String name ) { + this.receiveHandler = name; + } + + /** + * Call the default receive target handler method. + * + * @param data the data to be passed + * @throws NoSuchMethodException + */ + private void callReceiveHandler( byte[] data ) + throws NoSuchMethodException { + + Class[] types; // arguments class types + Object[] values; // arguments values + Method method; + + try { + types = new Class[]{ data.getClass() }; + values = new Object[]{ data }; + method = owner.getClass().getMethod(receiveHandler, types); + method.invoke( owner, values ); + } + catch( IllegalAccessException e ) { error(e.getMessage()); } + catch( InvocationTargetException e ) { e.printStackTrace(); } + } + + /** + * Call the receive target handler implemented with the optional arguments. + * + * @param data the data to be passed + * @param ip the IP adress to be passed + * @param port the port number to be passed + */ + private void callReceiveHandler( byte[] data, String ip, int port ) { + + Class[] types; // arguments class types + Object[] values; // arguments values + Method method; + + try { + types = new Class[]{ data.getClass(), + ip.getClass(), + Integer.TYPE + }; + values = new Object[]{ data, + ip, + new Integer(port) + }; + method = owner.getClass().getMethod(receiveHandler, types); + method.invoke( owner, values ); + } + catch( NoSuchMethodException e ) {;} + catch( IllegalAccessException e ) { error(e.getMessage()); } + catch( InvocationTargetException e ) { e.printStackTrace(); } + } + + /** + * Register the target's timeout handler. By default, this method name is + * "timeout" with no argument. + * + * @param name the timeout handler name + * @see UDP#setReceiveHandler(String name) + */ + public void setTimeoutHandler( String name ) { + this.timeoutHandler = name; + } + + /** + * Call the timeout target method when the socket received a timeout event. + * The method name to be implemented in your code is timeout(). + */ + private void callTimeoutHandler() { + try { + Method m = owner.getClass().getDeclaredMethod(timeoutHandler, null); + m.invoke( owner, null ); + } + catch( NoSuchMethodException e ) {;} + catch( IllegalAccessException e ) { error(e.getMessage()); } + catch( InvocationTargetException e ) { e.printStackTrace(); } + } + + /** + * Returns whether the opened datagram socket is a multicast socket or not. + * @return boolean + */ + public boolean isMulticast() { + return ( mcSocket!=null ); + } + + /** + * Returns whether the multicast socket is joined to a group address. + * @return boolean + */ + public boolean isJoined() { + return ( group!=null ); + } + + /** + * Returns whether the opened socket send broadcast message socket or not. + * @return boolean + */ + public boolean isBroadcast() { + boolean result = false; + try { + result = (ucSocket==null) ? false : ucSocket.getBroadcast(); + } + catch( SocketException e ) { error( e.getMessage() ); } + finally { return result; } + } + + /** + * Enables or disables the ability of the current process to send broadcast + * messages. + * @return boolean + */ + public boolean broadcast( boolean on ) { + boolean done = false; + try { + if ( ucSocket!=null ) { + ucSocket.setBroadcast( on ); + done = isBroadcast(); + } + } + catch( SocketException e ) { error( e.getMessage() ); } + finally { return done; } + } + + /** + * Enable or disable the multicast socket loopback mode. By default loopback + * is enable. + *
+ * Setting loopback to false means this multicast socket does not want to + * receive the data that it sends to the multicast group. + * + * @param on local loopback of multicast datagrams + */ + public void loopback( boolean on ) { + try { + if ( isMulticast() ) mcSocket.setLoopbackMode( !on ); + } + catch( SocketException e ) { + error( "could not set the loopback mode!\n\t>"+e.getMessage() ); + } + } + + /** + * Returns whether the multicast socket loopback mode is enable or not. + * @return boolean + */ + public boolean isLoopback() { + try { + if ( isMulticast() && !isClosed() ) + return !mcSocket.getLoopbackMode(); + } + catch( SocketException e ) { + error( "could not get the loopback mode!\n\t> "+e.getMessage() ); + } + return false; + } + + /** + * Control the life-time of a datagram in the network for multicast packets + * in order to indicates the scope of the multicasts (ie how far the packet + * will travel). + *

+ * The TTL value must be in range of 0 to 255 inclusive. The larger the + * number, the farther the multicast packets will travel (by convention): + *

+	 * 0	-> restricted to the same host
+	 * 1	-> restricted to the same subnet (default)
+	 * <32	-> restricted to the same site
+	 * <64	-> restricted to the same region
+	 * <128	-> restricted to the same continent
+	 * <255	-> no restriction
+	 * 
+ * The default value is 1, meaning that the datagram will not go beyond the + * local subnet. + *

+ * return true if no error occured. + * + * @param ttl the "Time to Live" value + * @return boolean + * @see UDP#getTimeToLive() + */ + public boolean setTimeToLive( int ttl ) { + try { + if ( isMulticast() && !isClosed() ) mcSocket.setTimeToLive( ttl ); + return true; + } + catch( IOException e ) { + error( "setting the default \"Time to Live\" value failed!"+ + "\n\t> "+e.getMessage() ); + } + catch( IllegalArgumentException e ) { + error( "\"Time to Live\" value must be in the range of 0-255" ); + } + return false; + } + + /** + * Return the "Time to Live" value or -1 if an error occurred (or if + * the current socket is not a multicast socket). + * + * @return int + * @see UDP#setTimeToLive(int ttl) + */ + public int getTimeToLive() { + try { + if ( isMulticast() && !isClosed() ) + return mcSocket.getTimeToLive(); + } + catch( IOException e ) { + error( "could not retrieve the current time-to-live value!"+ + "\n\t> "+ e.getMessage() ); + } + return -1; + } + + /** + * Enable or disable output process log. + */ + public void log( boolean on ) { + log = on; + } + + /** + * Output message to the standard output stream. + * @param out the output message + */ + private void log( String out ) { + + Date date = new Date(); + + // define the "header" to retrieve at least the principal socket + // informations : the host/port where the socket is bound. + if ( !log && header.equals("") ) + header = "-- UDP session started at "+date+" --\n-- "+out+" --\n"; + + // print out + if ( log ) { + + String pattern = "yy-MM-dd HH:mm:ss.S Z"; + String sdf = new SimpleDateFormat(pattern).format( date ); + System.out.println( header+"["+sdf+"] "+out ); + header = ""; // forget header + } + } + + /** + * Output error messages to the standard error stream. + * @param err the error string + */ + private void error( String err ) { + System.err.println( err ); + } +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/UDPSocket.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/UDPSocket.java new file mode 100644 index 0000000..d6da939 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/UDPSocket.java @@ -0,0 +1,201 @@ + +import processing.core.PApplet; +import processing.data.JSONObject; + +public class UDPSocket { + UDP udp; + PApplet p; + + public UDPSocket(PApplet _p) { + p = _p; + udp = new UDP(this, 5500); + udp.log(true); // <-- printout the connection activity + udp.listen(true); + } + + public void receive(byte[] data, String ip, int port) { // <-- extended + String dataStr = new String(data); + dataStr = new String(p.trim(dataStr)); + p.println("receive: \"" + dataStr + "\" from " + ip + " on port " + port); + String[] list = new String[] { dataStr }; + p.saveStrings("json.txt", list); + JSONObject json = p.loadJSONObject("json.txt"); + + mapUpdate(json); + vehicleUpdate(json); + demandUpdate(json); + hubUpdate(json); + demandGenerationUpdate(json); + resetUpdate(json); + timeUpdate(json); + // UrbanAutonomous.simParam.numberOfVehicle = p.parseInt(dataStr); + // UrbanAutonomous.vehicleStack.vehicleGen(); + + } + + void timeUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("time")) { + tmpStr = json.getString("time"); + UrbanAutonomous.simParam.currentTime = Integer.parseInt(tmpStr); + } + } + void resetUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("reset")) { + tmpStr = json.getString("reset"); + if(p.parseBoolean(tmpStr)) + UrbanAutonomous.simParam.init(); + } + } + void hubUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("hubDedicatedVehicleCapacity")) { + tmpStr = json.getString("hubDedicatedVehicleCapacity"); + UrbanAutonomous.simParam.hubDedicatedVehicleCapacity= Integer.parseInt(tmpStr); + UrbanAutonomous.hubStack.init(); + } else if (!json.isNull("capacityOfPeripheralVehicle")) { + tmpStr = json.getString("capacityOfPeripheralVehicle"); + UrbanAutonomous.simParam.capacityOfPeripheralVehicle = Integer.parseInt(tmpStr); + UrbanAutonomous.hubStack.init(); + } else if (!json.isNull("hubA")) { + tmpStr = json.getString("hubA"); + String[] nums = p.split(tmpStr, ','); + UrbanAutonomous.hubStack.ax = Integer.parseInt(nums[0])*5+2; + UrbanAutonomous.hubStack.ay = Integer.parseInt(nums[1])*5+2; + UrbanAutonomous.hubStack.init(); + } else if (!json.isNull("hubB")) { + tmpStr = json.getString("hubB"); + String[] nums = p.split(tmpStr, ','); + UrbanAutonomous.hubStack.bx = Integer.parseInt(nums[0])*5+2; + UrbanAutonomous.hubStack.by = Integer.parseInt(nums[1])*5+2; + UrbanAutonomous.hubStack.init(); + } + } + void demandUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("demandInterval")) { + tmpStr = json.getString("demandInterval"); + UrbanAutonomous.simParam.demandInterval = Integer.parseInt(tmpStr); + } else if (!json.isNull("demandLifetime")) { + tmpStr = json.getString("demandLifetime"); + UrbanAutonomous.simParam.demandLifetime= Integer.parseInt(tmpStr); + } else if (!json.isNull("currentDemandSize")) { + tmpStr = json.getString("currentDemandSize"); + UrbanAutonomous.simParam.currentDemandSize= Integer.parseInt(tmpStr); + } else if (!json.isNull("demandSizeCustom")) { + tmpStr = json.getString("demandSizeCustom"); + UrbanAutonomous.simParam.demandSizeCustom= p.parseBoolean(tmpStr); + } + } + void vehicleUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("fleetSize")) { + tmpStr = json.getString("fleetSize"); + UrbanAutonomous.simParam.numberOfVehicle = Integer.parseInt(tmpStr); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (!json.isNull("vehicleCapacity")) { + tmpStr = json.getString("vehicleCapacity"); + UrbanAutonomous.simParam.capacityOfVehicle = Integer.parseInt(tmpStr); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (!json.isNull("vehicleHistorySize")) { + tmpStr = json.getString("vehicleHistorySize"); + UrbanAutonomous.simParam.vehicleHistorySize = Integer.parseInt(tmpStr); + UrbanAutonomous.vehicleStack.vehicleGen(); + } + } + + void mapUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("mapType")) { + tmpStr = json.getString("mapType"); + UrbanAutonomous.simParam.mapType = Integer.parseInt(tmpStr); + if (UrbanAutonomous.simParam.mapType == 0) { + UrbanAutonomous.mapBlockStack.loadUrbanMap(); + } else if (UrbanAutonomous.simParam.mapType == 1) { + UrbanAutonomous.mapBlockStack.loadRuralMap(); + } else if (UrbanAutonomous.simParam.mapType == 2) { + UrbanAutonomous.mapBlockStack.noneMapGen(); + } + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of // // // // mapblock to demand // // // // generation + UrbanAutonomous.mapBlockStack.mapImgCreation(); // map image creation for // // // // display + } + } + + void demandGenerationUpdate(JSONObject json) { + String tmpStr; + if (!json.isNull("hwArrival")) { + tmpStr = json.getString("hwArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hwTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lwArrival")) { + tmpStr = json.getString("lwArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lwTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("hrArrival")) { + tmpStr = json.getString("hrArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hrTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lrArrival")) { + tmpStr = json.getString("lrArrival"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lrTile.arrivalProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("hwDeparture")) { + tmpStr = json.getString("hwDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hwTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lwDeparture")) { + tmpStr = json.getString("lwDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lwTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("hrDeparture")) { + tmpStr = json.getString("hrDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.hrTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("lrDeparture")) { + tmpStr = json.getString("lrDeparture"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.basicTile.lrTile.departureProbabilityArray[i] = Float.parseFloat(nums[i]); + } + } + if (!json.isNull("totalDemand")) { + tmpStr = json.getString("totalDemand"); + String[] nums = p.split(tmpStr, ','); + float[] tmp = new float[24]; + for (int i = 0; i < nums.length; i++) { + UrbanAutonomous.simParam.demandSizeArray[i] = Integer.parseInt(nums[i]); + } + } + } + +} diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java new file mode 100644 index 0000000..4569a07 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java @@ -0,0 +1,604 @@ +import processing.core.*; +import processing.data.*; +import processing.event.*; +import processing.opengl.*; + +import javax.swing.JFrame; +import deadpixel.keystone.*; +import hypermedia.net.*; + +import java.util.HashMap; +import java.util.ArrayList; +import java.io.File; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +public class UrbanAutonomous extends PApplet { + +//laptop resolution 1920 x 1080 +//16blocks x 16blocks +//1block = 5tiles x 5tiles +//1tile = 10pixels x 10pixels +//Simulation Window: 800 x 800pixels +//Operation Window: x pixels + +//vehicle speed 20km/h 20,000m/60min 2000m/6min 333m/min 33.3m/0.1min +//1block 133.3m -> 1tile 33.3m -> 2.128km-square +//1tile/0.1min +//1 simulation sec = 0.1min -> 10sec = 1min, 600sec(10min)=60min(1h) 240min(4h)=24h +//0.1 simulation sec = 0.1min ->1min=1h 24min = 24h +//1step =0.1min , 10step 1min , 600step 1h, 14400step =24h +//start time 00:00~24:00, 0:00->0step[0.1min](currentTime), 24:00-> 14400step[0.1min](currentTime) + +//View +//AllocatedDepartureDemand:pink +//unallocatedDepartureDemand:red +//AllocatedArrivalDemand:light blue +//unallocatedArrivalDemand:blue + +int projectorWidth = 1920; +int projectorHeight = 1200; +int projectorOffset = 1842; + +int screenWidth = 1842; +int screenHeight = 1026; + +int displayU = 18; +int displayV = 22; + +int IDMax = 15; + +// Table Canvas Width and Height +int TABLE_IMAGE_HEIGHT = 1000; +int TABLE_IMAGE_WIDTH = 1000; + +// Arrays that holds ID information of rectilinear tile arrangement. +int tablePieceInput[][][] = new int[displayU][displayV][2]; + + +public static DragStatus dragStatus; +public static OperationWindow opw; +public static Status status; +public static PImage hwImg, lwImg, hrImg, lrImg, roadImg, intersectionImg, noneImg, backgroundImg, congestionImg; +public static Tile[][] simCoordinate; +public static int vehicleColor; +public static int allocatedDepartureColor; +public static int unallocatedDepartureColor; +public static int allocatedArrivalColor; +public static int unallocatedArrivalColor; +public static int hubColor; +public static int hubVehicleColor; +public static int hubPeripheralVehicleColor; +public static int hubEffectiveLengthColor; +public static PGraphics legendPg, demandPg; +public static int brushNumber; + + // Temporary + public static MapBlock mapBlock; + public static BasicTile basicTile; + public static MapBlockBrushs mapBlockBrushs; + public static MapBlockStack mapBlockStack; + public static Disp disp; + public static SimParam simParam; + public static DemandStack demandStack; + public static VehicleStack vehicleStack; + // public static OperationDisp operationDisp; + public static FileControl fileControl; + // public static Hub hubA, hubB; + public static HubStack hubStack; + // public static HubVehicle hubVehicle; + public static UDPSocket udpSocket; + + PGraphics captionG,mainG; + + public void setup() { + mainG=createGraphics(800,800); + + //size(screenWidth, screenHeight, P3D); + + // Initial Projection-Mapping Canvas + initializeProjection2D(); + + // Allows application to receive information from Colortizer via UDP + initUDP(); + + + // SimulationWindow + size(1000, 1000); + + // OperationWindow + new PFrame(1000, 0, 1900, 875); + + // Status + status = Status.CONFIG; + dragStatus = DragStatus.NORMAL; + + // Load Image + loadTileImage(); + backgroundImg = loadImage("operationWindow.jpg"); + + // Legend Symbol + vehicleColor = color(255, 128, 0, 255); + allocatedDepartureColor = color(255, 0, 255, 127); + unallocatedDepartureColor = color(255, 0, 0, 127); + allocatedArrivalColor = color(0, 255, 255, 127); + unallocatedArrivalColor = color(0, 0, 255, 127); + hubColor = color(0, 255, 0, 200); + hubEffectiveLengthColor = color(0, 255, 0, 64); + hubVehicleColor = color(142, 0, 204, 200); + hubPeripheralVehicleColor = color(200, 255, 200, 200); + + // Temporary + udpSocket = new UDPSocket(this); + + hubStack = new HubStack(this); + + brushNumber = 0; + basicTile = new BasicTile(); + mapBlockBrushs = new MapBlockBrushs(this, 4); + mapBlockStack = new MapBlockStack(this); + //disp = new Disp(this); + disp = new Disp(mainG,this); + simParam = new SimParam(); + demandStack = new DemandStack(); + simCoordinate = new Tile[80][80]; + vehicleStack = new VehicleStack(); + + mapBlockStack.loadRuralMap(); + + mapBlockStack.updateCoordinate();// reflect change of mapblock to demand + // generation + mapBlockStack.mapImgCreation();// map image creation for display + mapBlockBrushs.brushImgCreation();// brush image creation for operation + // display + legendSymbolImgCreation(); // create legend symbol image for operation + // display + demandGenerationImgCreation(); // create demand image for operation + // display + fileControl = new FileControl(); + } + + public void draw() { + // Exports table Graphic to Projector + projector = get(0, 0, TABLE_IMAGE_WIDTH, TABLE_IMAGE_HEIGHT); + + simParam.update(); + + demandStack.demandLifetimeControl(); + demandStack.demandGen(simParam.currentDemandSize, simParam.demandInterval * 10);// numberOfDemand,DemandGenerationInterval(steps) + demandStack.demandAllocation(); + demandStack.demandHubAllocation(); + vehicleStack.allVehicleMovement(); + hubStack.hubVehicleA.move(); + hubStack.hubPeripheralVehicleA.move(); + hubStack.hubPeripheralVehicleB.move(); + + // Display + disp.show(); + + image(mainG,180,0,725,725); + } + + public void loadTileImage() { + hwImg = loadImage("hwTile.png"); + lwImg = loadImage("lwTile.png"); + hrImg = loadImage("hrTile.png"); + lrImg = loadImage("lrTile.png"); + roadImg = loadImage("roadTile.png"); + intersectionImg = loadImage("intersectionTile.png"); + noneImg = loadImage("noneTile.png"); + congestionImg = loadImage("congestion.png"); + } + + public void keyPressed() { + switch(key) { + case '`': // "Enable Projection (`)" + toggle2DProjection(); + break; + } + } + public void mousePressed() { + int x = (int) (mouseX / 50); + int y = (int) (mouseY / 50); + + if (simParam.mapType == 2) { + mapBlockStack.mapBlockArray[x][y] = mapBlockBrushs.selectedBrush; + fileControl.customMap[16 * y + x] = brushNumber; + mapBlockStack.updateCoordinate();// reflect change of mapblock to // + // // demand + // generation + mapBlockStack.mapImgCreation();// map image creation for display + } + // Hub Relocation + hubRelocation(); + } + + public void hubRelocation() { + if (dist(hubStack.hubA.x * 10, hubStack.hubA.y * 10, mouseX, mouseY) < 20) { + dragStatus = DragStatus.HUBA; + } else if (dist(hubStack.hubB.x * 10, hubStack.hubB.y * 10, mouseX, mouseY) < 20) { + dragStatus = DragStatus.HUBB; + } + } + + public void mouseReleased() { + if (dragStatus == DragStatus.HUBA) { + hubStack.ax = modifyHubPoint(mouseX); + hubStack.ay = modifyHubPoint(mouseY); + hubStack.init(); + } else if (dragStatus == DragStatus.HUBB) { + hubStack.bx = modifyHubPoint(mouseX); + hubStack.by = modifyHubPoint(mouseY); + hubStack.init(); + } + dragStatus = DragStatus.NORMAL; + } + + public int modifyHubPoint(int x) { + int result = 0; + result = x / 10 / 5 * 5 + 2; + return result; + } + + public void legendSymbolImgCreation() { + int offset = 0; + legendPg = createGraphics(20, 180); + legendPg.beginDraw(); + legendPg.background(255); + legendPg.stroke(255); + legendPg.stroke(1); + + // LandUse + legendPg.image(hwImg, offset, 0, 20, 20); + legendPg.image(lwImg, offset, 20, 20, 20); + legendPg.image(hrImg, offset, 40, 20, 20); + legendPg.image(lrImg, offset, 60, 20, 20); + + legendPg.ellipseMode(CENTER); + // allocated departure + legendPg.fill(allocatedDepartureColor); + legendPg.ellipse(offset + 10, 90, 10, 10); + // unallocated departure + legendPg.fill(unallocatedDepartureColor); + legendPg.ellipse(offset + 10, 110, 10, 10); + // allocated arrival + legendPg.fill(allocatedArrivalColor); + legendPg.ellipse(offset + 10, 130, 10, 10); + // unallocated arrival + legendPg.fill(unallocatedArrivalColor); + legendPg.ellipse(offset + 10, 150, 10, 10); + // Vehicle(fleet) + legendPg.fill(vehicleColor); + legendPg.ellipse(offset + 10, 170, 10, 10); + legendPg.endDraw(); + } + + public void demandGenerationImgCreation() { + int offset = 150; + demandPg = createGraphics(870, 260); + demandPg.beginDraw(); + // demandPg.background(255); + demandPg.clear(); + demandPg.stroke(255); + demandPg.stroke(1); + demandPg.image(hwImg, 0, 0, 50, 50); + demandPg.image(lwImg, 0, 70, 50, 50); + demandPg.image(hrImg, 0, 140, 50, 50); + demandPg.image(lrImg, 0, 210, 50, 50); + + for (int i = 0; i < 720; i++) { + demandPg.line(offset + i, 20 - (basicTile.hwTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 20); + demandPg.line(offset + i, 50 - (basicTile.hwTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 50); + demandPg.line(offset + i, 90 - (basicTile.lwTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 90); + demandPg.line(offset + i, 120 - (basicTile.lwTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 120); + demandPg.line(offset + i, 160 - (basicTile.hrTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 160); + demandPg.line(offset + i, 190 - (basicTile.hrTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 190); + demandPg.line(offset + i, 230 - (basicTile.lrTile.departureProbabilityArray[i / 30] * 100 / 5), offset + i, + 230); + demandPg.line(offset + i, 260 - (basicTile.lrTile.arrivalProbabilityArray[i / 30] * 100 / 5), offset + i, + 260); + } + demandPg.endDraw(); + } + +// +// This is a script that allows one to open a new canvas for the purpose +// of simple 2D projection mapping, such as on a flat table surface +// +// Right now, only appears to work in windows... +// +// To use this example in the real world, you need a projector +// and a surface you want to project your Processing sketch onto. +// +// Simply press the 'c' key and drag the corners of the +// CornerPinSurface so that they +// match the physical surface's corners. The result will be an +// undistorted projection, regardless of projector position or +// orientation. +// +// You can also create more than one Surface object, and project +// onto multiple flat surfaces using a single projector. +// +// This extra flexbility can comes at the sacrifice of more or +// less pixel resolution, depending on your projector and how +// many surfaces you want to map. +// + + + + +// Visualization may show 2D projection visualization, or not +boolean displayProjection2D = false; +//int projectorOffset = screenWidth; + +boolean testProjectorOnMac = false; + +// defines Keystone settings from xml file in parent folder +Keystone ks; + +// defines various drawing surfaces, all pre-calibrated, to project +CornerPinSurface surface; +PGraphics offscreen; +PImage projector; + +// New Application Window Parameters +PFrameI proj2D = null; // f defines window to open new applet in +projApplet applet; // applet acts as new set of setup() and draw() functions that operate in parallel + +// Run Anything Needed to have Projection mapping work +public void initializeProjection2D() { + println("Projector Info: " + projectorWidth + ", " + projectorHeight + ", " + projectorOffset); + //toggleProjection(getButtonIndex(buttonNames[21])); +} + +public class PFrameI extends JFrame { + public PFrameI() { + setBounds(0, 0, projectorWidth, projectorHeight ); + setLocation(projectorOffset, 0); + applet = new projApplet(); + setResizable(false); + setUndecorated(true); + setAlwaysOnTop(true); + add(applet); + applet.init(); + show(); + setTitle("Projection2D"); + } +} + +public void showProjection2D() { + if (proj2D == null) { + proj2D = new PFrameI(); + } + proj2D.setVisible(true); +} + +public void closeProjection2D() { + proj2D.setVisible(false); +} + +public void resetProjection2D() { + initializeProjection2D(); + if (proj2D != null) { + proj2D.dispose(); + proj2D = new PFrameI(); + if (displayProjection2D) { + showProjection2D(); + } else { + closeProjection2D(); + } + } +} + +public class projApplet extends PApplet { + public void setup() { + // Keystone will only work with P3D or OPENGL renderers, + // since it relies on texture mapping to deform + size(projectorWidth, projectorHeight, P2D); + + ks = new Keystone(this);; + + reset(); + } + + public void reset() { + surface = ks.createCornerPinSurface(TABLE_IMAGE_HEIGHT, TABLE_IMAGE_HEIGHT, 20); + offscreen = createGraphics(TABLE_IMAGE_HEIGHT, TABLE_IMAGE_HEIGHT); + + try{ + ks.load(); + } catch(RuntimeException e){ + println("No Keystone.xml. Save one first if you want to load one."); + } + } + + public void draw() { + + // Convert the mouse coordinate into surface coordinates + // this will allow you to use mouse events inside the + // surface from your screen. + PVector surfaceMouse = surface.getTransformedMouse(); + + // most likely, you'll want a black background to minimize + // bleeding around your projection area + background(0); + + // Draw the scene, offscreen + renderCanvas(offscreen, 0); + surface.render(offscreen); + + } + + public void renderCanvas(PGraphics p, int x_offset) { + // Draw the scene, offscreen + p.beginDraw(); + p.clear(); + p.translate(x_offset, 0); + p.image(projector, 0, 0); + p.endDraw(); + } + + public void keyPressed() { + switch(key) { + case 'c': + // enter/leave calibration mode, where surfaces can be warped + // and moved + ks.toggleCalibration(); + break; + + case 'l': + // loads the saved layout + ks.load(); + break; + + case 's': + // saves the layout + ks.save(); + break; + + case '`': + if (displayProjection2D) { + displayProjection2D = false; + closeProjection2D(); + } else { + displayProjection2D = true; + showProjection2D(); + } + break; + } + } +} + +public void toggle2DProjection() { + if (System.getProperty("os.name").substring(0,3).equals("Mac")) { + testProjectorOnMac = !testProjectorOnMac; + println("Test on Mac = " + testProjectorOnMac); + println("Projection Mapping Currently not Supported for MacOS"); + } else { + if (displayProjection2D) { + displayProjection2D = false; + closeProjection2D(); + } else { + displayProjection2D = true; + showProjection2D(); + } + } +} + + +// Principally, this script ensures that a string is "caught" via UDP and coded into principal inputs of: +// - tablePieceInput[][] or tablePieceInput[][][2] (rotation) +// - UMax, VMax + + +int portIN = 6152; + + +UDP udp; // define the UDP object + +boolean busyImporting = false; +boolean viaUDP = true; +boolean changeDetected = false; +boolean outputReady = false; + +public void initUDP() { + if (viaUDP) { + udp = new UDP( this, portIN ); + //udp.log( true ); // <-- printout the connection activity + udp.listen( true ); + } +} + +public void ImportData(String inputStr[]) { + if (inputStr[0].equals("COLORTIZER")) { + parseColortizerStrings(inputStr); + } + busyImporting = false; +} + +public void parseColortizerStrings(String data[]) { + + for (int i=0 ; i departureList; + public ArrayList arrivalList; + public ArrayList movingHistoryList; + + Vehicle(int _x, int _y, boolean _isHorizontalStreet, boolean _isIntersection) { + x=_x; + y=_y; + isHorizontalStreet=_isHorizontalStreet; + isIntersection=_isIntersection; + departureList = new ArrayList (); + arrivalList = new ArrayList (); + movingHistoryList = new ArrayList (); + } + + //Parameter Update + void paramUpdate() { + isHorizontalStreet=false; + isIntersection=false; + streetNumber=0; + if (isHorizontalStreetCheck()) { + isHorizontalStreet=true; + streetNumber=((y+5-2)/5)-1; + } else { + streetNumber=((x+5-2)/5)-1; + } + if (isVerticalStreetCheck()&&isHorizontalStreetCheck()) + isIntersection=true; + } + + boolean isHorizontalStreetCheck() { + boolean result=false; + if ((y-2+5)%5==0) + result = true; + return result; + } + + boolean isVerticalStreetCheck() { + boolean result=false; + if ((x-2+5)%5==0) + result = true; + return result; + } + + //Vehicle Movement + void move() { + paramUpdate(); + movingHistoryUpdate(); + if (departureList.size()>0 || arrivalList.size()>0) { + if (departureList.size()>0) { + eachMove(departureList); + } else { + eachMove(arrivalList); + } + } + } + + void movingHistoryUpdate() { + Demand tmpVehiclePosition=new Demand(x, y); + if (!(departureList.size()==0&&arrivalList.size()==0)) + movingHistoryList.add(tmpVehiclePosition); + if (departureList.size()==0&&arrivalList.size()==0&&movingHistoryList.size()>0) + movingHistoryList.remove(0); + if (movingHistoryList.size()>=UrbanAutonomous.simParam.vehicleHistorySize) + movingHistoryList.remove(0); + } + + void eachMove(ArrayList tmpList) { + if (isSamePoint(tmpList.get(0))) { + tmpList.remove(0); + } else if (isSameStreet(tmpList.get(0))) { + if (tmpList.get(0).isHorizontalStreet) + x += (tmpList.get(0).x - x)/ abs(tmpList.get(0).x - x) ; + else + y += (tmpList.get(0).y - y)/ abs(tmpList.get(0).y - y) ; + } else { + if (isIntersection) { + if (tmpList.get(0).isHorizontalStreet) + y += (tmpList.get(0).y - y)/ abs(tmpList.get(0).y - y) ; + else + x += (tmpList.get(0).x - x)/ abs(tmpList.get(0).x - x) ; + } else { + if (isHorizontalStreet) { + if (tmpList.get(0).isHorizontalStreet) { + if (x>77) { + x-=1; + } else { + x+=1; + } + } else { + x += (tmpList.get(0).x - x)/ abs(tmpList.get(0).x - x) ; + } + } else { + if (tmpList.get(0).isHorizontalStreet) { + y += (tmpList.get(0).y - y)/ abs(tmpList.get(0).y - y) ; + } else { + if (y>77) { + y-=1; + } else { + y+=1; + } + } + } + } + } + } + + boolean isSameStreet(Demand tmpDemand) { + boolean result=false; + if (tmpDemand.streetNumber==streetNumber && tmpDemand.isHorizontalStreet == isHorizontalStreet) + result=true; + else if (isIntersection) { + if (tmpDemand.isHorizontalStreet) { + if ((((y-2+5)/5)-1)==tmpDemand.streetNumber) + result=true; + } else { + if ((((x-2+5)/5)-1)==tmpDemand.streetNumber) + result=true; + } + } + return result; + } + + boolean isSamePoint(Demand tmpDemand) { + boolean result=false; + if (tmpDemand.x==x && tmpDemand.y == y) + result=true; + return result; + } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/VehicleStack.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/VehicleStack.java new file mode 100644 index 0000000..2aa1b23 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/VehicleStack.java @@ -0,0 +1,60 @@ + +import java.util.ArrayList; + + +import processing.core.PApplet; + +public class VehicleStack extends PApplet{ + public ArrayList vehicleList; + public boolean isHorizontalStreet; + public VehicleStack() { + vehicleGen(); + isHorizontalStreet =true; + } + public void vehicleGen() { + vehicleList = new ArrayList (); + for (int i=0; i Date: Mon, 11 Apr 2016 10:30:40 -0400 Subject: [PATCH 05/14] fix problems fix problems --- .../Misc/UrbanAutonomous/DemandStack.java | 17 +- Processing/Misc/UrbanAutonomous/Disp.java | 4 +- .../Misc/UrbanAutonomous/FileControl.java | 3 +- .../Misc/UrbanAutonomous/MapBlockStack.java | 45 +- Processing/Misc/UrbanAutonomous/SimParam.java | 9 +- .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 18 +- .../Misc/UrbanAutonomous/VehicleStack.java | 8 +- .../build-tmp/DemandStack.class | Bin 6571 -> 6620 bytes .../Misc/UrbanAutonomous/build-tmp/Disp.class | Bin 5487 -> 5529 bytes .../build-tmp/FileControl.class | Bin 457 -> 574 bytes .../build-tmp/MapBlockStack.class | Bin 2579 -> 2817 bytes .../UrbanAutonomous/build-tmp/SimParam.class | Bin 1806 -> 1876 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 979 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 2416 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 11205 -> 11225 bytes .../build-tmp/VehicleStack.class | Bin 1499 -> 1547 bytes .../build-tmp/source/DemandStack.java | 17 +- .../build-tmp/source/Disp.java | 4 +- .../build-tmp/source/FileControl.java | 3 +- .../build-tmp/source/MapBlockStack.java | 45 +- .../build-tmp/source/SimParam.java | 9 +- .../build-tmp/source/UrbanAutonomous.java | 18 +- .../build-tmp/source/VehicleStack.java | 8 +- Processing/Misc/UrbanAutonomous/ruralMap.txt | 174 +++++++- .../Misc/UrbanAutonomous/ruralMapOLD.txt | 256 +++++++++++ .../Misc/UrbanAutonomous/ruralMapbak.txt | 396 ++++++++++++++++++ Processing/Misc/UrbanAutonomous/urbanMap.txt | 144 ++++++- .../Misc/UrbanAutonomous/urbanMapOld.txt | 256 +++++++++++ 28 files changed, 1331 insertions(+), 103 deletions(-) create mode 100644 Processing/Misc/UrbanAutonomous/ruralMapOLD.txt create mode 100644 Processing/Misc/UrbanAutonomous/ruralMapbak.txt create mode 100644 Processing/Misc/UrbanAutonomous/urbanMapOld.txt diff --git a/Processing/Misc/UrbanAutonomous/DemandStack.java b/Processing/Misc/UrbanAutonomous/DemandStack.java index c2bdd4a..13e2c9b 100644 --- a/Processing/Misc/UrbanAutonomous/DemandStack.java +++ b/Processing/Misc/UrbanAutonomous/DemandStack.java @@ -43,6 +43,7 @@ public void init() { // Demand Generation public void demandGen(int _numberOfDemand, int _updateInterval) { + //java.lang.System.out.println("test"); if (UrbanAutonomous.simParam.currentTime % _updateInterval == 0) { for (int i = 0; i < _numberOfDemand; i++) { isHorizontalStreet = !isHorizontalStreet; @@ -53,11 +54,13 @@ public void demandGen(int _numberOfDemand, int _updateInterval) { if (isHubEffective(tmpArrivalDemand, tmpDepartureDemand)) { unallocatedHubArrivalList.add(tmpArrivalDemand); unallocatedHubDepartureList.add(tmpDepartureDemand);// departureDemand - } else { - unallocatedArrivalList.add(tmpArrivalDemand); - unallocatedDepartureList.add(tmpDepartureDemand);// departureDemand + } else{ } } + else { + unallocatedArrivalList.add(tmpArrivalDemand); + unallocatedDepartureList.add(tmpDepartureDemand);// departureDemand + } } } } @@ -76,14 +79,14 @@ Demand demandCreation(boolean isDepartureDemand) { Demand demandCandidateGen(boolean isHorizontalStreet, boolean isDepartureDemand) { Demand _demandCandidate; if (isHorizontalStreet) { - int streetNumber = (int) random(16); + int streetNumber = (int) random(UrbanAutonomous.simParam.maxY); int y = streetNumber * 5 + 2; - int x = (int) random(80); + int x = (int) random(5*UrbanAutonomous.simParam.maxX); _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); } else { - int streetNumber = (int) random(16); + int streetNumber = (int) random(UrbanAutonomous.simParam.maxX); int x = streetNumber * 5 + 2; - int y = (int) random(80); + int y = (int) random(5*UrbanAutonomous.simParam.maxY); _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); } return _demandCandidate; diff --git a/Processing/Misc/UrbanAutonomous/Disp.java b/Processing/Misc/UrbanAutonomous/Disp.java index 0cc9bfa..f673201 100644 --- a/Processing/Misc/UrbanAutonomous/Disp.java +++ b/Processing/Misc/UrbanAutonomous/Disp.java @@ -43,8 +43,8 @@ void showHubRelocation(){ // ShowMap void oldshowMap() { - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) p.image(UrbanAutonomous.mapBlockStack.mapBlockArray[x][y].pg, x * 50, y * 50); } diff --git a/Processing/Misc/UrbanAutonomous/FileControl.java b/Processing/Misc/UrbanAutonomous/FileControl.java index 3a98e76..f51a886 100644 --- a/Processing/Misc/UrbanAutonomous/FileControl.java +++ b/Processing/Misc/UrbanAutonomous/FileControl.java @@ -5,7 +5,8 @@ public class FileControl extends PApplet { public int [] customMap; public FileControl() { - customMap = new int[(16*16)]; +// customMap = new int[(16*16)]; + customMap = new int[(UrbanAutonomous.simParam.maxX*UrbanAutonomous.simParam.maxY)]; } public void outputCSV() { diff --git a/Processing/Misc/UrbanAutonomous/MapBlockStack.java b/Processing/Misc/UrbanAutonomous/MapBlockStack.java index 9909895..8a099d5 100644 --- a/Processing/Misc/UrbanAutonomous/MapBlockStack.java +++ b/Processing/Misc/UrbanAutonomous/MapBlockStack.java @@ -1,7 +1,7 @@ import processing.core.PApplet; import processing.core.PGraphics; - +import static java.lang.System.out; public class MapBlockStack extends MapBlockBase{ public MapBlock[][] mapBlockArray; public PGraphics pg; @@ -9,52 +9,59 @@ public class MapBlockStack extends MapBlockBase{ public MapBlockStack(PApplet _p) { p=_p; - mapBlockArray = new MapBlock[16][16]; + mapBlockArray = new MapBlock[UrbanAutonomous.simParam.maxX][UrbanAutonomous.simParam.maxY]; randomGen(); } public void randomGen() { - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) mapBlockArray[x][y] = new MapBlock(this.p,specificTileArrayGen(p)); } public void customMapGen() { UrbanAutonomous.simParam.mapType = 2; - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; } public void noneMapGen() { + //fileControl.customMap[UrbanAutonomous.simParam.maxX * y + x] = brushNumber; + for (int i = 0; i < UrbanAutonomous.simParam.maxY*UrbanAutonomous.simParam.maxX; i++) + UrbanAutonomous.fileControl.customMap[i] = 3; UrbanAutonomous.simParam.mapType = 2; - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) - mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; } public void loadUrbanMap() { UrbanAutonomous.simParam.mapType=0; String lines[] = p.loadStrings("urbanMap.txt"); - for (int y=0; y<16; y++) - for (int x=0; x<16; x++) - mapBlockArray[x][y]= UrbanAutonomous.mapBlockBrushs.specificBrushs[Integer.parseInt(lines[y*16+x])]; + for (int y=0; yKfMAnKx0vZB=gkh0{EvPWbypRdA#FJkM> z`YKO>f*z93s-P!&3G}i#J?hLxceU!Pv{$=m{2rQnXV@Ezy;-VD|2Q z`STJm5~D2`MIm#2)pk#DW5Db2y1k8l1wX=N0`Y#Qd$!$YcMBxiDvWhu0xrim3&xTj z#3>k$J`As#MxRgh1S*|wT122o!35AyJ@uR8uU zJ;fuRA&-|Rn2aerPPYl=Om*pih6wJgdfn-BRriatPpx5lASr;Ut z9E)WrEun$wr!uNQSCyk$L5(z0AE&=N?)7&_YM%6Ft%9YfV+hc3C0?)3;bcbAVDXC< z*(#kbmA)%Sy@F-(HnCjp+zLF}Zbbqb;IrU5Dkgaq_`$Hra0Ih+cIe4k-pjnv)NfMo zV=1CnnER`|9#sllplLiU4Ut() zCRr`Y{4>3QDei^>Cf_1o=k7h7wsUV}5{MwopxCOUb@Ke%*I0d(11LKAK zvsIt7p-%PLUGvmBXN^lOW+jw|&m&OKCTzCgc7fDrbOm?dPCDBkU`_PXj<)keP$7~i z=x4acg1c#?3$Q5IB4wE?Dre1>ael9YW^Ch&m&yW{mRFX4exysoZC7x=OrWG%pVv(# ziv!+C^0o&QJSYVwOrA2kcuwWqIaB0gb}4uWaSWbrk4p>7`yN)XN8T6bQ{CPs`gIc? zQSfugoa|Hms;@~6tJ3nsFBCk6Us7d1>#XLQGHLk773{m9sV7O5TNOMRuJWXSmoCVR z=9)6U;rNWa=pK^cunGGWJS8jd3<;yJr&H%%T{e}URXZTC&p=AcXFbOB{k_9i)sG(L7 zq$>C|UZy=g>T`LRnDnBOUQU1n&X8heAihBa$et-&WR z{k?)WWqw)e?EaaQFFp0Pf_LyPFQnz^fLLi^M(X>hx8MUhlv^qIBLyd=;AFCO7igR6 zSsJL5%x)>_V+EfCMNMM3>Xx@TYt;bzLC!Kggc2a&?xQo&D?57cXcGZYIdu!MpvcvK$`wn_( zkiA@k?Bs+!NnxMoXBu}$d20+|jdefzT21ZfXYCX7>fyw8^tT>D*24X`s2$m%Wlm^0 zIJC^Qn%glXcrxEq)Pf$?HsoiTW~~zqS}LTG5-!nE+>jha0Q02qvv4;@=-~6Ev(ujILvlphLGA1BeU*`FR6VT#Wl5J zL>tCrHEe_1G_i%Qp(%$n!(wWIS+ldL1BK(wR zrSrMUmDtkxElB4kyBnROqt}_lfXtm;JI?jaaE@#vI0la7^G5L*qp9g-%$PBl#7`T> zau}GvhCUH)@--4Gy;FerPV^Sj>76ca&C*Nsljg1OFxG-{{ulENQew{1`;g<6@%jmT zy-a{q?X{U5u+6X*bYOOK*H;Dmh}R>hr^YjtgXJ_vO__G5i4ypSQ;;F*7;{HvPh(~? zimaM_D%W>l{)RE;G;@4i?2<9D)_4uQs7}Yn9YXoSw79g`G;?Oweq1}V1>^LCi=rQ_ zj5rv}qsGBYL%Le2B^at^j$Fy8U_4jS{d4)|`Iyd_uAl{LP{lFjYV92fh?&rd%V;1T z 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 delta 2382 zcmcIkX>e0j6#j1WUS5*kCTY@8Y6_&_6bMTtpg2^JN}WNbtvVns%qXFaCK{UZn%1IX zMX-R1RWB|@MNlAG5u}7DsEBAq5ph9qL%^-9S}Tf*NWC{N=`w=@{%|r$?m726-}%n+ zUc;bPw`tp{jhg^?NX}Z*R4I!zG6!-53Z4#myTOn_0G!-G33bP`rg}2uO_}Y^Hc8Zq1a& zE(HYkJ&JAY2BmN6c8U+gU1n7|%TY2*-1v~s#5xXdM zivrT8hpGeRH;w1&Lu!0LBEjbrU*JpDrsQ3)hvIAOB{2A_rp0?mU@97)IOiL&AKxnY zhTkWB6yM={Hra5lrv6};P)IE^;-C<95Y2+*M~a`&%2pYM7q^M9 zUkEaI*cCoCP~rEf-eAXs_TyKI-_T0n@Sg^7i4o`FcZxsoC#MLr8AeCHlqr`9?_U%r zMQ>6|t5nrj9-b7K?i2n~6z#0cc;SQ;N_1i<2Gv&@E)JFP+xehMsarx^NS;}4c>qU2sUF; zk$X@Kk8*P{!Q%EKP2iv<{|;gorxlQTHao3X?XoCVXuxZeY>h>OqFBY9qofGzSyD1d ziF-&4YlI!oa)_gv&WuWmTE3Rokpesa&E+c%UTG#SWxdRKL+gQdI3Oz^3K|vELwsRz zSlT&K$K9HP2Z=}eHnVf&`UY6tQCOPrN(`??kfs@%xFJql+M8CB-!Qd~pWfC^wyn0U zY`ghtnc5)3T$J=i?47pCq*GwC#++CwjvU zTSoI)46t_0q9lTnA&I6p77vc%Q_*EPf}vS*au%Z`Ey-tDl2&S+IEYH?VyNM(C7|&! z?ch}L!yEotN{Yb3OiM^U`OHPArt3Z%((3a*KVEgjZXr zez`sQr=34yDRC!XFalO!>ydmc{?}2QMt$-bVY_Vwxo1}e8*T4jOT@cnzBan65_=~` zL?ovtN(|c4bvjZthfUkUco?B)9VVJiESy62*J)?FX2gh1ywtQj?6|#Rtb>yZX~Q*X zV(o;Wo}Gd;M^-mMNfPX1D>J4|Jg18?9F3A*U81?!yIX8WqGR2G-0T8mQye3eK78CM G#Pts#M!=T< diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/FileControl.class b/Processing/Misc/UrbanAutonomous/build-tmp/FileControl.class index 8afc3e4f0c403b97058fe3d53b965a648e02b8c1..b70503353f8ed2ab8b4c5cdd503162aed7da9855 100644 GIT binary patch delta 321 zcmZ9F%Sr-a6vuzxXzC1~qgkmnUCizyM6?Q8wG1qR2x>Wokc)A`nE`3zGt9cDDC|On z`+9<&COSrL;=uo$^S_+)ks76~&+oSpuumhgyg{Bq7F$uc=(W7=Q5*%`zz^b3Q)F6^ z3p@Uq*YkXZ)ja>34^3v6%Q7qagwvF%DAK;yzf`E>v1MMfFd?r@6pNZEGV-k1>9$W} zztv6#4f8yQlM*YZ=(57aK?d0oja6n3SsJbs$?jw3g=@+Xv z@75E}gJ_B+L0g=VC5=gi@s(wAf~K&0q8ZYQ?hxmdm8M%-Ydo{@Kb@C^O+iYrBYwlc F{Q<|TI2`~0 delta 188 zcmZ9EOAY~16hzPM7N3{bn)cU5CX$wP#1>3hgcu8n7Gf7-B@(}gn6m?$5tpIKt;(re zbx%E9^L$_LK%dsuj9tOozB=imC7`rROFOJ6nk*N|Y&sgx<7Ax}gqo#JV>gh^D#lR& z`RI&^io(qtv3n&#{>yRoW=N66Bd63?C+eW5nWI{W4%iEYVHA|RC#wH#`|J9;B{cQl GA^ZSvz8Oyd diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class index eb272129a6a0606f6f67bada347dc75705249a82..7586701100aca2d91ebc6b2db76225a0a646ab2f 100644 GIT binary patch literal 2817 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 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class b/Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class index 27556ad7b9034a643add1112b30db973eb512334..5b22416a88af189db59a1c078793e5837c584f12 100644 GIT binary patch literal 1876 zcmZuy+fo}x5IrjibYXzyYHSlOzF=5muyJf-8xyd=hD2B-V8SIAR?-5CrIoU*sE|+b zL#px#aUoKba^(Z^lt0K*p7NBZ2gKyt5|oA>OTzHPh4J3Gvdd+1~wZ#UTEm8hI^3U1yGoI*V@>3UZ5 zh0hYS?D%eF&++ZzS^DB7yRv#zq3gye*K>nu1JU7;H6}b=E;uPf(XVhBy-64tRA@k> zMpqT$A-b;6jV`Ubq0kwk5rs?P>P>~#5ZzK}3DLMhGDLS25+S;)&=#V53hg0!pwJwm zhYBi0j}=mA(x*L9Fhlf_LPxkdt8gJiX@#B;%`03)BWsj#J?DjxXEjV^OkX#NMSK#+ z$2559=WK7b8kD_qsa!o!$Y9BUsuN-*u=B52vrIj6GJl*x7N5qkOuO@Xh0oAyAXVS{ z-0}1|s|qi{%r@1_9C~cd)JdYJbhwVqILP#-b83a>x&n*%Lg7n%#m-^H>k*|g3w6xR z+j_Ij^-~?oTCEhwizFQv6dW`e=&gEou~-(m)K4LG>y+1qy9#@74fOoauwwf`)ps&% z4Fg>nY1eAt7RQD3TFnSvf!$1Ucf4m=!9$tMI*_g+&Df63a*ZXDFsw>yrCjy%&NElD zz4`Qk7}MS`$ht@QesoZhh(v~_p-2)*B&j8mG!aSSh$NLnl7u2jOOYgzNYYOv$tRMO z5=lynB*{gRU?NE`ktCN$5}q>3h}bL~KVWd%jMAX?AL}RdS!R0;1D4rc!xbx9!!3*$uPN?Bp0XCpac#Oo}EYt4%U0(KHKg5!`C_(cTpMHW}Mx>=1pY*mQ|~ zw~QA!)-WYuPFrSc4KtQGQNvTw%>5{tdB$-~ve$uJD<-O3gL?u44p4 z7{d+R#V{s0n}&rs+$8Hq*-p3cJ6Hd}IR3yJ)&u7vLT%cApQ+13oyDd^jF*ckayF_fkt>%i1``Xlz>-hoEh8 z<_9FipPrhXmDjk$qmGde=S7+9oM1m|$%e>!QCIgEL$6_KImOQ!V|8^v5$N;`@kIot pn3^YiL#O#-%`h>uc!Z~1Ph*LR*u*?4v}!=~;y^!R{YJL?{{e%;c;f&7 delta 1045 zcmYLIOHUI~6#k|yl$I;BfRtCEK zVd5V!fiN{O#vkCyL^rNnxzgWYJogT2CNt-|-<@;rIo~<=YtgGB`={UUKLQ9~|J3d~ zoh&gabLY{Rl65mwqRIvZbqr-F70Am_VxR_w3gio}iQ$@oni-gZS{bYcYGcSVPzOV? zf&2^(19dYL8mNcCZlFGf0@!SR3O&G3M3B%RgVWd^X1H#kQHF8@jWf8krzW>Mj2l)= zDJWh!+EP;!ne;*GVE-U<%rK1^?c7w~J%^iC%qw84@ts608DCDTu|0+esub8y3~nZ# zvLTE`h9%t6EM|`y#T_e_6%Vagb1JaVL(o$cgrA|vr zB1=mWOY6F_)OA{$={%Ya`c~7?5z0X!_7{JL8g9{1%gs7G0@VxD$W1!9k6U%L2$Bo3 zojdG0I=Q1(N0%T1+-ds!fw*36KJR6=U+xFFqgclfcLa2dNM`I@<`bgtqRh1#7SvG9 zZW@+aV(MrzJ+$(oo}OkjpdF1g-%SX@hf!jt(Sk2%#W!$#M;m_7A3xDSHBd{9nve~_ zB#WxJz+?`y7g)&Q_61gQSQpv){-;q+JrZ$7(`O8Hgnis;?l#kmK2I!!gB_Pp!(@;>?A=& xMkWYhd~yT^=t>3Y>JCz?hDnAI3{m;h7{da_X)Ht7rGN8auJqJVvU}1!`3HBgn_U0^ diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$PFrameI.class b/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$PFrameI.class index 46fa109324b7164b179fba4590d5f42710cac21c..af56ba2b29a05f4fcd3521f84c7031a17cee954e 100644 GIT binary patch delta 57 zcmcc2ewlqk3$t!D11ngCS!fgBfEHgEeC@g9~E`gEwO- MgFj>03V0kHrO0ki-d0kr@v0k@MB2u2mV00aTN00;rS01pAa02~3o z03ZRtlWz#9F~a~b0mlG30muM70n7kL0nGqP0nq?d0nz|h0o4Fu0oDL%0oMR?0oee1 N0onk90p62H2`G{1E7<@5 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class b/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class index a7b319e6b094c5872a6445f37bbabf59372b4ee1..6665bcaec80be6451221110093db8a0799bf93f7 100644 GIT binary patch delta 5969 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 w5xr2hwg|m=v8cGx6dwaVgI=uphr>nj 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 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/VehicleStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/VehicleStack.class index 7d5784923e6201f2774cdbcf3465c2fe44fcd668..7301935b4471fbb65af034f95e48fc9a8b78f9b8 100644 GIT binary patch delta 325 zcmXw#ze~e#5XCgim!%mj9{SI#U!(3|61p^0^eL5)uiYURCLpqTrA7!DS$n4Rkv~UR#-z zRy;$sb14SMFvtus;bsVzI7Jfd2!neJ(_n;CY?`FFV3bS7xE61?V}b|Le0V2nZ+8wg YjMNE`qp~eWg`YL=UX6u|qLW$w1p;A1i2wiq delta 276 zcmeC?xy{XW>ff$?3=9lL3;`RtW-#foI4xjc;9_88aN}WcXYgQTU@J<@OUch=WMI*7 z({y8TYye4HGkEhba5MO9e!`c&R}6%sAfBe=1Htpj9!ziS@j$> z7*rSx7*rX|7}OZ77}OaY7&I8%7&IBe8MGK;8FUy@8FU$P8T1&68T1*-fhubm3>lh% xzM8^d%rG6OYsKVMta4(e46N)7j3B_kz$DD1#3T%Kw(sP7tZM9jKo%2&KLFC0H17Za diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/DemandStack.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/DemandStack.java index c2bdd4a..13e2c9b 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/DemandStack.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/DemandStack.java @@ -43,6 +43,7 @@ public void init() { // Demand Generation public void demandGen(int _numberOfDemand, int _updateInterval) { + //java.lang.System.out.println("test"); if (UrbanAutonomous.simParam.currentTime % _updateInterval == 0) { for (int i = 0; i < _numberOfDemand; i++) { isHorizontalStreet = !isHorizontalStreet; @@ -53,11 +54,13 @@ public void demandGen(int _numberOfDemand, int _updateInterval) { if (isHubEffective(tmpArrivalDemand, tmpDepartureDemand)) { unallocatedHubArrivalList.add(tmpArrivalDemand); unallocatedHubDepartureList.add(tmpDepartureDemand);// departureDemand - } else { - unallocatedArrivalList.add(tmpArrivalDemand); - unallocatedDepartureList.add(tmpDepartureDemand);// departureDemand + } else{ } } + else { + unallocatedArrivalList.add(tmpArrivalDemand); + unallocatedDepartureList.add(tmpDepartureDemand);// departureDemand + } } } } @@ -76,14 +79,14 @@ Demand demandCreation(boolean isDepartureDemand) { Demand demandCandidateGen(boolean isHorizontalStreet, boolean isDepartureDemand) { Demand _demandCandidate; if (isHorizontalStreet) { - int streetNumber = (int) random(16); + int streetNumber = (int) random(UrbanAutonomous.simParam.maxY); int y = streetNumber * 5 + 2; - int x = (int) random(80); + int x = (int) random(5*UrbanAutonomous.simParam.maxX); _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); } else { - int streetNumber = (int) random(16); + int streetNumber = (int) random(UrbanAutonomous.simParam.maxX); int x = streetNumber * 5 + 2; - int y = (int) random(80); + int y = (int) random(5*UrbanAutonomous.simParam.maxY); _demandCandidate = new Demand(x, y, streetNumber, isHorizontalStreet, isDepartureDemand); } return _demandCandidate; diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java index 0cc9bfa..f673201 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java @@ -43,8 +43,8 @@ void showHubRelocation(){ // ShowMap void oldshowMap() { - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) p.image(UrbanAutonomous.mapBlockStack.mapBlockArray[x][y].pg, x * 50, y * 50); } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java index f0ca7f7..5e32ee7 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/FileControl.java @@ -5,7 +5,8 @@ public class FileControl extends PApplet { public int [] customMap; public FileControl() { - customMap = new int[(16*16)]; +// customMap = new int[(16*16)]; + customMap = new int[(UrbanAutonomous.simParam.maxX*UrbanAutonomous.simParam.maxY)]; } public void outputCSV() { diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java index 9909895..8a099d5 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java @@ -1,7 +1,7 @@ import processing.core.PApplet; import processing.core.PGraphics; - +import static java.lang.System.out; public class MapBlockStack extends MapBlockBase{ public MapBlock[][] mapBlockArray; public PGraphics pg; @@ -9,52 +9,59 @@ public class MapBlockStack extends MapBlockBase{ public MapBlockStack(PApplet _p) { p=_p; - mapBlockArray = new MapBlock[16][16]; + mapBlockArray = new MapBlock[UrbanAutonomous.simParam.maxX][UrbanAutonomous.simParam.maxY]; randomGen(); } public void randomGen() { - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) mapBlockArray[x][y] = new MapBlock(this.p,specificTileArrayGen(p)); } public void customMapGen() { UrbanAutonomous.simParam.mapType = 2; - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; } public void noneMapGen() { + //fileControl.customMap[UrbanAutonomous.simParam.maxX * y + x] = brushNumber; + for (int i = 0; i < UrbanAutonomous.simParam.maxY*UrbanAutonomous.simParam.maxX; i++) + UrbanAutonomous.fileControl.customMap[i] = 3; UrbanAutonomous.simParam.mapType = 2; - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) - mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; } public void loadUrbanMap() { UrbanAutonomous.simParam.mapType=0; String lines[] = p.loadStrings("urbanMap.txt"); - for (int y=0; y<16; y++) - for (int x=0; x<16; x++) - mapBlockArray[x][y]= UrbanAutonomous.mapBlockBrushs.specificBrushs[Integer.parseInt(lines[y*16+x])]; + for (int y=0; y Date: Mon, 11 Apr 2016 12:35:35 -0400 Subject: [PATCH 06/14] land custom based on colortizer --- .../Misc/UrbanAutonomous/MapBlockStack.java | 13 +++++++++++-- .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 9 ++++++--- .../build-tmp/MapBlockStack.class | Bin 2817 -> 2941 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 979 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 2416 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 11225 -> 11317 bytes .../build-tmp/source/MapBlockStack.java | 13 +++++++++++-- .../build-tmp/source/UrbanAutonomous.java | 9 ++++++--- 8 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Processing/Misc/UrbanAutonomous/MapBlockStack.java b/Processing/Misc/UrbanAutonomous/MapBlockStack.java index 8a099d5..e2e0102 100644 --- a/Processing/Misc/UrbanAutonomous/MapBlockStack.java +++ b/Processing/Misc/UrbanAutonomous/MapBlockStack.java @@ -23,8 +23,17 @@ public void randomGen() { public void customMapGen() { UrbanAutonomous.simParam.mapType = 2; for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) - for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) - mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++){ + if(UrbanAutonomous.tablePieceInput[x][y][0]==0||UrbanAutonomous.tablePieceInput[x][y][0]==1||UrbanAutonomous.tablePieceInput[x][y][0]==2||UrbanAutonomous.tablePieceInput[x][y][0]==3) + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[UrbanAutonomous.tablePieceInput[x][y][0]]; + else{ + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; + //java.lang.System.out.println(x); + //java.lang.System.out.println(y); + //java.lang.System.out.println(UrbanAutonomous.tablePieceInput[x][y][0]); + + } + } } public void noneMapGen() { diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde index 949b1d4..bcad6f5 100644 --- a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -28,8 +28,8 @@ int projectorOffset = 1842; int screenWidth = 1842; int screenHeight = 1026; -int displayU = 18; -int displayV = 22; +public static int displayU = 18; +public static int displayV = 22; int IDMax = 15; @@ -38,7 +38,7 @@ int TABLE_IMAGE_HEIGHT = 1000; int TABLE_IMAGE_WIDTH = 1000; // Arrays that holds ID information of rectilinear tile arrangement. -int tablePieceInput[][][] = new int[displayU][displayV][2]; +public static int tablePieceInput[][][] = new int[displayU][displayV][2]; public static DragStatus dragStatus; @@ -144,6 +144,9 @@ public static int brushNumber; } public void draw() { + if(simParam.mapType==2) //custom map + mapBlockStack.customMapGen(); + // Exports table Graphic to Projector projector = get(0, 0, TABLE_IMAGE_WIDTH, TABLE_IMAGE_HEIGHT); diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class index 7586701100aca2d91ebc6b2db76225a0a646ab2f..a0c4951549cb1850b349edc2a37f13423fbd9ff4 100644 GIT binary patch delta 1172 zcmb7DT~iZR7=F&~CQHI8Bw}L&;X^G{fGBKqr*G3r^GvFFLdHp7ZW|&hwn-Iq$jSTlcwN z{rktC05tsi+3zI3Sb#_g7KlSi=Fi zX9aU|Xa(b|=niOgn%w>yg5|lgjQVooSca#ZIG>^+Sio-Dvx=hy^pz`GVg)ttm7H2) zL1F=-94Wy6Y~#rSW3;QLfW~JVi_hse682DRfs5iNWRf2oweX@2Q3No82J)~Lx9I;8 znyGg{HMIoJN>G?qTP^)V8yI4uSM@9X1)LN~wNtT=B_68#`dUeK5LIZ!F0@hHi+1e8 zeu@zq2PwaVj!jq(oFzC|WxxjBwuL$9-W7am3#`{jlTFfQYa?kB z^`qKLToAE}y@xcCv7e5406rWfAze63V?X5ybia|Htiz{bWK%`c7MU)7uV`pX{ZFzZ zM0S+OdWbAUWW7WdBC;ML>-#X-xEOY|GDF;U`Pig*>^jyQCZ{5BlkL@r;bWYnGsg%n zN?;KJ3uBZX(z>fToq>lO|A?;Q)tjE03z8{buiQjm5m(nRL-|Y*v-aS{MiJM`vs-rK zb=h{>PR^`ieyf+X0)7g3w28$!I~1`XmfZD80=f6LP1;dOtY=7Wf|_NB?({6(;4nJr h?RMcj{W%AnauXMj$Hh(gRZvRkeAnm)gdyRV{{UsZ_45D# delta 1039 zcma)3$xjnu6#splX{QXIKwW^^3J4S_n^G1xKmkF^;s)-5OtH4mc3P*cf*US~dNkj` zBf$$-!9t7&6Jz4Rg9k7AFL?0}FettO!_CA@@?PJ(>2G_#@*m`@pMJl62f&AC3u==^ z1T5w57PKj7WytB*5*^X_Xr#kPC&NjOLpUs6TK3pFIgX%9e6y4|kHW9u7(;gVSTxuf z*HcD3%F%;f;gCvQ#~FCq2xvMX)ukpR6y&u0s)90M2>HZdmffa4(^ ziIBC*mcV0cgD+Y^56i`Uj36AY>z=fUE>u5d* zH(dzGfxH6FRv@#@Kj|xmcH~jrM7vjiafhXrdE_plBZF@7RjHRv3c>BQo)TCIF$X0m zrN@gh!Y)SxJm{o;lI9^)h+(^v^@$04QFZ?^PV`Bw^JtdZ=22diLD>$Udl4pJHT5kS zIKw+ed~a|@ytmg(c}aT}>8?gTYDj%8_EYbsd4QNq{SL^#kgwp@} zz#w7EOK2oU$L8VxRbg3|v9F$F_=u{3WHgeDCX&%eG8#xm^S@<`h%Z^*Ld|UtZ<9xS zE;~6h9lL!lUj{+3MQ!)&rvMK?rE}z>1=}e6ChBc8chma;;u)dLCshv%i&?dJYHSHH z!iX&+ZZ-#2myz1|HDMmA+056BHnxb{8+23dJYRUmWtL^!pSG~SY0s^Gn`X?l7Jc#D z>c@5P=>^Knf=a4&$foKi_dO^qMK9gCk8aS9dK@S7Coo7|qgkhWr*TSL$u3Zyto{Az EA1{g8YybcN diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$PFrameI.class b/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous$PFrameI.class index af56ba2b29a05f4fcd3521f84c7031a17cee954e..a6c00d57bd4fe5017caf0c98b6411df4efeaf591 100644 GIT binary patch delta 57 zcmcc2ewlqk3$tz=11n=O11Dn%gE(U;g92k2gAQXkgCS!DgBfEbgEeCng9~FdgEwOh MgFj>K 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 K+kwA3iT@Xh#?~bO diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java index 8a099d5..e2e0102 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/MapBlockStack.java @@ -23,8 +23,17 @@ public void randomGen() { public void customMapGen() { UrbanAutonomous.simParam.mapType = 2; for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) - for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++) - mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++){ + if(UrbanAutonomous.tablePieceInput[x][y][0]==0||UrbanAutonomous.tablePieceInput[x][y][0]==1||UrbanAutonomous.tablePieceInput[x][y][0]==2||UrbanAutonomous.tablePieceInput[x][y][0]==3) + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[UrbanAutonomous.tablePieceInput[x][y][0]]; + else{ + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; + //java.lang.System.out.println(x); + //java.lang.System.out.println(y); + //java.lang.System.out.println(UrbanAutonomous.tablePieceInput[x][y][0]); + + } + } } public void noneMapGen() { diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java index 61d3fe9..61830a0 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java @@ -48,8 +48,8 @@ public class UrbanAutonomous extends PApplet { int screenWidth = 1842; int screenHeight = 1026; -int displayU = 18; -int displayV = 22; +public static int displayU = 18; +public static int displayV = 22; int IDMax = 15; @@ -58,7 +58,7 @@ public class UrbanAutonomous extends PApplet { int TABLE_IMAGE_WIDTH = 1000; // Arrays that holds ID information of rectilinear tile arrangement. -int tablePieceInput[][][] = new int[displayU][displayV][2]; +public static int tablePieceInput[][][] = new int[displayU][displayV][2]; public static DragStatus dragStatus; @@ -164,6 +164,9 @@ public void setup() { } public void draw() { + if(simParam.mapType==2) //custom map + mapBlockStack.customMapGen(); + // Exports table Graphic to Projector projector = get(0, 0, TABLE_IMAGE_WIDTH, TABLE_IMAGE_HEIGHT); From 75b09a11ab16bb6319d60c3cb0de166a5551a937 Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Tue, 12 Apr 2016 00:32:56 -0400 Subject: [PATCH 07/14] fix --- .../Misc/UrbanAutonomous/BasicTile.java | 20 +++++------ Processing/Misc/UrbanAutonomous/Disp.java | 4 +-- Processing/Misc/UrbanAutonomous/MapBlock.java | 7 ++++ .../Misc/UrbanAutonomous/MapBlockBase.java | 5 ++- .../Misc/UrbanAutonomous/MapBlockBrushs.java | 2 +- .../Misc/UrbanAutonomous/MapBlockStack.java | 5 +-- .../Misc/UrbanAutonomous/OperationWindow.java | 2 ++ Processing/Misc/UrbanAutonomous/TileType.java | 3 +- .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 34 +++++++++++------- .../UrbanAutonomous/build-tmp/BasicTile.class | Bin 2470 -> 2730 bytes .../Misc/UrbanAutonomous/build-tmp/Disp.class | Bin 5529 -> 5524 bytes .../UrbanAutonomous/build-tmp/MapBlock.class | Bin 2055 -> 2197 bytes .../build-tmp/MapBlockBase.class | Bin 1443 -> 1482 bytes .../build-tmp/MapBlockBrushs.class | Bin 1735 -> 1735 bytes .../build-tmp/MapBlockStack.class | Bin 2941 -> 2944 bytes .../build-tmp/OperationWindow.class | Bin 2927 -> 2927 bytes .../UrbanAutonomous/build-tmp/TileType.class | Bin 1160 -> 1215 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 979 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 2416 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 11317 -> 11430 bytes .../build-tmp/source/BasicTile.java | 20 +++++------ .../build-tmp/source/Disp.java | 4 +-- .../build-tmp/source/MapBlock.java | 7 ++++ .../build-tmp/source/MapBlockBase.java | 5 ++- .../build-tmp/source/MapBlockBrushs.java | 2 +- .../build-tmp/source/MapBlockStack.java | 5 +-- .../build-tmp/source/OperationWindow.java | 2 ++ .../build-tmp/source/TileType.java | 3 +- .../build-tmp/source/UrbanAutonomous.java | 34 +++++++++++------- .../Misc/UrbanAutonomous/data/hrTile.png | Bin 132 -> 118 bytes .../Misc/UrbanAutonomous/data/hwTile.png | Bin 132 -> 115 bytes .../UrbanAutonomous/data/intersectionTile.png | Bin 117 -> 173 bytes .../data/intersectionTileOLD.png | Bin 0 -> 117 bytes .../Misc/UrbanAutonomous/data/lrTile.png | Bin 132 -> 118 bytes .../Misc/UrbanAutonomous/data/lwTile.png | Bin 132 -> 118 bytes .../Misc/UrbanAutonomous/data/noneTile.png | Bin 126 -> 173 bytes .../Misc/UrbanAutonomous/data/roadTile.png | Bin 118 -> 173 bytes .../UrbanAutonomous/data/roadTileback.png | Bin 0 -> 118 bytes .../Misc/UrbanAutonomous/data/sideDisplay.jpg | Bin 0 -> 18828 bytes 39 files changed, 100 insertions(+), 64 deletions(-) create mode 100644 Processing/Misc/UrbanAutonomous/data/intersectionTileOLD.png create mode 100644 Processing/Misc/UrbanAutonomous/data/roadTileback.png create mode 100644 Processing/Misc/UrbanAutonomous/data/sideDisplay.jpg diff --git a/Processing/Misc/UrbanAutonomous/BasicTile.java b/Processing/Misc/UrbanAutonomous/BasicTile.java index b8a4985..d1f6fd7 100644 --- a/Processing/Misc/UrbanAutonomous/BasicTile.java +++ b/Processing/Misc/UrbanAutonomous/BasicTile.java @@ -4,6 +4,7 @@ public class BasicTile { public Tile hrTile; public Tile lrTile; public Tile roadTile; + public Tile noneTile; public Tile intersectionTile; public BasicTile() { @@ -23,17 +24,16 @@ public BasicTile() { float[] lrArrivalProbabilityArray = { 0.03f, 0.03f, 0.03f, 0.03f, 0.10f, 0.13f, 0.12f, 0.07f, 0.07f, 0.07f, 0.07f, 0.07f, 0.10f, 0.10f, 0.10f, 0.10f, 0.30f, 0.30f, 0.30f, 0.17f, 0.13f, 0.10f, 0.07f, 0.03f }; lrTile = new Tile(lrDepartureProbabilityArray, lrArrivalProbabilityArray, TileType.LR); - float[] roadDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 }; - float[] roadArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 }; + float[] roadDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + float[] roadArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; roadTile = new Tile(roadDepartureProbabilityArray, roadArrivalProbabilityArray, TileType.ROAD); - float[] intersectionDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 }; - float[] intersectionArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 }; - intersectionTile = new Tile(intersectionDepartureProbabilityArray, intersectionArrivalProbabilityArray, - TileType.INTERSECTION); + float[] noneDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + float[] noneArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + noneTile = new Tile(noneDepartureProbabilityArray, noneArrivalProbabilityArray, TileType.NONE); + + float[] intersectionDepartureProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + float[] intersectionArrivalProbabilityArray = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + intersectionTile = new Tile(intersectionDepartureProbabilityArray, intersectionArrivalProbabilityArray, TileType.INTERSECTION); } } diff --git a/Processing/Misc/UrbanAutonomous/Disp.java b/Processing/Misc/UrbanAutonomous/Disp.java index f673201..7499279 100644 --- a/Processing/Misc/UrbanAutonomous/Disp.java +++ b/Processing/Misc/UrbanAutonomous/Disp.java @@ -81,7 +81,7 @@ void showEachAllocatedDemand(Demand tmpDemand) { p.fill(UrbanAutonomous.allocatedDepartureColor); else p.fill(UrbanAutonomous.allocatedArrivalColor); - p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 5, 5); + p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 10,10); } void showEachDemand(Demand tmpDemand) { @@ -90,7 +90,7 @@ void showEachDemand(Demand tmpDemand) { p.fill(UrbanAutonomous.unallocatedDepartureColor); else p.fill(UrbanAutonomous.unallocatedArrivalColor); - p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 5, 5); + p.ellipse(tmpDemand.x * 10 + 5, tmpDemand.y * 10 + 5, 10, 10); } // ShowVehicle diff --git a/Processing/Misc/UrbanAutonomous/MapBlock.java b/Processing/Misc/UrbanAutonomous/MapBlock.java index 27fcb68..84e39dc 100644 --- a/Processing/Misc/UrbanAutonomous/MapBlock.java +++ b/Processing/Misc/UrbanAutonomous/MapBlock.java @@ -30,6 +30,10 @@ void gen() { pg.stroke(255); for (int y = 0; y < blockSize; y++) { for (int x = 0; x < blockSize; x++) { + //for abstraction, delete road + if(x==2||y==2) + tileArray[x][y].tileType=tileArray[0][0].tileType; + switch (tileArray[x][y].tileType) { case HW: pg.image(UrbanAutonomous.hwImg, x * 10, y * 10); @@ -49,6 +53,9 @@ void gen() { case INTERSECTION: pg.image(UrbanAutonomous.intersectionImg, x * 10, y * 10); break; + case NONE: + pg.image(UrbanAutonomous.noneImg, x * 10, y * 10); + break; default: break; } diff --git a/Processing/Misc/UrbanAutonomous/MapBlockBase.java b/Processing/Misc/UrbanAutonomous/MapBlockBase.java index 0503839..fc48c1a 100644 --- a/Processing/Misc/UrbanAutonomous/MapBlockBase.java +++ b/Processing/Misc/UrbanAutonomous/MapBlockBase.java @@ -9,8 +9,7 @@ public class MapBlockBase { Tile[][] randomTileArrayGen(PApplet p) { Tile[][] tileArray=new Tile[5][5]; Tile [] basicTileArray= { - UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile - }; + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile,UrbanAutonomous.basicTile.noneTile }; for (int y=0; y<5; y++) { for (int x=0; x<5; x++) { if (x==2&&y==2) @@ -29,7 +28,7 @@ else if (x==2||y==2) Tile[][] specificTileArrayGen(int number) { Tile[][] tileArray=new Tile[5][5]; Tile [] basicTileArray= { - UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile + UrbanAutonomous.basicTile.hwTile, UrbanAutonomous.basicTile.lwTile, UrbanAutonomous.basicTile.hrTile, UrbanAutonomous.basicTile.lrTile,UrbanAutonomous.basicTile.noneTile }; for (int y=0; y<5; y++) { for (int x=0; x<5; x++) { diff --git a/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java b/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java index 049a645..7ca548b 100644 --- a/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java +++ b/Processing/Misc/UrbanAutonomous/MapBlockBrushs.java @@ -31,7 +31,7 @@ public void randomBrushsGen() { } public void specificBrushsGen() { - for (int i=0; i<4; i++) { + for (int i=0; i<5; i++) { specificBrushs[i] = new MapBlock(p,specificTileArrayGen(i)); } } diff --git a/Processing/Misc/UrbanAutonomous/MapBlockStack.java b/Processing/Misc/UrbanAutonomous/MapBlockStack.java index e2e0102..d736593 100644 --- a/Processing/Misc/UrbanAutonomous/MapBlockStack.java +++ b/Processing/Misc/UrbanAutonomous/MapBlockStack.java @@ -25,9 +25,10 @@ public void customMapGen() { for (int y = 0; y < UrbanAutonomous.simParam.maxY; y++) for (int x = 0; x < UrbanAutonomous.simParam.maxX; x++){ if(UrbanAutonomous.tablePieceInput[x][y][0]==0||UrbanAutonomous.tablePieceInput[x][y][0]==1||UrbanAutonomous.tablePieceInput[x][y][0]==2||UrbanAutonomous.tablePieceInput[x][y][0]==3) - mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[UrbanAutonomous.tablePieceInput[x][y][0]]; + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[-(UrbanAutonomous.tablePieceInput[x][y][0]-3)]; + //mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[UrbanAutonomous.tablePieceInput[x][y][0]]; else{ - mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; + mapBlockArray[x][y] = UrbanAutonomous.mapBlockBrushs.specificBrushs[4]; //java.lang.System.out.println(x); //java.lang.System.out.println(y); //java.lang.System.out.println(UrbanAutonomous.tablePieceInput[x][y][0]); diff --git a/Processing/Misc/UrbanAutonomous/OperationWindow.java b/Processing/Misc/UrbanAutonomous/OperationWindow.java index 19c5205..2ef4e4a 100644 --- a/Processing/Misc/UrbanAutonomous/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/OperationWindow.java @@ -4,7 +4,9 @@ public class OperationWindow extends PApplet { //OperationDisp operationDisp; public static OperationDisp operationDisp; + public void setup() { + //fullscreen(); operationDisp = new OperationDisp(this); delay(500); } diff --git a/Processing/Misc/UrbanAutonomous/TileType.java b/Processing/Misc/UrbanAutonomous/TileType.java index 8972afd..5ff1274 100644 --- a/Processing/Misc/UrbanAutonomous/TileType.java +++ b/Processing/Misc/UrbanAutonomous/TileType.java @@ -5,7 +5,8 @@ public enum TileType { HR(3), LR(4), ROAD(5), - INTERSECTION(6); + INTERSECTION(6), + NONE(7); private final int id; diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde index bcad6f5..be9b2c8 100644 --- a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -44,7 +44,7 @@ public static int tablePieceInput[][][] = new int[displayU][displayV][2]; public static DragStatus dragStatus; public static OperationWindow opw; public static Status status; -public static PImage hwImg, lwImg, hrImg, lrImg, roadImg, intersectionImg, noneImg, backgroundImg, congestionImg; +public static PImage hwImg, lwImg, hrImg, lrImg, roadImg, intersectionImg, noneImg, backgroundImg, congestionImg,sideDisplayImg; public static Tile[][] simCoordinate; public static int vehicleColor; public static int allocatedDepartureColor; @@ -92,7 +92,8 @@ public static int brushNumber; size(1000, 1000); // OperationWindow - new PFrame(1000, 0, 1900, 875); + //new PFrame(1000, 0, 1900, 875); + new PFrame(0, 0, 1842, 1026); // Status status = Status.CONFIG; @@ -101,13 +102,19 @@ public static int brushNumber; // Load Image loadTileImage(); backgroundImg = loadImage("operationWindow.jpg"); + sideDisplayImg = loadImage("sideDisplay.jpg"); // Legend Symbol - vehicleColor = color(255, 128, 0, 255); - allocatedDepartureColor = color(255, 0, 255, 127); - unallocatedDepartureColor = color(255, 0, 0, 127); - allocatedArrivalColor = color(0, 255, 255, 127); - unallocatedArrivalColor = color(0, 0, 255, 127); + //vehicleColor = color(255, 128, 0, 255); + vehicleColor = color(255, 255, 255, 255); + allocatedDepartureColor = color(0, 128, 0, 255); + unallocatedDepartureColor = color(0, 128, 0, 255); + allocatedArrivalColor = color(0, 0, 255, 255); + unallocatedArrivalColor = color(0, 0, 255, 255); + //allocatedDepartureColor = color(0, 255, 127, 127); + //unallocatedDepartureColor = color(0, 128, 0, 127); + //allocatedArrivalColor = color(0, 255, 255, 127); + //unallocatedArrivalColor = color(0, 0, 255, 127); hubColor = color(0, 255, 0, 200); hubEffectiveLengthColor = color(0, 255, 0, 64); hubVehicleColor = color(142, 0, 204, 200); @@ -121,7 +128,7 @@ public static int brushNumber; brushNumber = 0; basicTile = new BasicTile(); - mapBlockBrushs = new MapBlockBrushs(this, 4); + mapBlockBrushs = new MapBlockBrushs(this, 5); mapBlockStack = new MapBlockStack(this); //disp = new Disp(this); disp = new Disp(mainG,this); @@ -144,9 +151,11 @@ public static int brushNumber; } public void draw() { - if(simParam.mapType==2) //custom map + if(simParam.mapType==2){ //custom map mapBlockStack.customMapGen(); - + mapBlockStack.updateCoordinate();// reflect change of mapblock to // // // demand // generation + mapBlockStack.mapImgCreation();// map image creation for display + } // Exports table Graphic to Projector projector = get(0, 0, TABLE_IMAGE_WIDTH, TABLE_IMAGE_HEIGHT); @@ -166,6 +175,7 @@ public static int brushNumber; //image(mainG,180,0,725,725); image(mainG,180,0,905,1090); + image(sideDisplayImg,0,0,180,1000); //image(mainG,0,0,1000,1200); } @@ -194,9 +204,7 @@ public static int brushNumber; if (simParam.mapType == 2) { mapBlockStack.mapBlockArray[x][y] = mapBlockBrushs.selectedBrush; fileControl.customMap[UrbanAutonomous.simParam.maxX * y + x] = brushNumber; - mapBlockStack.updateCoordinate();// reflect change of mapblock to // - // // demand - // generation + mapBlockStack.updateCoordinate();// reflect change of mapblock to // // // demand // generation mapBlockStack.mapImgCreation();// map image creation for display } // Hub Relocation diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/BasicTile.class b/Processing/Misc/UrbanAutonomous/build-tmp/BasicTile.class index 3046cbc4783a466841839caf3b09f5ece0ab8c77..7b8b358243054873974443c699a413f59a2a3244 100644 GIT binary patch literal 2730 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 S1HugMtxBj)nOLBvv*&R;DpOS3YTAoVu5 z1ig)341~yEh(rjzDd>IF%l?4C_aWK28;W@0d(QJY=Q)SxInRCLedRH}|NFEHgm}Jg z__ay{#TAnR>J`p&)q|0I8fkKKRj_X=l{9Il#cI-u-zPPdXHd;;lOb!_5%47JvQq|a zjGBy*wALLZ=?RlbS`=DWEMGFyCUzuPAnv9Q;C_0+URV2esuEMR5CRdp4%L9`jw$}aNz(| zVXe5@()@I^X85*4U2qGZKjaH-(XdVHg;g2EN0AcgqDoPVC@z{7EsNetO<;o#zsHz- z>9fr?kqisD@bwen;avE}@vya|8{YWwh}2)QUg(9^2i@H~a3bSa(Uf1>6umoWSW(KC zTUObPx4E@0N76VWcAO$>PcKcE(M1_cl=GSjEY6alidA{3U4ne!JU^)67q$H1B720C zgUd=MpuChSzr1ugO$wsfafSRE95>*%?Y>;VO}6F2LqdotjV)@D8kPo zC33TB@j>cn5Z_2Uoh%L#Cdy3-#292qd~Q5?_L#2h#cC+%a`W_n(uXChE2~RMTIfsDZ|7BO$3U7vZYs>i`oiKx>Q23Y6lI1zLPhiDvu2&hC4r75}JoZ^4`~>5=iMs8h6R z^Rrp!4@R9H|8G4=hmlUWrWpL#FGFseTJ!+ Kr?@8|hw;CizF@Wh delta 481 zcmZ{g%PvDv6o$WjdX96ns#=;7;!;&9t+uDsJs3z#41{1RAtE6XVMq)lOvGi2h?y7| zn@AWi5{W193?4z;mXjD580_q|*T1v=?_bY>%Ygs+^X?vS>AUt%E4`tjO>JegQ>Sp& zR_ErYmX;UH;cf8KLCz+th#hUktTOVr`bouAmwr_zVFQa28Fc12j|7czTOSy$`oTz8 z$;m6STA8s(N~+3q)N-R{rah9rA)~{-++vmhIm#&#Vt@+92s2BBc`8{a%8vB+ML(s6 zf>>1Jd{VRt+H|USEL9r_g^V{G(Ta4Vu%&v(^ni~40KNDUDyctwwJN1+%=}Ef{B0me zBU!m~#AQOWP$Yz+MJSR&(JB-vwxqu+`XQNrDN27S^o3bvdI4|EX)&y@ehkx=yPOwH zR{|9zSf{`i=oQN$sYdBxLSA$9u|hwa46-NvBhk+p@l2a>zT|U>jk4*G%}ZF7838EO1c?9u diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/MapBlockStack.class index a0c4951549cb1850b349edc2a37f13423fbd9ff4..4fde95a347dc1f03fdd8fab8e330305a216daa2f 100644 GIT binary patch delta 356 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

(z>YSArLXO;ddB0@H+$MGZU%X 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 TfWy!#!xrzuAM#E0W8(h>$msnp literal 11317 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 Uuhu7@NMQg1Pgg&ebxsLQ06}6H1ONa4 diff --git a/Processing/Misc/UrbanAutonomous/data/hwTile.png b/Processing/Misc/UrbanAutonomous/data/hwTile.png index 59793174155c4629cbc608011d999e4fa1d0c0bb..da72cc90cf90cf3c4e188dbe53572e13623a791c 100644 GIT binary patch delta 48 zcmZo+ES})0CF<$o7*cU7>CgEFegnfEuVh9BMm7dV9Y*22^Ut?30D-5gpUXO@geCxi C;}0(Y delta 65 zcmXSJVVvM;t>)?C7*cU7DP+?0^aH#R4L{OvaY!L$xc)I$ztaD0e0sxiR8n6HW diff --git a/Processing/Misc/UrbanAutonomous/data/intersectionTile.png b/Processing/Misc/UrbanAutonomous/data/intersectionTile.png index abead636bc9bad032f5f6b5c97c0ba83a0457372..f4cd4a07aee4073c0e9d4d9d26925b84fb01d58d 100644 GIT binary patch delta 118 zcmXS2%Q!*Oij9GRq1WjAULeI-9OUlAuSUN$HgNcEGfhi#3)x=;89dS<=$B>F!NpI%fJKZ2{VEBMlIaEsF0E1Wx{( zJaZG%Q-e|yQz{EjrrH1%iF>*@hE&{2dNcRl=>};7!w0O&p;8J57{pQ-kH-IgW)4)s N;OXk;vd$@?2>^2bAwmEE literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/lrTile.png b/Processing/Misc/UrbanAutonomous/data/lrTile.png index cedeb1aa1633b053cc606ee41e447f4232c3f4e6..bd9292669305147c2e901d90d7a2e18113b86ebc 100644 GIT binary patch delta 51 zcmZo+ESun|E8*$l7*cU7spj*Rd5q=>Ne8&yR+%_7Ffv?|Wl9luoqd4;2s~Z=T-G@y GGywqI^AT+T delta 65 zcmXSGVVvM;t>)?C7*cU7DP+?0^aH#R4HnrunZkBvPUN2<@u6v<_Sp{m2nHq|h8aD~ UR}W`}G%^5zr>mdKI;Vst05n_|;{X5v diff --git a/Processing/Misc/UrbanAutonomous/data/lwTile.png b/Processing/Misc/UrbanAutonomous/data/lwTile.png index 89d9383ed125293d252f0b0ce5300c519a35ac9f..74b4c5f05d96c29d5d19538e1cc0befd7338e8dc 100644 GIT binary patch delta 51 zcmZo+ESun|E8*$l7*cU7>CgEO^BK((k`8dYtuk?FU}PxfU=o`5?X(305O})!xvX)?C7*cU7DP+?0^aH#R4KvpM76{uJzqHJUr{ds+scA>#br=}g7-sKb VzWV%${51w3@O1TaS?83{1ORJ{8NmPm diff --git a/Processing/Misc/UrbanAutonomous/data/noneTile.png b/Processing/Misc/UrbanAutonomous/data/noneTile.png index 009c88541a3c4bd318314a5d2174fa5e7fadd14c..f4cd4a07aee4073c0e9d4d9d26925b84fb01d58d 100644 GIT binary patch delta 118 zcmbST{kEgNcEGfhi#3)x=;8Qw2{K$B>F!NeKtIB^rPH|NsBSQwhnLA70Dty2QfZ b(7?#xu!dP+?@PNPpdJQKS3j3^P62$5 diff --git a/Processing/Misc/UrbanAutonomous/data/roadTile.png b/Processing/Misc/UrbanAutonomous/data/roadTile.png index f9a336f39bc393b6b04745bd0569167a260958b2..f4cd4a07aee4073c0e9d4d9d26925b84fb01d58d 100644 GIT binary patch delta 118 zcmXS0%Q!*Oij9GRq1WjAULeI-9OUlAuST;eDgNcEGfhi#3)x=;8T?tPY$B>F!NjAmLc$o7J9BB~m3CV0=U}kuGfT`lC SElV{}ErX}4pUXO@geCxV;}k{! diff --git a/Processing/Misc/UrbanAutonomous/data/roadTileback.png b/Processing/Misc/UrbanAutonomous/data/roadTileback.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a336f39bc393b6b04745bd0569167a260958b2 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih{( zJaZG%Q-e|yQz{EjrrH1%NqD+AhE&{2vMGMX!<={ENP~D!NM-{AGsD{hOchUUS*n3* O7(8A5T-G@yGywp6$RNl7 literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/sideDisplay.jpg b/Processing/Misc/UrbanAutonomous/data/sideDisplay.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f0a1f50e7fc207ae7ac6fa9f625257203529b04 GIT binary patch literal 18828 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

4Z%fiiGZ>ztg7Qp) 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 H^ZEY=Cy*VB literal 0 HcmV?d00001 From 7b1ae66f6d963f85ff731e6f9178be481f847e0c Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Tue, 12 Apr 2016 04:49:04 -0400 Subject: [PATCH 08/14] optimalFleetSize --- .../Misc/UrbanAutonomous/DemandStack.java | 2 ++ .../Misc/UrbanAutonomous/OperationWindow.java | 1 + .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 1 - .../build-tmp/DemandStack.class | Bin 6620 -> 6697 bytes .../build-tmp/OperationWindow.class | Bin 2927 -> 2927 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 979 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 2416 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 11430 -> 11430 bytes .../build-tmp/source/DemandStack.java | 2 ++ .../build-tmp/source/OperationWindow.java | 1 + .../build-tmp/source/UrbanAutonomous.java | 1 - 11 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Processing/Misc/UrbanAutonomous/DemandStack.java b/Processing/Misc/UrbanAutonomous/DemandStack.java index 13e2c9b..bf3b4dd 100644 --- a/Processing/Misc/UrbanAutonomous/DemandStack.java +++ b/Processing/Misc/UrbanAutonomous/DemandStack.java @@ -274,6 +274,8 @@ public void demandLifetimeControl() { if (tmpDemand.lifetime == 0) { iter.remove(); missedDemand++; + UrbanAutonomous.simParam.numberOfVehicle++; + UrbanAutonomous.vehicleStack.vehicleGen(); // missedDemandHistory[UrbanAutonomous.simParam.currentTime/20]=missedDemand; } else { tmpDemand.lifetime -= 1; diff --git a/Processing/Misc/UrbanAutonomous/OperationWindow.java b/Processing/Misc/UrbanAutonomous/OperationWindow.java index 2ef4e4a..60316d6 100644 --- a/Processing/Misc/UrbanAutonomous/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/OperationWindow.java @@ -9,6 +9,7 @@ public void setup() { //fullscreen(); operationDisp = new OperationDisp(this); delay(500); + } public void draw() { operationDisp.show(); diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde index be9b2c8..10b7720 100644 --- a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -20,7 +20,6 @@ //unallocatedArrivalDemand:blue - int projectorWidth = 1920; int projectorHeight = 1200; int projectorOffset = 1842; diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class index 73cd55eb679483794abd3c3667cfccd72a1159dc..219333136e63415741734b32dca809db69c623a6 100644 GIT binary patch delta 297 zcmXBOJ4ixt6oB#Xl%QR#o2H^rS_Bn#hsqv%4M7irsGudHyjf5ZK@l{!wMmOZ(PXw| zD&(L+L(<&Xd?D;ajr@)j&F&C6wptjEj2R&!m{>zvV%=V`|pO zVkPNQ@FIklv-oYRIs6$0R9F7HlA)02Jw>yj$g)LqSnB*qNd6WQdSD?sj|Zd$O?2GS zidS5O#7&R1VTgxO@iHzxrX|3l+OJ4EyVAj-1UZrr$I{7(ba5)(oGZJOUJUhn5PJ=; RopOzlL@D62e<^IB`UjGGP3r&v delta 212 zcmZ2!a>tnK)W2Q(7#J9g7~XE=+Q+f^H^(RbP;mxkAY@>euC;|hejCH8c?|s!)?uIJ z42Ie}8IChD9ANPB)!D-EY!-tUP~asagI44g1__pgtqc;&8F+PooM$X4TN$1KC9g0t z%=&+3a)@LIvloNV2nat)q=Z1@8xVK7L_ zAZ0b7m<)&k8-KuSc)i=-?MJ;f@pkvwl5IYC;CsAn8?;=0_~B0+cCrYhh9Ei!rjIbD z2xpxLwuoehDE5fvgc#0=(L5YGb%ypYH%NqmqZibDcOl@QV-iVR67Q*z0Yda|XR z9O)rfCdrc}@@0bp*>mBPLki`TBDtYh?kSN+O67|(`K8==Q(;1>G-*_s5~@uzHKw0h zGfSOWrNL~{WcFz>C$yR?+RQB-=7~=8Mwj`fTRrL3|BgE7*CGbAkwNWdNGBN9HAd9w zW>j|>(*wr!j7hyVkavzWTmQoUu`-p)YIdTlHat)q=Z1@8xVK7L_ zAZ0b7m<)&k8@=Y&yYIX2QIAdBoV~V0n+Gm<9&g(Qt$8oJ|Ha}%CjQhAKs$l-62cUr ztP{o-;p`B>9+8|7#W~Sj62r~^dLWJ$;&~;350XSl7C-C~Oo~L3CTXNg4jEEMrnHhJ z-DJxoIkHTyY>+2=^W@7R4mqVjZYY#{isX?J`Jz;QDKqYrn-D5YDwU>~D$_`{>8Hlb zP-|AHH=8t=eVWV(&E|?0b4#0fqTRgFVZP~9SGqNb9<|e_h4gC!1KP!qPB5%%jHtuO zsO~bR2aM|(6MDgIr0pI{v0pkE+0ptK_0p$R50p|dF N0q6jN0qm1V2`D4AEyDl+ delta 159 zcmV;Q0AT;{67UkRwgv&AleY#<4W$4S0jB^X0jU5d0jiS`2YVH*03iXc06GD&07n6` z07wC|08Ih4lc5J<5xf8k0l)wd0mA?s0mJ|;0mhRQ2u2mk00aTc00;rh01pAp02~3% z03ZR+lWz#9G134q0oDLI0oMRM0owpa0o(ve0pI{s0pS2w0ptK-0p$Q`0pkd7{2+gT+(bZ8xrsqF8iWxP!;(No%|FzV$Z%3xTV9&j z>m|~8NrPLO@!k#xA}bh@aq z3I8z-b`#CRX0ehaR++_P6!Exi?`IKDQq2H&u%2d~qMN6Al#TY>#1PMLfXy6d3#Zu1 zCv4*fwsYB5uJVFlr>3z>(dvIjl9jqCQ5oj-%Sd zYhH2s2ldA+<8fkn-LOtDlQF}3!?4~othczEw`t`aIylKg2GGm9tmZw|@jio`W(VUO z&X8`Hxtyhhb5!yvw{zZtUGTonSQ7p@DSTn)eC1^aHe`N77~k6I z-;-*w^7zq;xJVs8(ZD5|_{AF!?2o%_OutgjZ}jlH75Im@HgkJ$f^e>o%-;m9iXtZM zjVbE+hZe5U&c7_@KQA|{DuSChYbr__Ta{I#_7EH1LbO6jR2XRrCtDE|DvBB_vPCiU zDwYAovr&m`)eH_OnOBvxk*7=5a>zIcIu77DWrVZhAut&3uu9rn#z6 zqbk*G+M+5wp=u47ZcvR5Yq3U5k0z;BXSGD`4sTyhTiQ+wu!~6TCSH3;*NX%-Oo8@Nto>e0?ojYgYwj;* zX~Mq!E7a*KcWIJlO>v*Du}s(L)D7=+ZdX(+p)QVOmq3P_;g!y=k4j;>^AYF#B)OSm z&(6M6jR8Vj7BMbJrpqSZ(mq9#UPetvurO70mq~u3g+x delta 1040 zcmWNQeN5L?6vjW#oyeOYKOpeO`w#iSk3fV#QF)cXnhu3Aa7+tSkjl2QVd5}Znp=}B z?K@wii0QDGWj0!?wAxy@woKDntGS$+tJd2}4UDone?9k}d+u|d^PGD}+eh0^_){ZG z38RcCs=Vw}ud0w}<`7R2eu~MWggoY3WTE9OqC)Ga)p{DVk)>`r%`TcYH-l9!hE5kd zb}jWa4RjI9{YLR1Njz*6y+*d#uJ;*1KhNd6sa&8vES4m{}M3CA0X->Rj}4v$h4kA%aU* z{W2+h%k5k-Bfg`at1RUQmh+=Gp7nz7XVdfx<@`!Fzp;Vez23kx!RthFgJiQI$b@A~ zTE+Naw#oLEJWs7TTkMXqeVW@3$I(xNze z(swJ{x86z2l+yJcQV!AAcIqFl2vw%~WIWVtqiZly7|dq)e_`c|8$dx&=TlHocmy2eW` XZ1i Date: Tue, 12 Apr 2016 06:35:53 -0400 Subject: [PATCH 09/14] simple GUI --- .../UrbanAutonomous/OperationDisp - Copy.java | 240 ++++++++++++++++++ .../Misc/UrbanAutonomous/OperationDisp.java | 42 +++ .../OperationWindow - Copy.java | 140 ++++++++++ .../Misc/UrbanAutonomous/OperationWindow.java | 136 +--------- .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 3 +- .../build-tmp/OperationDisp.class | Bin 6370 -> 6799 bytes .../build-tmp/OperationWindow.class | Bin 2927 -> 991 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 979 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 2416 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 11430 -> 11430 bytes .../build-tmp/source/OperationDisp.java | 42 +++ .../build-tmp/source/OperationWindow.java | 136 +--------- .../build-tmp/source/UrbanAutonomous.java | 3 +- .../UrbanAutonomous/data/operationWindow.png | Bin 0 -> 25978 bytes ...ationWindow.jpg => operationWindowOLD.jpg} | Bin 15 files changed, 496 insertions(+), 246 deletions(-) create mode 100644 Processing/Misc/UrbanAutonomous/OperationDisp - Copy.java create mode 100644 Processing/Misc/UrbanAutonomous/OperationWindow - Copy.java create mode 100644 Processing/Misc/UrbanAutonomous/data/operationWindow.png rename Processing/Misc/UrbanAutonomous/data/{operationWindow.jpg => operationWindowOLD.jpg} (100%) diff --git a/Processing/Misc/UrbanAutonomous/OperationDisp - Copy.java b/Processing/Misc/UrbanAutonomous/OperationDisp - Copy.java new file mode 100644 index 0000000..2fc50c5 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/OperationDisp - Copy.java @@ -0,0 +1,240 @@ + +import static processing.core.PConstants.CENTER; + + +import processing.core.PApplet; + +public class OperationDisp { + PApplet p; + + public OperationDisp(PApplet _p) { + p = _p; + } + + public void show() { + UrbanAutonomous.opw.image(UrbanAutonomous.backgroundImg, 0, 0); + showBrush(); + showMapGUI(); + showLegendSymbolGUI(); + + showFleetGUI(); + showDemandGUI(); + + showTimeGUI(); + showUnallocatedDemandSize(); + showMissedDemand(); + showDemandSize(); + //showDemandProbabilityGUI(); + oldshowDemandProbabilityGUI(); + showTotalCongestion(); + } + + void oldshowBrush() { + for (int i = 0; i < UrbanAutonomous.mapBlockBrushs.specificBrushs.length; i++) { + UrbanAutonomous.opw.image(UrbanAutonomous.mapBlockBrushs.specificBrushs[i].pg, 50, 250 + 70 * i); + } + for (int i = 0; i < UrbanAutonomous.mapBlockBrushs.numberOfBrush; i++) { + UrbanAutonomous.opw.image(UrbanAutonomous.mapBlockBrushs.randomBrushs[i].pg, 150, 250 + 70 * i); + } + } + + void showBrush() { + UrbanAutonomous.opw.image(UrbanAutonomous.mapBlockBrushs.pg, 0, 250); + } + + void showMapGUI() { + UrbanAutonomous.opw.ellipseMode(CENTER); + UrbanAutonomous.opw.fill(0); + if (UrbanAutonomous.simParam.mapType == 0) { + UrbanAutonomous.opw.ellipse(65, 115, 14, 14); + } else if (UrbanAutonomous.simParam.mapType == 1) { + UrbanAutonomous.opw.ellipse(65, 165, 14, 14); + } else if (UrbanAutonomous.simParam.mapType == 2) { + UrbanAutonomous.opw.ellipse(65, 215, 14, 14); + } + } + + void oldshowLegendSymbolGUI() { + int offset = 50; + UrbanAutonomous.opw.stroke(1); + + // LandUse + UrbanAutonomous.opw.image(UrbanAutonomous.hwImg, offset, 640, 20, 20); + UrbanAutonomous.opw.image(UrbanAutonomous.lwImg, offset, 660, 20, 20); + UrbanAutonomous.opw.image(UrbanAutonomous.hrImg, offset, 680, 20, 20); + UrbanAutonomous.opw.image(UrbanAutonomous.lrImg, offset, 700, 20, 20); + + UrbanAutonomous.opw.ellipseMode(CENTER); + // allocated departure + UrbanAutonomous.opw.fill(UrbanAutonomous.allocatedDepartureColor); + UrbanAutonomous.opw.ellipse(offset + 10, 720 + 10, 10, 10); + // unallocated departure + UrbanAutonomous.opw.fill(UrbanAutonomous.unallocatedDepartureColor); + UrbanAutonomous.opw.ellipse(offset + 10, 740 + 10, 10, 10); + // allocated arrival + UrbanAutonomous.opw.fill(UrbanAutonomous.allocatedArrivalColor); + UrbanAutonomous.opw.ellipse(offset + 10, 760 + 10, 10, 10); + // unallocated arrival + UrbanAutonomous.opw.fill(UrbanAutonomous.unallocatedArrivalColor); + UrbanAutonomous.opw.ellipse(offset + 10, 780 + 10, 10, 10); + // Vehicle(fleet) + UrbanAutonomous.opw.fill(UrbanAutonomous.vehicleColor); + UrbanAutonomous.opw.ellipse(offset + 10, 800 + 10, 10, 10); + } + + void showLegendSymbolGUI() { + UrbanAutonomous.opw.image(UrbanAutonomous.legendPg, 50, 640); + } + + void showFleetGUI() { + int offset = 580; + UrbanAutonomous.opw.stroke(0); + UrbanAutonomous.opw.strokeWeight(3); + // FleetSize(numberOfVehicle) + UrbanAutonomous.opw.line(offset + UrbanAutonomous.simParam.numberOfVehicle * 2, 100, + offset + UrbanAutonomous.simParam.numberOfVehicle * 2, 130); + // VehicleCapacity + UrbanAutonomous.opw.line(offset + UrbanAutonomous.simParam.capacityOfVehicle * 2, 170, + offset + UrbanAutonomous.simParam.capacityOfVehicle * 2, 200); + // FleetCapacity + int fleetCapacity = UrbanAutonomous.simParam.capacityOfVehicle * UrbanAutonomous.simParam.numberOfVehicle; + int fleetCapacityLabel = fleetCapacity / 50; + UrbanAutonomous.opw.line(offset + fleetCapacityLabel, 240, offset + fleetCapacityLabel, 270); + + // Text + UrbanAutonomous.opw.textSize(16); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.simParam.numberOfVehicle), offset - 70, 132); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.simParam.capacityOfVehicle), offset - 70, 202); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.simParam.numberOfVehicle * UrbanAutonomous.simParam.capacityOfVehicle), offset - 70, + 272); + } + + void showDemandGUI() { + int offset = 580; + UrbanAutonomous.opw.stroke(0); + UrbanAutonomous.opw.strokeWeight(3); + // DemandSize + // Preset + UrbanAutonomous.opw.line(offset + UrbanAutonomous.simParam.currentDemandSize * 2, 450, + offset + UrbanAutonomous.simParam.currentDemandSize * 2, 480); + // Custom + if (UrbanAutonomous.simParam.demandSizeCustom) { + UrbanAutonomous.opw.ellipseMode(CENTER); + UrbanAutonomous.opw.fill(0); + UrbanAutonomous.opw.ellipse(315, 535, 14, 14); + } else { + UrbanAutonomous.opw.ellipseMode(CENTER); + UrbanAutonomous.opw.fill(0); + UrbanAutonomous.opw.ellipse(315, 465, 14, 14); + } + UrbanAutonomous.opw.line(offset + UrbanAutonomous.simParam.currentDemandSize * 2, 550, + offset + UrbanAutonomous.simParam.currentDemandSize * 2, 520); + // DemandInterval + UrbanAutonomous.opw.line(offset + UrbanAutonomous.simParam.demandInterval * 2, 630, + offset + UrbanAutonomous.simParam.demandInterval * 2, 660); + + // DemandLifetime + UrbanAutonomous.opw.line(offset + UrbanAutonomous.simParam.demandLifetime * 2, 730 - 30, + offset + UrbanAutonomous.simParam.demandLifetime * 2, 730); + } + + void showTimeGUI() { + int offset = 1130; + UrbanAutonomous.opw.stroke(0); + UrbanAutonomous.opw.strokeWeight(3); + // CurrentTime + int currentTimeLabel = UrbanAutonomous.simParam.currentTime / 20; + UrbanAutonomous.opw.line(offset + currentTimeLabel, 150 - 10, offset + currentTimeLabel, 150 + 10); + UrbanAutonomous.opw.stroke(0,0,255,128); + UrbanAutonomous.opw.line(offset + currentTimeLabel, 150 - 10, offset + currentTimeLabel, 150 + 810); + // Text + UrbanAutonomous.opw.textSize(30); + int hour = UrbanAutonomous.simParam.currentTime / 600;// 600step = 1hour + int min = (UrbanAutonomous.simParam.currentTime - hour * 600) / 60;// 60step = + // 1min + String timeLabel = p.nf(hour, 2) + ":" + p.nf(min, 2); + UrbanAutonomous.opw.text(timeLabel, 1050, 80); + } + + void showUnallocatedDemandSize() { + int offset = 1130; + UrbanAutonomous.opw.stroke(0); + // unallocatedDemandSize + UrbanAutonomous.opw.strokeWeight(1); + for (int i = 0; i < 720; i++) + UrbanAutonomous.opw.line(offset + i, 250 - (UrbanAutonomous.demandStack.unallocatedDemandSizeHistory[i]), offset + i, + 250); + + // Text + UrbanAutonomous.opw.textSize(16); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.demandStack.unallocatedDepartureList.size()), 1070, 250); + } + + void showMissedDemand() { + int offset = 1130; + UrbanAutonomous.opw.stroke(0); + + UrbanAutonomous.opw.strokeWeight(1); + for (int i = 0; i < 720; i++) + UrbanAutonomous.opw.line(offset + i, 320 - (UrbanAutonomous.demandStack.missedDemandHistory[i]), offset + i, 320); + + // Text + UrbanAutonomous.opw.textSize(16); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.demandStack.missedDemand), 1070, 320); + } + + void showDemandSize() { + int offset = 1130; + UrbanAutonomous.opw.stroke(0); + UrbanAutonomous.opw.strokeWeight(1); + // DemandSize + for (int i = 0; i < 720; i++) + UrbanAutonomous.opw.line(offset + i, 390 - (UrbanAutonomous.simParam.demandSizeArray[i / 30]), offset + i, 390); + + // Text + UrbanAutonomous.opw.textSize(16); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.simParam.currentDemandSize), 1070, 390); + } + + void oldshowDemandProbabilityGUI() { + int offset = 1130; + UrbanAutonomous.opw.image(UrbanAutonomous.hwImg, 980, 540, 50, 50); + UrbanAutonomous.opw.image(UrbanAutonomous.lwImg, 980, 610, 50, 50); + UrbanAutonomous.opw.image(UrbanAutonomous.hrImg, 980, 680, 50, 50); + UrbanAutonomous.opw.image(UrbanAutonomous.lrImg, 980, 750, 50, 50); + + for (int i = 0; i < 720; i++) { + UrbanAutonomous.opw.line(offset + i, 560 - (UrbanAutonomous.basicTile.hwTile.departureProbabilityArray[i / 30] * 100 / 5), + offset + i, 560); + UrbanAutonomous.opw.line(offset + i, 590 - (UrbanAutonomous.basicTile.hwTile.arrivalProbabilityArray[i / 30] * 100 / 5), + offset + i, 590); + UrbanAutonomous.opw.line(offset + i, 630 - (UrbanAutonomous.basicTile.lwTile.departureProbabilityArray[i / 30] * 100 / 5), + offset + i, 630); + UrbanAutonomous.opw.line(offset + i, 660 - (UrbanAutonomous.basicTile.lwTile.arrivalProbabilityArray[i / 30] * 100 / 5), + offset + i, 660); + UrbanAutonomous.opw.line(offset + i, 700 - (UrbanAutonomous.basicTile.hrTile.departureProbabilityArray[i / 30] * 100 / 5), + offset + i, 700); + UrbanAutonomous.opw.line(offset + i, 730 - (UrbanAutonomous.basicTile.hrTile.arrivalProbabilityArray[i / 30] * 100 / 5), + offset + i, 730); + UrbanAutonomous.opw.line(offset + i, 770 - (UrbanAutonomous.basicTile.lrTile.departureProbabilityArray[i / 30] * 100 / 5), + offset + i, 770); + UrbanAutonomous.opw.line(offset + i, 800 - (UrbanAutonomous.basicTile.lrTile.arrivalProbabilityArray[i / 30] * 100 / 5), + offset + i, 800); + } + } + + void showDemandProbabilityGUI() { + UrbanAutonomous.opw.image(UrbanAutonomous.demandPg, 980, 540); + } + + void showTotalCongestion() { + int offset = 1130; + // Text + UrbanAutonomous.opw.textSize(16); + UrbanAutonomous.opw.text(p.str(UrbanAutonomous.simParam.currentTotalCongestionLevel), 1070, 460); + // Graph + for (int i = 0; i < 720; i++) { + UrbanAutonomous.opw.line(offset + i, 460 - (UrbanAutonomous.simParam.totalCongestionLevel[i] / 10), offset + i, 460); + } + } +} diff --git a/Processing/Misc/UrbanAutonomous/OperationDisp.java b/Processing/Misc/UrbanAutonomous/OperationDisp.java index 2fc50c5..c390c85 100644 --- a/Processing/Misc/UrbanAutonomous/OperationDisp.java +++ b/Processing/Misc/UrbanAutonomous/OperationDisp.java @@ -13,6 +13,44 @@ public OperationDisp(PApplet _p) { public void show() { UrbanAutonomous.opw.image(UrbanAutonomous.backgroundImg, 0, 0); + + p.noStroke(); + UrbanAutonomous.opw.textSize(35); + //fill(#006837); + //Vehicle Size + p.fill(0,104,55); + p.rect(350, 250, UrbanAutonomous.simParam.capacityOfVehicle*10, 50); + //Vehicle Size TEXT + p.fill(255,255,255); + String vehicleSizeLabel = Integer.toString(UrbanAutonomous.simParam.capacityOfVehicle); + UrbanAutonomous.opw.text(vehicleSizeLabel, 360, 295); + + //Time Bar + p.fill(0,104,55); + p.rect(350, 350, UrbanAutonomous.simParam.currentTime/10, 50); + //Time Text + p.fill(255,255,255); + UrbanAutonomous.opw.textSize(35); + int hour = UrbanAutonomous.simParam.currentTime / 600;// 600step = 1hour + int min = (UrbanAutonomous.simParam.currentTime - hour * 600) / 60;// 60step = // 1min + String timeLabel = p.nf(hour, 2) + ":" + p.nf(min, 2); + UrbanAutonomous.opw.text(timeLabel, 360, 395); + //Demand + p.fill(0,104,55); + for(int i=0;i<24;i++){ + p.rect(350+60*i, 500-UrbanAutonomous.simParam.demandSizeArray[i], 60,UrbanAutonomous.simParam.demandSizeArray[i]); + } + //Optimal Fleet Size + p.fill(0,104,55); + p.rect(350, 700, UrbanAutonomous.simParam.numberOfVehicle * UrbanAutonomous.simParam.capacityOfVehicle, 50); + //Optimal Fleet Size + p.fill(255,255,255); + String fleetSizeLabel = Integer.toString(UrbanAutonomous.simParam.capacityOfVehicle*UrbanAutonomous.simParam.numberOfVehicle); + UrbanAutonomous.opw.text(fleetSizeLabel, 360, 745); + + + + /* showBrush(); showMapGUI(); showLegendSymbolGUI(); @@ -27,8 +65,12 @@ public void show() { //showDemandProbabilityGUI(); oldshowDemandProbabilityGUI(); showTotalCongestion(); + */ } + + +/////////////////////////////// void oldshowBrush() { for (int i = 0; i < UrbanAutonomous.mapBlockBrushs.specificBrushs.length; i++) { UrbanAutonomous.opw.image(UrbanAutonomous.mapBlockBrushs.specificBrushs[i].pg, 50, 250 + 70 * i); diff --git a/Processing/Misc/UrbanAutonomous/OperationWindow - Copy.java b/Processing/Misc/UrbanAutonomous/OperationWindow - Copy.java new file mode 100644 index 0000000..60316d6 --- /dev/null +++ b/Processing/Misc/UrbanAutonomous/OperationWindow - Copy.java @@ -0,0 +1,140 @@ + +import processing.core.PApplet; + +public class OperationWindow extends PApplet { + //OperationDisp operationDisp; + public static OperationDisp operationDisp; + + public void setup() { + //fullscreen(); + operationDisp = new OperationDisp(this); + delay(500); + + } + public void draw() { + operationDisp.show(); + } + + public void mousePressed() { + //Time + if (mouseX >1130 && mouseX <1850) { + if (mouseY >150-50 && mouseY<150+50) { + UrbanAutonomous.simParam.currentTime=(mouseX-1130)*20 ; + } + } + //save file for custom map + if (mouseX > 200 && mouseX<300) + if (mouseY> 200 && mouseY<230) + UrbanAutonomous.fileControl.outputCSV(); + + //MAP + if (mouseX > 50 && mouseX<200) { + if (mouseY> 100 && mouseY<130) { + UrbanAutonomous.mapBlockStack.loadUrbanMap(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } else if (mouseY> 150 && mouseY<180) { + UrbanAutonomous.mapBlockStack.loadRuralMap(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } else if (mouseY> 200 && mouseY<230) { + UrbanAutonomous.mapBlockStack.noneMapGen(); + UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation + UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display + } + } + //MAP change brush + if (mouseX >50 && mouseX <200) { + if (mouseY >530 && mouseY<600) { + UrbanAutonomous.mapBlockBrushs.randomBrushsGen(); + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + } + } + //Map Brush select + if (mouseX >50 && mouseX <100) { + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + if (mouseY >250 && mouseY<300) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; + UrbanAutonomous.brushNumber=0; + } else if (mouseY >320 && mouseY<370) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[1]; + UrbanAutonomous.brushNumber=1; + } else if (mouseY >390 && mouseY<440) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[2]; + UrbanAutonomous.brushNumber=2; + } else if (mouseY >460 && mouseY<510) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; + UrbanAutonomous.brushNumber=3; + } + } else if (mouseX >150 && mouseX <200) { + UrbanAutonomous.mapBlockBrushs.brushImgCreation(); + if (mouseY >250 && mouseY<300) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[0]; + } else if (mouseY >320 && mouseY<370) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[1]; + } else if (mouseY >390 && mouseY<440) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[2]; + } else if (mouseY >460 && mouseY<510) { + UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[3]; + } + } + + + int offsetSecond=580; + //Fleet Demand + + if (mouseX > offsetSecond && mouseX<= offsetSecond+200) { + //Fleet Size + + //number of vehicle + if (mouseY>100 && mouseY <100+30) { + UrbanAutonomous.simParam.numberOfVehicle=(int)((mouseX-offsetSecond)/2); + UrbanAutonomous.vehicleStack.vehicleGen(); + } + + //capacity of vehicle + else if (mouseY>171 && mouseY<170+30) { + UrbanAutonomous.simParam.capacityOfVehicle=(int)((mouseX-offsetSecond)/2); + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseY>520 && mouseY<520+30) { + //currentDemandSize + UrbanAutonomous.simParam.currentDemandSize=(int)((mouseX-offsetSecond)/2); + } else if (mouseY>630 && mouseY<630+30) { + //demandInterval + UrbanAutonomous.simParam.demandInterval=(int)((mouseX-offsetSecond)/2); + } else if (mouseY>700 && mouseY<700+30) { + //demandLifetime + UrbanAutonomous.simParam.demandLifetime=(int)((mouseX-offsetSecond)/2); + } + } + + //FleetPreset Button + if (mouseY>340 && mouseY<340+30) { + if (mouseX>420 && mouseX<420+100) { + //PEV + UrbanAutonomous.simParam.numberOfVehicle=80; + UrbanAutonomous.simParam.capacityOfVehicle=1; + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseX>550 && mouseX<550+100) { + //Car + UrbanAutonomous.simParam.numberOfVehicle=20; + UrbanAutonomous.simParam.capacityOfVehicle=4; + UrbanAutonomous.vehicleStack.vehicleGen(); + } else if (mouseX>680 && mouseX<680+100) { + //Bus + UrbanAutonomous.simParam.numberOfVehicle=1; + UrbanAutonomous.simParam.capacityOfVehicle=80; + UrbanAutonomous.vehicleStack.vehicleGen(); + } + } + + //DemandSize preset + if (mouseX>300 && mouseX<780) { + if (mouseY > 450 && mouseY<480) { + UrbanAutonomous.simParam.demandSizeCustom=false; + } else if (mouseY > 520 && mouseY<550) { + UrbanAutonomous.simParam.demandSizeCustom=true; + } + } + } + } diff --git a/Processing/Misc/UrbanAutonomous/OperationWindow.java b/Processing/Misc/UrbanAutonomous/OperationWindow.java index 60316d6..00ed108 100644 --- a/Processing/Misc/UrbanAutonomous/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/OperationWindow.java @@ -11,130 +11,22 @@ public void setup() { delay(500); } - public void draw() { + public void draw() { operationDisp.show(); - } - - public void mousePressed() { - //Time - if (mouseX >1130 && mouseX <1850) { - if (mouseY >150-50 && mouseY<150+50) { - UrbanAutonomous.simParam.currentTime=(mouseX-1130)*20 ; - } - } - //save file for custom map - if (mouseX > 200 && mouseX<300) - if (mouseY> 200 && mouseY<230) - UrbanAutonomous.fileControl.outputCSV(); - - //MAP - if (mouseX > 50 && mouseX<200) { - if (mouseY> 100 && mouseY<130) { - UrbanAutonomous.mapBlockStack.loadUrbanMap(); - UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation - UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display - } else if (mouseY> 150 && mouseY<180) { - UrbanAutonomous.mapBlockStack.loadRuralMap(); - UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation - UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display - } else if (mouseY> 200 && mouseY<230) { - UrbanAutonomous.mapBlockStack.noneMapGen(); - UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation - UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display - } - } - //MAP change brush - if (mouseX >50 && mouseX <200) { - if (mouseY >530 && mouseY<600) { - UrbanAutonomous.mapBlockBrushs.randomBrushsGen(); - UrbanAutonomous.mapBlockBrushs.brushImgCreation(); - } - } - //Map Brush select - if (mouseX >50 && mouseX <100) { - UrbanAutonomous.mapBlockBrushs.brushImgCreation(); - if (mouseY >250 && mouseY<300) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; - UrbanAutonomous.brushNumber=0; - } else if (mouseY >320 && mouseY<370) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[1]; - UrbanAutonomous.brushNumber=1; - } else if (mouseY >390 && mouseY<440) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[2]; - UrbanAutonomous.brushNumber=2; - } else if (mouseY >460 && mouseY<510) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; - UrbanAutonomous.brushNumber=3; - } - } else if (mouseX >150 && mouseX <200) { - UrbanAutonomous.mapBlockBrushs.brushImgCreation(); - if (mouseY >250 && mouseY<300) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[0]; - } else if (mouseY >320 && mouseY<370) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[1]; - } else if (mouseY >390 && mouseY<440) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[2]; - } else if (mouseY >460 && mouseY<510) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[3]; - } - } - - - int offsetSecond=580; - //Fleet Demand - - if (mouseX > offsetSecond && mouseX<= offsetSecond+200) { - //Fleet Size - - //number of vehicle - if (mouseY>100 && mouseY <100+30) { - UrbanAutonomous.simParam.numberOfVehicle=(int)((mouseX-offsetSecond)/2); - UrbanAutonomous.vehicleStack.vehicleGen(); - } - - //capacity of vehicle - else if (mouseY>171 && mouseY<170+30) { - UrbanAutonomous.simParam.capacityOfVehicle=(int)((mouseX-offsetSecond)/2); - UrbanAutonomous.vehicleStack.vehicleGen(); - } else if (mouseY>520 && mouseY<520+30) { - //currentDemandSize - UrbanAutonomous.simParam.currentDemandSize=(int)((mouseX-offsetSecond)/2); - } else if (mouseY>630 && mouseY<630+30) { - //demandInterval - UrbanAutonomous.simParam.demandInterval=(int)((mouseX-offsetSecond)/2); - } else if (mouseY>700 && mouseY<700+30) { - //demandLifetime - UrbanAutonomous.simParam.demandLifetime=(int)((mouseX-offsetSecond)/2); - } - } + } - //FleetPreset Button - if (mouseY>340 && mouseY<340+30) { - if (mouseX>420 && mouseX<420+100) { - //PEV - UrbanAutonomous.simParam.numberOfVehicle=80; - UrbanAutonomous.simParam.capacityOfVehicle=1; - UrbanAutonomous.vehicleStack.vehicleGen(); - } else if (mouseX>550 && mouseX<550+100) { - //Car - UrbanAutonomous.simParam.numberOfVehicle=20; - UrbanAutonomous.simParam.capacityOfVehicle=4; - UrbanAutonomous.vehicleStack.vehicleGen(); - } else if (mouseX>680 && mouseX<680+100) { - //Bus - UrbanAutonomous.simParam.numberOfVehicle=1; - UrbanAutonomous.simParam.capacityOfVehicle=80; - UrbanAutonomous.vehicleStack.vehicleGen(); - } + public void mousePressed() { + //Vehicle Size + if (mouseY >250 && mouseY<300) { + if (mouseX >350 && mouseX <850) { + UrbanAutonomous.simParam.capacityOfVehicle=(mouseX-350)/10; + UrbanAutonomous.simParam.numberOfVehicle=1; + UrbanAutonomous.vehicleStack.vehicleGen(); + } } - - //DemandSize preset - if (mouseX>300 && mouseX<780) { - if (mouseY > 450 && mouseY<480) { - UrbanAutonomous.simParam.demandSizeCustom=false; - } else if (mouseY > 520 && mouseY<550) { - UrbanAutonomous.simParam.demandSizeCustom=true; - } + //Time + else if (mouseY >350 && mouseY<400) { + UrbanAutonomous.simParam.currentTime=(mouseX-350)*10 ; } - } } + } diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde index 10b7720..f221a14 100644 --- a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -100,7 +100,8 @@ public static int brushNumber; // Load Image loadTileImage(); - backgroundImg = loadImage("operationWindow.jpg"); + //backgroundImg = loadImage("operationWindow.jpg"); + backgroundImg = loadImage("operationWindow.png"); sideDisplayImg = loadImage("sideDisplay.jpg"); // Legend Symbol diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/OperationDisp.class b/Processing/Misc/UrbanAutonomous/build-tmp/OperationDisp.class index 3e0a72d5acc2dfb8fab5597aa8e8abde9a032638..8d44025199bfa5ac50e48384a634db98dbc512bc 100644 GIT binary patch literal 6799 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 U)TF^|nW@waD7Bebm#8iO59&UTtpET3 literal 6370 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 jlR<_dmO+*wk3pWn9;kwyf%!Ls8d0 literal 2927 zcmZ{mYitx%6vzK}X4`GIm$nOq0)_JEgQXM;^@S8FZFv=zwo)kNrA&9HbYOR9ot$_F*Z@Qr1Yniw@!T8$dtF@|XLo5l}HqVaDM z&$*AC>o?zg2S6*%`=K#Z^d?Qma4kEr$4W%)F+Y3^)k(*Wn5mSNINTDk9kZpcBbkhu zF2f8vk8iY6NeT~p@xsu?P`u7cSZ+Im9$G%Y;OnxZW&k?MIQ%FP5mv(NNympwXO}S) zGZ~6frkhUsQ96F>$P`zeUWLm_r7)z)U=@?{S-NIbQQ9o_oTZ%@6 z{8&a6?RJKYL`T}S6SfH9SdJ!!l9UziGaMt%5D53@#%-l&#%+GAB!Aw<(IWDeMbeIA zCfr?C+!V=Ib6TX^$v$kw%q~0OI(CdY6y7}j*cQN@xZ97rh$=91tP%B<+G#hLcDwqi zKaE(+(S~)DAZ{c(V|L_dziUK}iuKr0XrPqs*x<*#MBd`y=nzSH%r>I3VDbvKi({j3 zRHl zuX0FaEs$DD&ixz*aFEial4isjwj%kd%l3P7)57-S0ggj3sBNn{kZexbmv~y3veNKl`l{ zB&QiCIZg?0c~qLa6Rzou8ZqH|h~rFwD{Kv$uH5U*c!c9oJVxzTQ6gDaI_27QcGy1Z zr!0bcn7c6o{dU@km}1M*!T0VAb%Wh@#27WOgifqZ_Z%GqaWBxwM`OByqy<<=-;At9 zO|K*HssuTG7E7Z*XL#uClt`en-a`3a!Yg0HtfnCQZ3?re1Iy)X0hH0-ObTY0=Ow74 zCy~HEfmu_SKOGc+M&=5dwUU5^`GBJLC>eQto13noHt0K&#cDb7ugzc?jh0qMv#1q= zAU?^UY61;8GFn+RGKm%P37=#oT^nT087$18|y1j#3rtP}%T zTb;zUnOV$JqrnU+CeSm5o$_-}K4eM`q8Ys8*{M5!<&}vRPzgQse+~Qe)=Av2zlNc4 zrj)S_9_SQ;J^}h92suAH=Yek&f<*!>5+J@*;HO!9rbah2_|TiWSb)V6d|5~ig1VPg zBU;PL|52}2S*WK~R_aZuejK*SPRer-DW8U<@^Nfa5UI{VqkK-SsG-dxJKcm zIOt6$6$iDA>x9UfEWVK6v^s~b;v>O}jZ!ZIK^tX$Za3CMi(-=)nZVI0*yFgYfEPWK zioF$e^QbCJE6Hot8mITT$~u-WOdIu}Xa5VG$QP!)oi9xLS{5cxi^_Cb%3`~+xTHqZ zM0E~WHk&(ET1f^qR8?i4tf#>@2~X=FMb!qiMvuLaW2+SFFJPM$`-0j*wLzWB9VGHm zn`HW2UJ0`1EYuAkK+%0#qYtvER-+pk%%CWJ5)Y5(7FV>aN_s`h0_3IC4~zRo1Kn<{ zlYT;hD*Bs^Wtc;+3G)#~4gF{>z%Ulky}lSv($)Dimg0HT;R@<8i3YqyKU(io#C3%5 z4ZYobk0$(x75Et~Ovfr#jn!-+T3H>viO>rPYr`7Wi+k8XtYuNOv19b&aSrR*Q)p*b z=+)vCY+zI9VAs*fzCsuK7Ms|w*v$UK7HtN$YPIOrTCq**!gg&B!rBOSXs6JlT|mEf z2?JUN`?N{y*FMAn?Nc1mZotrf!jSemB6=B2ovP7SVMOnMrSHa3J%Xe@h6nYFNa@eO z)h{EhU&W~YI*#e@;<)}XPUxTGr2ZXF>p$Wl{TH0k|G-%v$K$@mIOl7^d0#u8@NL3H toTUyf#=JEv*M=He|Hg(;s6lJ5uV3;H)zd`Z_pS)7o=>;=Ir0pI{v0pkE+0ptK_0p$R50p|dF N0q6jN0qm1V2`D4AEyDl+ diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class b/Processing/Misc/UrbanAutonomous/build-tmp/UrbanAutonomous.class index c473db67cf8d13cd860d9ee7b261c05dc3d63fd0..6b3df2400d12aa66c29f9cfb23a97ff0991dce93 100644 GIT binary patch delta 983 zcmWNQdrZ}39L7J-JGsl{0D*`5K@R5-h!Pkk2uK`jIuyphF)i?dw%kgamQItUxi!hs ze)AedOov@Ivz=;|R$GhKmY1~FYA$Eys&!kbfl*f9zn=H~zVG`y&-eN69qAtFJ|2y8 zYafcf6<3s*zk(*MBBFK7cd@j)B)Z&WmbhekT}t#??iuxO;T|5RjVD;aHXdQSt)65z zI~Zao#~9!gPjiM{T(;^@?BP#5!Cp;bpHkSb91bYRA=U7_8W>b3FQ|uM^>J8hIAY=> z+Q7@&#H-rQYe*q_5WS#Suc6>XO_}yC{ zcs6*Q1a6RRnFJZL8{>B4CK3Lkg9*C%$2z^`g^TATT4YWlSuXl;aih9pZ5v05;>lD3 z`AVczNlddu8U)S=BUlELk-%fMr}6SswN%QT#XpMlBH&y)!jO8_=T!KZxen)u!|GwxcHIw^ zM1Q_SI$zQt+bXv^m!-9}$=b@7bhXxdS+mV*6(*$R?EBAocD~2%ZRatYD#tg{*%;9l0z!m}*rIi6;Nts5EQ zc@D6Nx7f@nws4lM{J=J@Smzo$1Uof_U7F5rWwJ*hhE>HYim+F0?9(z1n((Vy$ziSH zHT5&9wH(z(-asm38KMg`)r;huXm}I9DJAkYsT^Y#QOY<@74I;g6Fk7XwDBIDoaAwv zrkD5W;{(?6A%mP|J7XN=Bd;cRFz;hy`h*nDkYh84IY$NOS-_{iLOAF4N2}-dJ#d;EK)kE7kl)55KdLKfKj> z+d|{Sag{XwCSYMF%g9S{nm;(xvrXr&+Hu@5yFD0Tfmgsg?sGK#bV4W&CWRG{ma8!42M)Nptcu{6W zcXGq?P>W%!7U~&AG+?-1wK}Xt8ZkVYsydz1VqGx&OcnZ0_4-*2 z-bg`jOh0qA#!D)!OW1@@n@QGIvhcDh zL#~EV7vZF<<+7_|(%r3iSFc1DREBHxGK*JbG~;(I#`qu^?jeG%jgV_M=106E#od8U k8)_->?oo2wV^;0*(n^{F%dN7)?(~r9dad(>*IzRCe_Kb^#{d8T diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java index 2fc50c5..c390c85 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java @@ -13,6 +13,44 @@ public OperationDisp(PApplet _p) { public void show() { UrbanAutonomous.opw.image(UrbanAutonomous.backgroundImg, 0, 0); + + p.noStroke(); + UrbanAutonomous.opw.textSize(35); + //fill(#006837); + //Vehicle Size + p.fill(0,104,55); + p.rect(350, 250, UrbanAutonomous.simParam.capacityOfVehicle*10, 50); + //Vehicle Size TEXT + p.fill(255,255,255); + String vehicleSizeLabel = Integer.toString(UrbanAutonomous.simParam.capacityOfVehicle); + UrbanAutonomous.opw.text(vehicleSizeLabel, 360, 295); + + //Time Bar + p.fill(0,104,55); + p.rect(350, 350, UrbanAutonomous.simParam.currentTime/10, 50); + //Time Text + p.fill(255,255,255); + UrbanAutonomous.opw.textSize(35); + int hour = UrbanAutonomous.simParam.currentTime / 600;// 600step = 1hour + int min = (UrbanAutonomous.simParam.currentTime - hour * 600) / 60;// 60step = // 1min + String timeLabel = p.nf(hour, 2) + ":" + p.nf(min, 2); + UrbanAutonomous.opw.text(timeLabel, 360, 395); + //Demand + p.fill(0,104,55); + for(int i=0;i<24;i++){ + p.rect(350+60*i, 500-UrbanAutonomous.simParam.demandSizeArray[i], 60,UrbanAutonomous.simParam.demandSizeArray[i]); + } + //Optimal Fleet Size + p.fill(0,104,55); + p.rect(350, 700, UrbanAutonomous.simParam.numberOfVehicle * UrbanAutonomous.simParam.capacityOfVehicle, 50); + //Optimal Fleet Size + p.fill(255,255,255); + String fleetSizeLabel = Integer.toString(UrbanAutonomous.simParam.capacityOfVehicle*UrbanAutonomous.simParam.numberOfVehicle); + UrbanAutonomous.opw.text(fleetSizeLabel, 360, 745); + + + + /* showBrush(); showMapGUI(); showLegendSymbolGUI(); @@ -27,8 +65,12 @@ public void show() { //showDemandProbabilityGUI(); oldshowDemandProbabilityGUI(); showTotalCongestion(); + */ } + + +/////////////////////////////// void oldshowBrush() { for (int i = 0; i < UrbanAutonomous.mapBlockBrushs.specificBrushs.length; i++) { UrbanAutonomous.opw.image(UrbanAutonomous.mapBlockBrushs.specificBrushs[i].pg, 50, 250 + 70 * i); diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java index 60316d6..00ed108 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java @@ -11,130 +11,22 @@ public void setup() { delay(500); } - public void draw() { + public void draw() { operationDisp.show(); - } - - public void mousePressed() { - //Time - if (mouseX >1130 && mouseX <1850) { - if (mouseY >150-50 && mouseY<150+50) { - UrbanAutonomous.simParam.currentTime=(mouseX-1130)*20 ; - } - } - //save file for custom map - if (mouseX > 200 && mouseX<300) - if (mouseY> 200 && mouseY<230) - UrbanAutonomous.fileControl.outputCSV(); - - //MAP - if (mouseX > 50 && mouseX<200) { - if (mouseY> 100 && mouseY<130) { - UrbanAutonomous.mapBlockStack.loadUrbanMap(); - UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation - UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display - } else if (mouseY> 150 && mouseY<180) { - UrbanAutonomous.mapBlockStack.loadRuralMap(); - UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation - UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display - } else if (mouseY> 200 && mouseY<230) { - UrbanAutonomous.mapBlockStack.noneMapGen(); - UrbanAutonomous.mapBlockStack.updateCoordinate();// reflect change of mapblock to demand generation - UrbanAutonomous.mapBlockStack.mapImgCreation();//map image creation for display - } - } - //MAP change brush - if (mouseX >50 && mouseX <200) { - if (mouseY >530 && mouseY<600) { - UrbanAutonomous.mapBlockBrushs.randomBrushsGen(); - UrbanAutonomous.mapBlockBrushs.brushImgCreation(); - } - } - //Map Brush select - if (mouseX >50 && mouseX <100) { - UrbanAutonomous.mapBlockBrushs.brushImgCreation(); - if (mouseY >250 && mouseY<300) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[0]; - UrbanAutonomous.brushNumber=0; - } else if (mouseY >320 && mouseY<370) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[1]; - UrbanAutonomous.brushNumber=1; - } else if (mouseY >390 && mouseY<440) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[2]; - UrbanAutonomous.brushNumber=2; - } else if (mouseY >460 && mouseY<510) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.specificBrushs[3]; - UrbanAutonomous.brushNumber=3; - } - } else if (mouseX >150 && mouseX <200) { - UrbanAutonomous.mapBlockBrushs.brushImgCreation(); - if (mouseY >250 && mouseY<300) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[0]; - } else if (mouseY >320 && mouseY<370) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[1]; - } else if (mouseY >390 && mouseY<440) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[2]; - } else if (mouseY >460 && mouseY<510) { - UrbanAutonomous.mapBlockBrushs.selectedBrush=UrbanAutonomous.mapBlockBrushs.randomBrushs[3]; - } - } - - - int offsetSecond=580; - //Fleet Demand - - if (mouseX > offsetSecond && mouseX<= offsetSecond+200) { - //Fleet Size - - //number of vehicle - if (mouseY>100 && mouseY <100+30) { - UrbanAutonomous.simParam.numberOfVehicle=(int)((mouseX-offsetSecond)/2); - UrbanAutonomous.vehicleStack.vehicleGen(); - } - - //capacity of vehicle - else if (mouseY>171 && mouseY<170+30) { - UrbanAutonomous.simParam.capacityOfVehicle=(int)((mouseX-offsetSecond)/2); - UrbanAutonomous.vehicleStack.vehicleGen(); - } else if (mouseY>520 && mouseY<520+30) { - //currentDemandSize - UrbanAutonomous.simParam.currentDemandSize=(int)((mouseX-offsetSecond)/2); - } else if (mouseY>630 && mouseY<630+30) { - //demandInterval - UrbanAutonomous.simParam.demandInterval=(int)((mouseX-offsetSecond)/2); - } else if (mouseY>700 && mouseY<700+30) { - //demandLifetime - UrbanAutonomous.simParam.demandLifetime=(int)((mouseX-offsetSecond)/2); - } - } + } - //FleetPreset Button - if (mouseY>340 && mouseY<340+30) { - if (mouseX>420 && mouseX<420+100) { - //PEV - UrbanAutonomous.simParam.numberOfVehicle=80; - UrbanAutonomous.simParam.capacityOfVehicle=1; - UrbanAutonomous.vehicleStack.vehicleGen(); - } else if (mouseX>550 && mouseX<550+100) { - //Car - UrbanAutonomous.simParam.numberOfVehicle=20; - UrbanAutonomous.simParam.capacityOfVehicle=4; - UrbanAutonomous.vehicleStack.vehicleGen(); - } else if (mouseX>680 && mouseX<680+100) { - //Bus - UrbanAutonomous.simParam.numberOfVehicle=1; - UrbanAutonomous.simParam.capacityOfVehicle=80; - UrbanAutonomous.vehicleStack.vehicleGen(); - } + public void mousePressed() { + //Vehicle Size + if (mouseY >250 && mouseY<300) { + if (mouseX >350 && mouseX <850) { + UrbanAutonomous.simParam.capacityOfVehicle=(mouseX-350)/10; + UrbanAutonomous.simParam.numberOfVehicle=1; + UrbanAutonomous.vehicleStack.vehicleGen(); + } } - - //DemandSize preset - if (mouseX>300 && mouseX<780) { - if (mouseY > 450 && mouseY<480) { - UrbanAutonomous.simParam.demandSizeCustom=false; - } else if (mouseY > 520 && mouseY<550) { - UrbanAutonomous.simParam.demandSizeCustom=true; - } + //Time + else if (mouseY >350 && mouseY<400) { + UrbanAutonomous.simParam.currentTime=(mouseX-350)*10 ; } - } } + } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java index ea0f7a0..890ef05 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java @@ -120,7 +120,8 @@ public void setup() { // Load Image loadTileImage(); - backgroundImg = loadImage("operationWindow.jpg"); + //backgroundImg = loadImage("operationWindow.jpg"); + backgroundImg = loadImage("operationWindow.png"); sideDisplayImg = loadImage("sideDisplay.jpg"); // Legend Symbol diff --git a/Processing/Misc/UrbanAutonomous/data/operationWindow.png b/Processing/Misc/UrbanAutonomous/data/operationWindow.png new file mode 100644 index 0000000000000000000000000000000000000000..22f38ea986bb0ef6410ad9592eaf46787ffcf576 GIT binary patch literal 25978 zcmeFZcT`hd*Ds0{m8PPAR4XVQfzZK!@>PW_JcQnJ-k8%f1L5UZRGXP)!xg;%EOM~x~;3V-PyZH zD+fDWJ1bj1_eMKq1_nFcySJ|E`S#5W=pc9v(}dPv=9h3R-HR9Qq`FY>_bRx%D>%e6 z8N{516)%@37R24%N6c2dtdLz5ar8%OGkV`g7tbk8zNsH9FP9vrZaMAa;kx$t5zp_Z zOr4ib!fC#ijrZWlmU|DM(r&8?pZbQ;+|>|lY-2nq^5)Fq`H@3f@2WP(<}V!ui~Yaq zx#odbk#Ki$DWHqgS>tqbif8eKh2Ie{bTq~9uLp;cn zDr{a}UO@p(;lXk3Q+K|~a7UMvlptq@R<#*94&5Vn|ilgc{gQSO=E`lf__ zE_F*(LPCwFd1So|=BDj@FCj$L#ve%l^gnv!IsrZlm||PaYx(ZlQ4lnK|wuj z`oi&w({8SVm6M!IP@CUl$LouX4WCT+U?(gjI3nZk*_F2HUOqKGK0eo9-bwSHcxnT+ zWAJNWTO^5zikcEpVjOMicsxE@-G+LgwXLn;Sihvbg9hbqll;wm=+rZ8`i>nRg5xPO z`jSKv4V$T()88QyXJ%w{UwCiQm9=lfRix0+Py#C+cY4M=@0)&Z*XwV4eUlY`;SfDf zDIVpOLECs*ewvZzHe5oLeL%?eg@9$rZzeiT^cA!#na&pX-e5x{?#h`(BuVQ&q;Yg7; zd~dJjqE;JAAK(~7L$4ZGB{@z)j=wPb;Aw0hFDa>cc1{R z-NjHB2K2OXIDzlmmfBT~Cy-Xf-eQp6>4J>+9&~fNA5h6ZeDzP4i#R|3(7ehol}d@Y;_$#NxB#J3;j#0T=uPulry^SKJ1+jJW zUu>ekRSt5h1#KU{Khd;5yq(h7cxPTnCrz-F-hsb}nz3D~fj4f*b&gOlo3$y>0l4Ye ze~KaeJEe1SErx!neC_WE)#3axwe0p;M%T>SB^77(W?uSqg@HAO9V>{DOW2+=H95eu z-IDWhgTC4fC%1AAY44U+-!%`sT?=cKI6CE#*gcrzkWDN z==PjNGzj$Ye~g$)91=_%yem!`a7_u1>CA)8(Ceos(*)>JElzFKNvGNnl{|w^a7NJ? zfhyMAMd?Ys6qORGboY}T#Gp6*^at83V0fa2tMSjr@^t&R>GqB@J9ixKB4V3tM^SVR zoJCM_K*g@^;AZ_a504LAVa6GorC)57!ZtW1zdl?1H*LSvNOJUObJqAs55~KETrOncb7%vj)|w0V!dhkbFl!;IljZ+m>Ag1xV@J!#a&| z)hL09;kd-B6t^D|gMGg}j=xCtl^fUv0?>n{oKGjcNYy;hzicz8gr*&5XMeSIuGZ9E*uHWi)9x7*vU9bZ?6M`ct@(J$5i7J89=Vk#Gl zn31OW=k~8^F3Hg!E)DIXm#}MbV`{EmQ9EPR8ZWA2`MYFkEg?2^vvYh4L;Ts3v-?hu zPtDiI(w7}3l|!!hZ;B$%Qe_jOl`spXlhNTSOmv&gQ>+i!ATZF&max5Fy`#6Wm^clT zFD+Xq&BaSqD>izrfGxeUc(WU5{q8WjU#xO z${W+_*-s^xA`IFnBT0$%5qxZ_^zpNGuSXp^i1PID`c+0sf0pxGmHysmKB+-!CAe3d zb8C^V9mcV3z&Cy-JhPj0^z$n>6%UU#$%o0wIo#-F$2mB|?frugqw!eGqb^cVqNYV( zz~3c|j`z7+bI6jt)CI`N>GsKsdfk#W#(I^(bRlbUa6=?|LdmT5Gd!KczA}My`XbYQ6oo zZJ&)OPu*$Ka|cCMGOm2vh<-yJLR%^FqA-s&-}a#rZ75WLo-; zm6{N(Lut~iI$`<&dx68uD(B*KTz2DVwTs6qcWaBjiP`9!s-47@Eo^IM_T{w6H-p_S zQrUC#8L-fwN7$QOw8~A>QUOqGe{V!cw8n8cT%p_(MXyeEarre&%0`Fx(|4|$)FlOS zs1E6#O(>~v>%;hpYq`=VBfZ)R_PM|bTrU*SiY)Np2%k7PX->qrd(iE;R zl>c^d*RPfEUvaC^2PJ3dlm1I<^WFktv}l&CsPwzxflD%47dsagTUJgDe&&y^5Ypvnal2Awe2geoIcX5t4h_v7PAE{6<(cpy)2Xr?_LeL8duy*7vQ# zAYE#f;iat2tn%%SDfB|4e_!`cPFKjMD@R<)O7v7a2eYDK$$}QFL=_%$f z_ofUN%&XiB!U&OO^2`t`?OPHA@<55!%+K0Wb-U2AuDvkg;CfE@)ba6jZ!}$|e9LTU zl`KPO+T{9Tm(!Z&q+>}|#hG0Lcz?Ke`_81aV-$7j!S@aK-LmuDjIJb^)`9L1RyZ0g zp`o6sjDDF!a7*YtFl;yhK)xsfB2O9%U;3r;@nwX5Fk<(N;rhlkD`sN zeLOuIIvb!rIWhDxGYfa2#u@8kTVfWtbF%_tV3Hi6V9BfYO=6=BrRq(bR4W>&Wqnux{ERSwT3APTcMi^RrOn1(|reNx4Fy>G5$}K8^PrCFfG+R07 z&yQwLX865f*6Zg^GxL>6)e$k1HlV#b2z&%_b#qjkvNJsELDIj|^}<18yUJ zpZmJ^opqhPUbKzfQ9Y7A{(h~)c406h`g}{FgX%hu8ou3$fajcwGq}@7WP@F4)NE3N z@92&6+3^R_4b{h#lWPN00Om6Vu^BLY3}UCkAP-pn^g`vvc!t$C6^ z)82+}<)d)8i0kPQEN$YB`r-}!%BsX(L3vG+l=^jz*wp~8J{iasJ_Al&iG#D%fAm-6 zx`c(x84(AYskP+D#s+$aXG*ccjD@-XrKU6Fvl#kdeazzMhH)r@S8dC8S7Pwq?r6Gy z+DH?6Hk)hu)rAJ87x9%_U3q6UXYS0q$~-6S==+Z%eNw%d*MEEU4G!T0zJCw>gu>|fgs_FApr3O<|OW_i3Sj6Z`Rh3<}%+3)>^=4PpxE^XCH_Cm_`W)7?; z$vj3c6$g6fXggXwt#^y;{%t&QrBx%hw9a7-Se+JBN^j4L zY_z>bZryn8uotde5=e+w-X|~;!WPR*!ScxxrQns znQZZQkAT6x)_=c{pZ`f_y;}9JxU#Yoy&l2C8)xSiJBx#03E#u8Ug;B3BRh9^GT$K; zT;*wUoSio-vNDIS*2*Ui2Dz(PrN_|A7NzKtzEyJ5qt#i7o2%rNQ#Sc*KO9<))lP2_ z1@+n|M))ap)^Sds##}K|5#g2lTo459{hPYSJcegwzTD7#a>J~>?M@L6VpYD(+Ya@zs zkM(#ikGB*)5ak%H3#kFo>m4Ur?IDLGL`M5FPTn~$509%=gCcP(4^L#4OiWBcw;4OUkLDpVv1RWbO02=%k<<#^)J10j5CEzFJuJfi<_tRU!Wrh# z(m=&3e7=*{)GhxUoTqcgH+DHQaYRpv{!;xln7K|FQDUC-W}-K$B(cOGCX^5nZT5() zm5Fnl)(JGdou9akkM!gzxR~x@E)FT2GaX)??g648CM3=!x=AfoJ&oj)7`K_0L|ffcVhWF&kgb!7Lnd!X zx&i@sdU^r|$Gw#-Qqkh_q3xs*@`pW#GJ4)G1=-_5yh>@29yN8uF|Snb}SMADs$)yL$M*cTe37AgU1CJl(iPrHisK) znQS;R!>NL>D1l@RFPbZ9NVt5~qKunb8^+hok5DEqydz)P)Isc471bqb?P0!0M--AMMOl*9D-b2<^XHsUQye6p|{j3 zBt>QC!J!T`xgO)&3!{`$Jk`XUTlaEG9JocOp&C zz+-Eb>^0hGA$QDPhm?>u7F^nab=#Mo=W1o$;Q#9@P9@YHqE!k{TT>pK$d$E;p8D}a zkKXn}M@MJv8#1@ciDpGFY^SyF0*Xg$;q>9juCcSGjbOiRE=^wkde5h)r-xDbV*hw^ zvnDE=glftXAw1@?&5`N&?zY{mQS#CvpcDJzs$cnP4QGDBet{k3oiyM)xiVd$BuPbsbI0N7@Y1ob$-yy zmjkzYJ*C&}IeSCr$)9d9zSKXo_5+5l~x@?hv!;4 zt|^+G9lr*;r*zjkBO!{a+##E}WYFulHdwjRu4i=cj~oupS_kD3z_CVk=W!Y#kZ}3Hip?O|3NX z0E;m69>dKXX}ot`Y4k^>Y7*l0SQMbIT+kv+BCh>q?UG)gOz894In&n8{0WB zcA4oNVA8uVZIUL~Q^_rLA#)&@P1#wGacuUXtwd@c!lhqBJm4Pv8sN(*-EA)58&f`o z^|-z*G(Fjhvzy`(lKU`dq{*#bwl=C>V(+^{_LPtn`Mv#>E?J@<9~Md1x)LpKL+*y* zI&W0nfX&2dA-IHxUcpd7znlGRc6qehOHi^2Y;@p3>yKJ&L_}vZ;W_PPD_2*^#a9(8 zuP)-F?GGVaLIDJPEOxSKF8Rj$`@-?oeO$|(`)q3FtLasAR+8#ux&^26%dvd*3HBYF zmmICa%-p=7%L!PQ9SI2{MQdIrxvlk7^7T~3R~&|6SP-6$;W1}cKKK4w86J&>9cnic zITN*EJ@$)^6sJQ5#^3OFAGJSS7Bb8V< zhYa|W4-X9qTCfJtWO&s`QhHR;x(&zV-k)>9X;O0%gZ>Y+iQP{7-Wx;Y&rFmNNJl2`!QDktPaTHr$%o ziz{rCYXoBJJ>zBk>pF__&}zyQ!8qEx1^1ai|1wV9C-fHLS3irhH?iuMn-=s;BlU64 zVs}L}`#am(WB$7HbQZ9_Z{NK6YLC5txw#nRSAbVAP{`%0QAN-Cz5i{1uf$^hQY%dN z8R<$>ib>TJLEiajd>#JGSb6#US^ir+#GsD1#f#DsZ)ss0n(STSJX>GF4kT*3{l73dGGT z<)x)PXZuR>mgJg&ar*J)%Pp+^p%N41=f$l&=6V>({c7|nvLRJyXrBINJP=E&XdK2Z z!0wt02da3VZ(&jMb=G@(x;XUBngH@5et4<2E?s3+x694J=P68Tko3dES)|#hcVm7? zBiwA)vke`kb+|SpLm00u;1cTBP&WN@;54i$=dQ%xGZrKk7t5%qs3@kw zeauwPiE%_8s82PHa85tWWYsZlA{_s1W(HxPK&-3`SRAP<5IUx`wMxa*N%I`~=*$LF zZKp3*UliD>R7p~C53ni!^bnibZq>|aQ(}MBy5*SS&1Pag?{bHdgu&RiPhmD9!3%Q& zyRXB3Y@8;204#ue?QDZhy0X?9^MSDTr(>8|&X}+oHOG>;-Jkhh9kox`)zFT1g_l{q zX+I(b3GVx;Qvu{h=>^UPVD}l&TB1r9dkV}Vd7Pb{x8fTM^73rE$})8wU+PyAgfKqC zw}QVEh2A(9X~&q9qOM_J!OP0VV`V)`q&9_8JhQbCd5fntOaVI~qaJ1U(B}SneIw_9 z;k;Vk?{EGiT`P6Hd1vpMucQocn%!)6liKMVE~_^*kPX<%<@Di;bg=Q_>7+_3AbmJl z17>~Of{qNws;*NxAIy{POn#}~_6PLJ1|sh>AQO<*JVI`HvQ*<#S1!x~>NBLdt7;U#G)-h96Q_K;8SHI}*o5(AL%lCtOu&-faixmMrC%`u6Q7gWTjffdV0yl}XF*`el)M2jx?w zl#~%64;x-FHil9dk?D(VPTCD^A5(Sk_J?rxD1qeDA2}5W$>;11WGlP!6zVB{?hi`b z^sPc-2IqYcdCM$vC+~0-wnAy8ULI?T)z|LqDTzqIwN?=8SU*#cmF=Q;?kJfCh^9OO zagbvj5v1BWkI3f=R{1TDCuske=BSmIN?^Ir<0N|se?e?3iVjHa-vNrpT8_~azeH*A zq@`%&hE-Q44(>j7!NeP!nTSrGEceV?jy5|>BN^93Oc)20t<}s!3t&w()T}xFOT>0L z9`6Tousv|%Wq}xRadBFonCabwIG3#id~Mgp#)fK*m#+vh79?8|Mwz3a#Y~STHL= zOUb%@=4TVe)DNUdnJ$MyYW`dco?^aQGqLl~EcQqLM^roD) zzv3o1Q(ahi9DOAu`54+9O5I z%#7hghe(8lKxMqSmBC*;TMV~=Q8x87JtI1lXQ>f=0u^WtbiQ$!zijJd86Y4(|8=s- z^_;b!<4R zcG8+ZwYaFgpxm=J+a#anWO1C_`LXK~!O%I>{FMtADlkw*oor>`0Izs)JZ;=yOUSLz z8)Z7sa2%iOX0;JtqiUvO5iq)%NIS~O%Xw+*_fGV8Smj9<+XcHXD8LM?_>VkCT3J`G z3#L+coa~_Na>hOO;NhgSGyp}A0>wHeXMO`;RbtXI*f%YRAHKyYVLsz8H5|X-?<+^| z24W@z7N}=Psj3c&EHXPBbq(!Yjkq;>X>6;0Tue-CRV~2E>YVwtiI#Ef`<``P7)Yn3 z@3=Y}ENm%FuDvpQB3!`CK`au?|0x?3if)t>DcjNS$Os&s6wR{m%8_3OAwP@I0URIkBrOB z%_Y@#o69A;KI9Ryn1A{tMI}}6@lCg_++Q>cn(eP;*R0SK-1B9CrUVJZ!MvXxN<8N# z2aomy&>w8xvQC{Jn5UH+Uti32?8x79^oUSEi)!wYC(#Z)HWXZ(qrl@l;~MkuH#eWz zWjuIfa9M?LSbdTm05@6;z8^olwNg z{s+o|2h_soit7VS9*wx^r?|T61Ot#|hpMHuqB4#OtC=GhyK| zaXQ_d*x@|pgv!c;N%n_`mq38?EnQXwjQW@a){D{yy3c_N!}dP+;*3u1=kk+*=C$aU zH-0s_&x7XWPr>~ol){D=N&79?kluEMREtX>6*{&`Nby-oKK%<`G#45}e-p4n7LUsK zgR2;EqLQbiwy0iqg{?-gp}eyO?)>lU51|cZE6GL#ym1Y%OXXd8U>OWyH`otYUM`BS zSt>~iES429a*lUbM7OGMZy87`A2?J2^Ez?2P0i3z)mRA@lPG z_I}kBW0Lf*Z~G|aoE~3OgjW-c{GhA*)mc|S#Z3p#uEy5Uy%%x)j+v$Ctb8@OLHj(Z;hKKZ|%|FZ;M z6xd`j{9YmINF*P8d~>{1VDKt%#**jFrJzFxDg`bk?EQsH7zZ6$hR^pS?4ZbsA?%*$ zUNMiPUV~Q6br3!P3)XAo?CuBs==S*U1eKTL6BCJW;rQoGRJ{#_Y6a+rsQq0<2a>>( zk`hG)tPNZd6%K=a8fTQFXJEogxe!^(k!F&z4H#x-IW*w=GBYy^ z2T*$N?;p7n+QSnaW`TxAq&+i2odqD;IDZVpC7@X3F(arg0W*}53JWE5<@7~4KupJ8 z;D$oczQv0K5B>O^oSe)g*EJoXSpulmFro|E$InlpzKm1c^lyXQpk?UudYP;#Pkvo! zYD$z~OS1%JKXz0(mwv9CYCs4HV_sWk=3!|`AE^Po_7#^Aosk^8cysmADI{%r5)-105EN@p_QE-08xBT9Zm^u z1CZga)c>HwWVYFM6#u*LtUQd)5*}sAX$i(*U}eY6yjv=Fs*=4furW|zQLXw^PCwru zhEEAF(C+fjZ{i8e!zjSY6Qpirw99*rH?Oa+55o^YMGlYK&n58b;VI3rlswt%7>Wy6 zyy_{ngFs@>c)}ewK*cARKma$x@g+Xvscw!QAnfK-<}D?iA_MshC^t8Dx8_?8Lyayp z#ah4%LDZ(ECQzE4m1S+yZN9|E3=!hnRZ z=*t!+&NEn4?(&%en5idMx#wpP=(uJm%;dvMM^2+it=B<`Rf7$=a!dl0l1yBEXVdUv zc5)Q@zMt1RzgRjKp$>vtybZVfma}}!_cA+Dm3+YL#1{Y|))J-m&q?rBRaTl}dz7|> zUpI{{7&y$8U!ts&idqZFSz>(t1C~9`Ob5aoj|$C7lg;e(8;AXiD#lOX;4x6`&f}Zc zM2WH+sDpv`uFB0?0%8Ufa@o8suc%N|Q3)JxP6Dfmj)`&5j~gEFCsjGhB%SsJsv=@o zpsA@D(!M0b5{yuqXJQ;Aq2-23-WlX-DRYX;rpTDiwj|4y${;dz8(qWzzMQcU16Zlq z=_UDYDR=%j&)MeY<{9g&JT3ut(i=^^#0E$)KA&@IK85HSAo|!;bw85H%FZUv;mgXn z;wa!yL_|ci@)dP_EeH--#Gi7tvU-nKyT(xmOK!RGzObUgf9zX4!QiOWW)zhqo`GQx zmh>p2aGeTc?{X?B2;?c^QZa~VYQT&$LknmnB>UK zArziUV4{w z^|NB$UeOP^#bt?UZ#w2G<8ER$Y6l_qzHx5kk0!VshbAlrwx}SG88&MPnT)dbY;g}e zyGt5to4=~>=Kd@;6n@L5yT#UVrQZbgSH8jYw&gDE^}WozR=FngEmOZ;s08+dEnwi?Z%q+{o0);?W+5RVC7-Y6AR#x!tcfqF zU5dU>{Kic{sc4|20{3^i(PmCfw5C!!kme+RS(lLHfsTd^MqU^!lkeBJ(i0EE6v{!h z<;sdz)iZgR>%eM!2?r)fMdw^~ODMf#7ySzb$ndeMM@ZD4{oa$X==P`T#; z!6Z)1aQo2u&d*0+?+k~N-5(aRfKtemq@=qhM*+qEttZ#M>($+uYtjNSsM#mq%O~ax zd|1z$8lgCo1*_q)0~%P4<4K~?1H-ctB_W;=*)LsBH~=)a-^w9O-oAehaRvSOkA=7? zm@x1H=%qdWOmLG&c}m;prjO)b9`C7|O^*gGgSv9Gnv@w6*?2)I?@Iw=NsxeP*%%oa z0cKD;>oPHPArGA&jyn6#SXmJ@FuV9dWBiZ5F^s{##=dyk&OWFauNp#wSYxTv8dnx~ z`t#JP{|pS2Q)g#q-=QTyeueA$C%e+g@s?z%A0qMh0KvmiZ_meE8{Osk8p9?~uZJ@aj(3tkdhyL1vajZ> ztGBl|=hlIlf&r}?#6B!KCc=*+$JHjp?Z@_ZKtG6w4h(+1thU!XOp`r$wn>)&+*?C5 zLMvOf$=2>p^wKx&jf&P?CVix9J#CE!vI?W>GdBt^Z6p-!d4|K4c1(WISG+vY}W zy>n&x^-B>o5&K*W(0?Mqs(j3`rc}y}_maTb7Wn{!<4u_Vz`>?R+MV5mfLsMEEtuueMNC@kjUfgneRwLOx(wh1T3$L@u zrhBU##OCmWAvb}I-a7Sw15TTsD=;mOMfSie%r(nR2Rm*XQ?mZEtUvIQP^(G5*S9&TIq7udw+pCvPh&D~mbtev`6RK=WdvQuWEV?bCOv-G*cU<86K+{$7_HCSTCYl0b*`L9Yzy;5ljUMkzucW&H__CT5Yg-E-e?(V~; zx1E5J1_T7SyGwDn0zIH4w5kB%SH>uqWwakjWkcW z@zbIuUUQuYm@_c3SzZ&VjI7`OsDu2MBBc_5CqOYm>6QeoOE8GH%2eEf} zZFr!os|)Z%1xJi^%O@Ka@E^;Z%aX9aXJl_godQR&ti>%gbw2ER5iKX!!klhpbH)Qp zo%hbR`Yfp@sx;fIYoq0o(f%8QPc>Ba?MuT15ZCuUOy2fI($f>K=0!l&a-Wc5zXbp< zk*7+z4Osnp5%+pbl;^}Y2C@@(43D~f-KLS@fgU20j>uJil_o|2N&RQfppw(m=cQk#?31sk z9cozMECd#$X$(}H6!Ps>y4bWSi9Hl^r}hJ}eI91tmB5h9B}$uHT2#=qJl!0xIdEx% zoxRI^^y`_&86w*x=dI~8yQX2)`S1bhO8&u?U4O8E_3$oci0(SqX;22z??XvRKtaJe ze@w5Ml};sL`ClpzY(e26hbG zmjFfmq@Y_KhjF5XY%ysLNx^PUx1%j zPP&FON=Z#kO-pluB_q-NuTqA~hK^c3-06`rH8T2IwMOZ*eg;~*$$$zT;5P!S5F~R8 zV`GqTn(E(p_KO)%EZJ{c#=(V)y)drgZE7mZ5J;wPOA#cv1O(lx9FLkJgdZ`m!Oycw)h52kvm+QD}X9d2laf!iUSYZDB&T5)R5lVyrG~ zb0r!;qGF9R5`trUi4}if$7kKOn}?F z9bh~zppjT#a7hk4|1lotlRFfAIk8DeAz-ht?5#S~?Cgmq)<=GRenR0onwp@*EF>C8 zuB^=H@+nZNmC-JVgBrOVbhMV#i;Ro}cfamm25Metbpv|;^N6mP(o5*}Og@D|DQkZu z)7{epfIWf0A-D7Z(c5aicR%XI3!5y<@H7=Phg^~Np+Io6s;#;CV*Wc+KtTVDR8i2{ zq+J{|9Pgv*orUhN=E+W!_aO0-9!N8OfB*X*%l1MPH&b}@&;6Na_+L=+;(wwTl=Q|t z{0hLfdsQi|nbPjzjPiP>L6v}C_emJgAE0a0Csw5(ldV@{U< zNTZ%Bh0`)A!2uxyOv>!KO3B~5p|hrAk0-|&^nnEC%FfzQx{{9zaI}X@fHqlOu=u>k ztjxR=Je+YkD|7EA(~FoGo#GS)&n$4x_^f-L0yxO^38WdeU4|RV;D8e$t}1GDYn)5@ z4VDbD2o(zukmtH65)14>%Lj8vu$B{gO)oyYNg$lA06`d_TL5m7l|3Dl;&fN>tx(7S zu(UzoqTiR+!$1~#!rmOsVVpKfp{?w)<>+|D#YgZ{owXG068IM5b`iC|dJud1(0dp+bJ@hildnTfG+V=U!frUwY@7D%3@z^Vg)SCuRU_3IS_+}tZ! zIk`k-SL^$t9MfXPp22&?93v>e=Jd7iZHUsv1eFf3_XY+AfTqBQRx27ZIKz^MFmzHm z)Zp=eNAszf`w2D$1qDEFc9l5cu?F2|Xs+l|J>fcjtg{%E=VF|MPm7b~Ruo8ddJorz z%6n9%uCA_bk67|vsoq*Cx(h9bwRkAV*Vz`UCCcOlXm{vM#e)}iVjFvyMpEzpG5Yx* zT;%_02!@QG0zpYZ&<65~GM?+aFZSO_%zfVnz=a^T^f!>f`1!beN8e*gwv&NZ(?KU0 z3VnZG65ZX1iiH2B>`G56a(dKrJg5gBJlff+(4cFv(UG6XY7h6h1`B!Q+6A-b>Zt)2|b*QctAJ#IKH+2eHXYf{7GDEA=z5?zA(CJzsUAZ zx)Ob})CyVxp?PQ*w@e-4I&7(gB-47KcN&O*Jga|%t@{t04nnsz2IT+l9AZXw9d&G~;2Gt>tf_uap=OqT)&gUr+WH+rgB zpyq{kyR?|pq1}2(2C5?up#j=2BkNHcmSpI*3j@RJe+cjU|1ja#a=_(>WArV*37u*= z2%UUR*yxa#ak=0E!L`r9BF1Vf)_t=>gK z%^!;`mttnNX>wuvdbO#ADlll^lRN^>y%`SJ%~=;|zY7jp--Xp|J^l>2zN_4v9DUUnKRf=Km&s zsQrJs6zGS4m-S$|OR3UZU{2H_89&xqXg{ueJ>MW#PnZ(?NKr0H6WmRH(3cXfkL@AX zw6sLGLjzc{KeH3a?wm|XPggTSD5kz>7zG!zhut21hkku5n#@)C9FT1Y7-MkFzyOFG zCC@@XTsxl-_+iq^-`BT{NZdMSgTc@Nd9$>1HGn%3+%T>&MPc_&@6S7epkbNT_2(8D zjkZ^LS=(A$Q9eFwY;0ugVn9YaSG0QU-r2CcBf8~ZKf1WP8&o|MQw`j0`y*Q;XetKW z%(PR93B{JsImyKiy;!e_u(L4B?c$DUSX|%Ut~AN#{`3A-gk2LzJ|w&V)toFxpr+e^ z!?1g!Dd<=O3YIU6_y6-918e0}D%Bioi0xq#pWGHs1!2JOCpYA$j{`0fLkb+vy@>+| z-2FyHtY9S1)hP9hAFXc3-|}%=xapUfAsh%se>=Trc|R6o@{sqi!+Sj2i#_$Le9sp4 z^MPV&D*#EY+tKFX;o;L3z2J&J$y|AGXeeD%aO0|!xoP}gw5=Ub6HGxQ&>zWg*PU7- zhgvzxd4y??h-~M<@0i}3*R%lUtF;+%(xTn}aPQCt6Bck$wuv)4%`Q6U;a$C9@ zhBf-=EVFEHBjijUv)Hl+$7*JGdZi3qI$IDI-2h6dtG5Q`K@oCxr-G6abzp#{L287# z?s*TozEJkm3r_yl(7w%`AkpJKVn9q%aV%@!IGC!lIKr$oT%~wfM?X>TtD2scyL6R{lOU*Pu4+#YaupYc|8s7a{f`^&!Vb z7h40Gju6j4>QdZvRx|-9i*L3zg=KD5)kCf&CVQ%8dFT-{9B3~P{ll^| z8EwOETo|Mbx4S?X*C+ePPz!SCVo&j=_w~yJA~D$s{@c=|pW8&Y@D6hQvdjg&lIrU8 z^P`u4q>K!tcDeq=bRpp?<-Y1r+V@wZqc(WfJ>gtT2t2^#XSZ3fS4h>yE6jYdc861a zE4@l)f_49@D7@@@9rmcT2_`WVCA0ti!`!Dcm+SVxTA{+1B3D3U)nyjpL9uUEf8)%P z`!5q%!^uxMk(r-mcty>!xB~${Si^JLXn6^klczd2mv!$ft$y?_(^%6r`t5OD2l6F9 zwE|=gX5O`^Z#x`1*|eTp6_IX>1woTW6K0E+|1K;Yv#Y>=>Q*Tw;S_?Ec$Rj4S6N=( zXd;%ev*UY|(eMrF8$+E*BM7;Hzb)nVQ1|6@BZ9JHmjg_BXM4j_8Kf99+8?!i>Soil z(0Q}~Q1~agU{V@lNT9h0n&0w3gq=pLSz&qMob2h|gxjegT%^td+$C3zHnFH&{$6AO zS~2tjm>6qI{*sCQsy)%2H_I~m6;OrT(H*f}jkX?vfqee2`-UdHKpd>%4z)MBEeek< z9-aEMz6wa+RBZ<``azDKt{{(pyHm+?i-&tr(ytxcBlqs-=ye$GhLf#m8K>HVHdh>% zl{|ui_@yb}a;C5Ex?mClrDi<81R+C99$?$PyOee=c6I5~GFCRRu@)(-GFMFJ*0!cy z%NL3g=9=M_?B+3hqZ?aOAgZ*(Jao1{oE!doFs`_A(k3yr9J;=bSz5Z;UiDUsqzjA&x2vq9)r)RJfR~c^XK&*_l zRawQr+$ZbdPRWns=O9rftBY<4gB>rWw%8W|S2Z**Ar|20cV@KjzOM{7a>h9?tJCp$ zypFc^(xDq$jKSBBiX{PKz8r3kFZa5O;B8)5&Zm8bFzsXgFGV_fNpSgx*dFRE%~BHh zB@N?Y1WZX))jYm2YyYCWc;T#<;)Wf5IK!osN7bKfo^AK(eKugPs9!;z!i1k&AxZPz zqr16X_s+O;B}k4t#=AVy=h|L4a>E9!B4~8aq4>fDSZX?dIF)Q|ZH-(7|MAAul(1Ns zm?VD;cx=9(NolhiLIMvvdR=}atP%0MslEL{K!ky(c!3FvgY_+*w>?fJF0QT?#7n@? zFDytFgbyUSUQHfSJ~uwVvwL0^l1k7ugQluV3IfK<3XJ~ToJ)46pJZHg?IkcL<#q`O z{&sV{mXOu40-GMbzHea1dy^*Wu1BeYGV2?h9ZnPk-r{E2gEBLMl<{x?L8>NOCtXt; z8W>i?cyr-$S9z*kl8tG!PxDLa(XXy9icg8Ii>B6 zHC{-p=I4TpBgBs}H|MmQTEdk$BRfKCN zaERcHwgQp_K)F=3PK=P3q?a^*b@d=*O&Q>z*nesTq7%t7JM3Ia6xib?Vvt8|xQ!DP$=)HjcmKxH~6J!Gcn!xseTR0j_dbwTT zn0^CQkojn?_lxf-bqe;P?CNJ%aGjHHYM}WFy$M$mkg(*8b`YQQ!C0^cHSYrh1GSMK=jP{^ zsZGEmxT(@#se#mdY{xI)SG>H6 zWlXEe$|U2VowS4l$dC-c2PhmExeBh7!1iL!$6`xy=X#xXg6K<29rDmRKXXuicNJ}v zq5)0qEpBRpm<+>HMVPg7yNYu6;zLAg^b5P?>rVLw@QK>Yx}|gT3CGADfDGbg9ny+{ zhWHs?)Q+3!5PJx6j=}Jp@uAa%Obxr6`09X-lbm$ziTY8T@gAiCM*^Wy5QM@D*GcB{ zYg=`k{Jgxsa=-0vZoj6Dk7tFPI5L2#?Z#0%l%R3frI4E<)k~2#V_v-Aul!_=l}IuE zdS=;z-eys>o1Hu!xCS9X2EqW?RFD{Ea^Q|u4~lu32f{arml)aZ3|PScl?s=~4<{e3 zoZmZppAD!hMyScid;mh2#1$Zgk>-zCrnZj03w{&SEkIV&<&2jc1wJQ{h5cpz}LBfvUEM zQYuqjf_>2;cdM#CH~VvBGwx#(iHYMRq$u$TX-}01jU6TFP|S$!nf6iy@r0unk2VM5 z7E$IkGw^_SJT<0Gr7;1^MyO8zJsW^X(m!YO1o*h8Yo@nLOG_op9ahG1Gg+&9;&>L+ zmk@?hOa=Lxpp8HH=x1(j_m$;dMY)EpxxMuva?%NZ=kEkzTKXkl_k*dkZJW*qF)`$^;}#(lsj;Ip6CPZ z;QytMMu6l&1W`Mioo#bx*Gn;QZ4ClwmQ)b5Ym&^dT~6`$F7fI>$H(eQ&D#9X=znYH zI-{CQ*08G!2#SaW5JmK=6loTSh?E7^Mips+&`pAYL_riHfy9*%6c!su2?C-*Gzg)$ zfH6T3j6nhEHJ~6ufY6)aPIC9xo_p`vbN2qb=4Z~Anaq4M@B6&Z^UN^0T<_!y0;luF?nbaek7TL{1-(0@}g}tg4w?;1%TSN_V)<@KYg6~$Wl0PnWo!$SLvG#WjY)K zWaG?ndaMXZRxuc!2Kr$A@Pbd6+-D^pVzP8M#BmrRpK|35kbo3pThGpjM=-Nare_$b z`>-YMbe+^(?gVNa^%sbSb_U0Su!lQ^v0W8L9FLEu%_nsO@1rfqS`jzG7xBG^G z#X~|uBKFiiyy7O%Yjz9SN@Zu0ps3Gmj4dP3t+vNaHliB}HC#kV2laTs@GfqIr}mp-U&En~DaDO%T=UWnX&`)owBUk4@jb;-*F ztu)CR)-Dg<#t?q8XYis`rv!Mmq9An zpn5c*IDp8^FFXGNimh{+TovtZ+UKWxp`OLA)|LobZtm`Dya4^NVEW->9xt%mm21%PzTnjsh$%tGad?2=$Bf52~ zf7QRV3zf}LtyIxi9;ZcKy9E|Nnyp4abyZVLjT|v_imd=}#C(+I*kdxJ-o0WB@CXn* z*%ccSl1K|WqyXPpNQIU;Gn?3lk~)|!n`<+$=DpH=Fi1C|Y4U8+V!AZFI*AB_pT==Mi3&vP#DP2y+B}gB@*y=z{Uizi zuP$EJV0;5d2IbB-l&$+E{#{WQFSOR|0UfEC@_@!#PU8mQI)u>{G+IW_xHOq?ULias#-eeTK43vZyQ*GQeIjfM*(xa?8F_ z6sZG_-@WRH4?=yO8OR@_PWoqbWcxIaMYG>(m%5d)gO*Yft!+jl6SQ@-$}X3%#VqaZ z>(Z3DGmTU`_cC@<0Nj#NaKJy90sJKajDDd4J8BDss>lv?5uvHSj1rb?k`m@l!I zL2~PD#Kib`w8r&AU&8p%lK$^Vu|C}o7C70;+KNxZZwqX@elPBSg;I?k_^y4vl|Ue* z8+pEPXbmfOQ*0l8Pt+SG2oRUJR)Jp^i=dEeeyB-umK#5(86qoIF53`)2C0{F4>kjmkm;dsnXBUpkaAw*56QV(+=kyfQjv2_HP-5&*Y0W)@OColLLzRZ1B`k0da zQs2aUTk_G8L}9{!fWVuFI{(O_e`(2pWPRXGytHNbr zh(bUGZ-{{@FV8fS)@2AXm27)9Mz#^)A`Q)}`4*z>p|zQRv1{k4e!KI}XQn@xFdQ!Q zp8gE1ES&%DMih10YQ%De!-v|L@&HA|d{k68XU5$FUhfs*5Ik|TS zQ0oCZIYqnD*>q1kS2f&5nmcuEP7!a;Z3Kk$OlVcAr>EN-QQWsQz6yA;ebqzDMmCI} z5a!l%1?d}^OSv@KplSEo+5E)xM~~h_)WfIVV4aGmBQiqlPBG z_U0-Wq&zXk*agwrVuJRppnwIZD&@YgEx@`hukTnG0auUOwE?Ot9-4`rukW?i+-dM& z?KmK&=4C4~Ge6qG9KZiVFMcHXa<%0Nhiz!}l(6qhdb^)lBZZBW+=tG|A`4wy*)Hj@ z)y^3u-eaukMaUKRF90R(MlT%eR*rXfTP!Mlj(HqeT5UujQFuNpC4_x<5B6Qu1xwk` z_{0g^3F+1^~KVlK_#a~F^FH*HzDt9JBq%0@0}rm%j(?T&{C++P+FPA(B{fttueR#-^oU3*h- z7a)8KO7k3DsFb9;8+ zH{h>0X=&LqI@@?LUTT-JvdMzh1Q2ENHkCSMXNn~OABd%VZ`MUk-nG2^f*6fN?X8>4 zO9j-=ocr!ujTAPf-HRrn5{BC25+jX+RES85lDN~zRRdHpI#_ElqA8NA^Q6Tuhp}v` zm^|hK6ZYN9075$sxBT5XBqRiswtGWkV&DwlZA5?IRNGExFl0+XlASnrSJo4 z8Nj7M;w&T^FKXA^Qh%s%C#pc*Q7!q7xnpWM z0A~a2Oi82@uq>AzTyd+@J+?oAGk0w0Za!OmVUvV9sp|{{bVJQ#I#Hm?q{@0Mth;_r@DpO|aQlq_6=|ELonf7E zBB=co>`An1g#%w(qS4H62VUzrgsx#`T0JFy38_h^7NgV=U(pp|hZH{R^tFR-UnxM8 zeTKFZ$1?8AkdiE;5Z{yY04<0O2#qS){;9-|$S`SYk|;t>uN)P&kA8fY)PHYhA<-(uO0VaI3a?E%f6B-(-NZxj| zJ7AG@swjgBFkb5WP0vONWQ?C7w1SP2CLF3qaMII>wTdpG1Z7~nq0xP}g)sHCOb+(2y6|;Qrmet5 zjPIIvf1JzuGc9@J--+eIpFVZ~9I;B04Fw2WwZgFS*FOC{OJ3`5R5Dg(U+-B{d6Xa+ zj5P&eSDGKUSJZ%7+@E#zzoQlloBS^$_`}`tpNIJW{lH&)qd%VdF#|tl;KvO7n1TQG w4D_$&OGF7J#x*wuj1qkj;r#defUe!RM!Wu0@#`91p0KsECvASsHS@apPZ2@2Q2+n{ literal 0 HcmV?d00001 diff --git a/Processing/Misc/UrbanAutonomous/data/operationWindow.jpg b/Processing/Misc/UrbanAutonomous/data/operationWindowOLD.jpg similarity index 100% rename from Processing/Misc/UrbanAutonomous/data/operationWindow.jpg rename to Processing/Misc/UrbanAutonomous/data/operationWindowOLD.jpg From 23acd57d5b0919b914dd919b1ac48da80a8069fd Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Tue, 12 Apr 2016 06:41:41 -0400 Subject: [PATCH 10/14] bug fix --- .../Misc/UrbanAutonomous/OperationWindow.java | 4 +++- .../build-tmp/OperationWindow.class | Bin 991 -> 1015 bytes .../build-tmp/source/OperationWindow.java | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Processing/Misc/UrbanAutonomous/OperationWindow.java b/Processing/Misc/UrbanAutonomous/OperationWindow.java index 00ed108..8190d97 100644 --- a/Processing/Misc/UrbanAutonomous/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/OperationWindow.java @@ -26,7 +26,9 @@ public void mousePressed() { } //Time else if (mouseY >350 && mouseY<400) { - UrbanAutonomous.simParam.currentTime=(mouseX-350)*10 ; + if (mouseX >350 && mouseX <350+1440) { + UrbanAutonomous.simParam.currentTime=(mouseX-350)*10 ; + } } } } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/OperationWindow.class b/Processing/Misc/UrbanAutonomous/build-tmp/OperationWindow.class index 6f6228a28105e3b11117db869a9061321e679665..0ea5ae8e9a7fd40062f9b534715e62874ca6c9ef 100644 GIT binary patch delta 119 zcmcc5{+)e;3Nz;k24)6E1_p-a$-2z4-050d7?cE=gBCHwP7Y;OP_qH@350 && mouseY<400) { - UrbanAutonomous.simParam.currentTime=(mouseX-350)*10 ; + if (mouseX >350 && mouseX <350+1440) { + UrbanAutonomous.simParam.currentTime=(mouseX-350)*10 ; + } } } } From 5c188096855837fe28588e5f61936a21f49d63b1 Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Tue, 12 Apr 2016 06:49:01 -0400 Subject: [PATCH 11/14] fleetLegendSize based on capacity of vehicle --- Processing/Misc/UrbanAutonomous/Disp.java | 2 +- .../Misc/UrbanAutonomous/build-tmp/Disp.class | Bin 5524 -> 5578 bytes .../build-tmp/source/Disp.java | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Processing/Misc/UrbanAutonomous/Disp.java b/Processing/Misc/UrbanAutonomous/Disp.java index 7499279..9d2afad 100644 --- a/Processing/Misc/UrbanAutonomous/Disp.java +++ b/Processing/Misc/UrbanAutonomous/Disp.java @@ -98,7 +98,7 @@ void showVehicle() { for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { p.ellipseMode(PConstants.CENTER); p.fill(UrbanAutonomous.vehicleColor); - p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 15, 15); + p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 5*UrbanAutonomous.simParam.capacityOfVehicle, 5*UrbanAutonomous.simParam.capacityOfVehicle); } } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/Disp.class b/Processing/Misc/UrbanAutonomous/build-tmp/Disp.class index 6637ef46c80b57875101fcb1e05fb483125ac2a3..4214c46873a9450d9a7bab51bf2e5107d1d332d7 100644 GIT binary patch delta 1352 zcmbVKU2Icj7=GS%?K!9Wpj+E*u#UM6m@rUABZ)!0z$t-bV-m(f*v06|+1gN7EFFOx z7K!Nv7ue@6H>Q9|2`kWTGO144LoO(~Xjt5KT_b`}4g& z&+~lW!6oOGc+NdKH3}d^i-$cYwMGNY_(tGcY$lXP!aKr|SZYsuZ>JfJMdGG`LeL-jfmo)rB z@bFP#poU)wu9ie1xy`_BoKe5?2FCG+z+L<)$*7W}dX4+OYW+)I)#vKtm=t)JKdX7= zk-!vz5J)9b;do1;zt7y6iY5A6&0S`k;OJV%gvcStsR)%u29im$Kh+U?gQ+x=OORW3 z8!xsSf;{M8&`C3rYD;Y6({U1lX3=a;MhALUCzIhl1b0^}V}Hq@GMv$r? zeLah3|Y9v>(*z`^xOyz5>DfGTayKE7FU*9_^r$nO|$)7 z*&KGiO~hsS-CyM=+_7-)zxH<*4|woD2F&!cGJh+5h{^)-U^~0PlT;%2m5-1nSNWbV zX6^sC%Co+`gZEf`2TONM(RSys!M3D3S7or@)?!l*pWEJbi%Nqbi@dCezBR2xuoFHz z;U_ddQ;x@Hw>=F``C;RuooZV z5Zl9e7a4q%e*^{`4^csrNHeXKn9XmYl)Xc6<%w>x3ED)nG>;)Fsw<`mVoVXNdrZ(y z)E5&hXNJ?LFvh69ltY1r!4@3F8VsQWpX8Bf3P}|$=j|`g;5foKh%>P#aWoW3g*z54 wECRq`WAXZFebpm=@VGQkh@YsHofY--R^l^8FpSrcg~>LG6Ciq)Q8;MPKh5}tSpWb4 delta 1340 zcmbVKNo-SB6g}6|_jexHF^)rGNCRaMVMt_HAP10AiWF52ZJ1QSqGb5QrU4@-AR-~M zL5M}m<^|ExBFX|R)J4I3EQLj&QY%HU?4p#Z(1tP0lrUrN^LK(PRVuLg_rCkjIrrTA z-l^$5(>$oA;x+jGPaaO}Ef`@;tFkC5@KOhD58u3gi(~M1qU4 zjm>q*WK$QxwJOT}YIPcoevP~YJ0I1F?NyOq&={H3D_52X3gUBupP7r+tYOXgCL?OB zZ|jVC5Tvn!$`B(sR5wKo2^y#HUdHD~SeR%}By|j`=?5+ON4jF_j$a| z;4U~}=WAM$M#{vG8SHFGVS)U`JICig<3E#uF{2kh5cXtG$e^#Hq8`m?L>oS4PBCm* zjDlSQLBlQ}BA5BXIiyn@<@eK}OU+$^su)RPDJ;yd4DuU7cVv0EH;n%0eTxyMH zjhUu$wx|Z3Jv<%;)Oh2EU8$#|3KfOpd5vLD7+_ER@^|)BhlAYz0G8lT&WEOalu|YK zoIm1XFS{VF82@(hLBXPM-=v8J?fLj&Ve=d{_adJZ0(~a Date: Tue, 12 Apr 2016 11:48:14 -0400 Subject: [PATCH 12/14] sqrt vehicle size/ change start time --- Processing/Misc/UrbanAutonomous/Disp.java | 4 +++- .../Misc/UrbanAutonomous/OperationWindow.java | 1 + .../Misc/UrbanAutonomous/build-tmp/Disp.class | Bin 5578 -> 5627 bytes .../build-tmp/OperationWindow.class | Bin 1015 -> 1028 bytes .../build-tmp/source/Disp.java | 4 +++- .../build-tmp/source/OperationWindow.java | 1 + 6 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Processing/Misc/UrbanAutonomous/Disp.java b/Processing/Misc/UrbanAutonomous/Disp.java index 9d2afad..36437dd 100644 --- a/Processing/Misc/UrbanAutonomous/Disp.java +++ b/Processing/Misc/UrbanAutonomous/Disp.java @@ -98,7 +98,9 @@ void showVehicle() { for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { p.ellipseMode(PConstants.CENTER); p.fill(UrbanAutonomous.vehicleColor); - p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 5*UrbanAutonomous.simParam.capacityOfVehicle, 5*UrbanAutonomous.simParam.capacityOfVehicle); + int vSize= (int)java.lang.Math.sqrt(UrbanAutonomous.simParam.capacityOfVehicle*100) ; + //p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 5*UrbanAutonomous.simParam.capacityOfVehicle, 5*UrbanAutonomous.simParam.capacityOfVehicle); + p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, vSize,vSize); } } diff --git a/Processing/Misc/UrbanAutonomous/OperationWindow.java b/Processing/Misc/UrbanAutonomous/OperationWindow.java index 8190d97..e2d7c2c 100644 --- a/Processing/Misc/UrbanAutonomous/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/OperationWindow.java @@ -22,6 +22,7 @@ public void mousePressed() { UrbanAutonomous.simParam.capacityOfVehicle=(mouseX-350)/10; UrbanAutonomous.simParam.numberOfVehicle=1; UrbanAutonomous.vehicleStack.vehicleGen(); + UrbanAutonomous.simParam.currentTime=4200; } } //Time diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/Disp.class b/Processing/Misc/UrbanAutonomous/build-tmp/Disp.class index 4214c46873a9450d9a7bab51bf2e5107d1d332d7..2aee3a38a7c48ff2677ad4b1132eec6f3f4d3b83 100644 GIT binary patch delta 1657 zcmbVMYfPJE6n;+W?fdpIx>7*aG1wg2S`d)MWWh}{!DS?LU_@PJvhYy~Eq0W31!=r= z8tse@O#G%1Hk~uks*B3yTciG1<_`_oelGETMW<8Qyddh_1kc+RA^h-`H1D~5&pGFL z&pB^Tm0c>6PtCk>0zfrYj>s=tVpVuo!F$+2Smsr`Rc{~?ZEU~Q=MQ*;J{ce2BMUwx zEbUZ#)ykmS)lunDBYp)R;}e2$@1Agk#rir|orGbGi{rF7CKP;ue$Kf&)EnsP*cR9u z35BB#EF`#bR>4>Jnvm@cX|mOA{zk#K_)e>_F3&%Y?=84Mux{&Vy*Z+K?@;gqe$+ax zYpSO(VZqM?nLlL+TJQ_OR2vF~+ayej`qQHRdHk;65-w{etsBy~g>jS|eaH*mdcCCbORg$f8+YzphNaZ5MAT_C4IE3{duWamnS zip2oz9DZYaJ0}kG`Wk#)9TC5bd|IW@YWTU$qNE61qfn{9=P*8VkJ?Z$6qYb0S}-MA z;3k(sZY?U8m}i7@X6%TZV~V{56O254brcC5$C4QEB;YB39R~>~G2GzRkz-EcCLu?0 zCW$vk;nMMrt}){*b^JLOhFN4I%K~EfY(#Z%@E|RR%om$zaQM{K`z@EPoR+iM|Jj7?z@Y zCY9l$jz9iud~87i!v9F{SG-H7EYWPT*c?G;BdgBiB+vJ87k3cY&0P(l5Z$;Md*DHR z7)@;KWTzKB2;xpWgg!irD4t{e72J(++=B_+i?gg>z&^6#K3=H%d588<1sEhV2l-n9N3~s!4Y4bkg1E{x za~Hs*xWL-^3#1+E7F}SjC?-!FoqcRTvm)=otY zH4zpCe*o7Yzl?y)#u$*6XA}Hm>K~eA`_sgqh&tV-!Wf9+1Z1AuvUMzKLh|zNIp>~x z?&o~(eeY6rPqp52<%2E&eyU39hwU{-(e1!d^g1vHUkQATRfM8Yuq_yBiEXHVWM$ZB z2}Qyx<%GbuvPdhleJAieevosu+B<&~_zC?4&1he9e=HbUOVF1uxoXdMU=Y99@iWhl z#RPuEDY;Xd=^w%gJI-)EPhH)`jE$g`LIg~HRCJ#C8s&@#|(a60-!=YH9wV7uJNeH@uZp;c$7mWrt5Nu6Kf%y({ zqT5bI1S`AB>&>fc103*?M^K5Z*30vz2%0MEb+5-OXc`Pco+_?VZWc6M#`O~CkkVmD z>ENRof@aE2z1%jUf+NRz^}_s;PS{}O6J4D`!o<62yb?%Yxjb7qt;uJiu-e4uPTkN} zcd+$E*3wd_GV!I+F>a(0o_!qq342D9NiJrAo8M(z8d!r;gfJb=s6rSk*?$<1%7}9c zEs>j@e)>lCxXS3H?0411QM((Tq|j$#!0I<~nrT)f;Jf`eUL$;j;ebL);pA)+=a{8~ z$KTYL##5V!I4y(lS*F5y6MtUk`uH^kE?$3u+j<_h*bgB zvQq0X73(nCJMat|Dk-)8R|ub+QLv<8R{hj@G>)PWu`66v<)$A zXM!E_L3fZe`Jvkr?=z{u>o=(|dpnf)*?=n>aFd%Kz9N~!qvA9^&K~1f-hVC3=vT@` z@{Nv(cACogw7uDlx)vN5eJrPI4GOr0ozU<)oY(~qcJtlagB93|RoI7(c!Ov6ada0F zcvHSwJTHC|6ImA|aK{)H22?-gxqh;NTPF2027!UD1EZhj7%F&o;4OY1f{PEX6mMf8 z@3x4?#q2lY9o)wmc33W>lw_T!GF~x36`VJza>C~9&YHCKIO)Y}Q`w!Is< z+9n27sBnq^SI$-jZJ+?lRtAGj4943S%z+$1fsCyTHj|5)-JG--xPV5B0HG*@27?%b zC4)GF1A_#E8-pZ65Q8j38iO1|6@xrOH-i#`Jy0b(1M_bNe z>?Q_PsBnq^SI$-jZJ+?lRtAGj4943S%qQ0{yVqhvObm_ySq>b< diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java index 9d2afad..36437dd 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/Disp.java @@ -98,7 +98,9 @@ void showVehicle() { for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { p.ellipseMode(PConstants.CENTER); p.fill(UrbanAutonomous.vehicleColor); - p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 5*UrbanAutonomous.simParam.capacityOfVehicle, 5*UrbanAutonomous.simParam.capacityOfVehicle); + int vSize= (int)java.lang.Math.sqrt(UrbanAutonomous.simParam.capacityOfVehicle*100) ; + //p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, 5*UrbanAutonomous.simParam.capacityOfVehicle, 5*UrbanAutonomous.simParam.capacityOfVehicle); + p.ellipse(vehicle.x * 10 + 5, vehicle.y * 10 + 5, vSize,vSize); } } diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java index 8190d97..e2d7c2c 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationWindow.java @@ -22,6 +22,7 @@ public void mousePressed() { UrbanAutonomous.simParam.capacityOfVehicle=(mouseX-350)/10; UrbanAutonomous.simParam.numberOfVehicle=1; UrbanAutonomous.vehicleStack.vehicleGen(); + UrbanAutonomous.simParam.currentTime=4200; } } //Time From 1c2cf1927f8bcb6bb191234092815ec42929d6df Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Wed, 13 Apr 2016 08:10:58 -0400 Subject: [PATCH 13/14] usage rate view only --- .../Misc/UrbanAutonomous/DemandStack.java | 30 ++++++++++++++++++ .../Misc/UrbanAutonomous/OperationDisp.java | 8 ++++- Processing/Misc/UrbanAutonomous/SimParam.java | 8 ++++- .../build-tmp/DemandStack.class | Bin 6697 -> 6956 bytes .../build-tmp/OperationDisp.class | Bin 6799 -> 6910 bytes .../UrbanAutonomous/build-tmp/SimParam.class | Bin 1876 -> 1955 bytes .../build-tmp/source/DemandStack.java | 30 ++++++++++++++++++ .../build-tmp/source/OperationDisp.java | 8 ++++- .../build-tmp/source/SimParam.java | 8 ++++- .../UrbanAutonomous/data/operationWindow.png | Bin 25978 -> 28646 bytes .../data/operationWindowbak.png | Bin 0 -> 25978 bytes 11 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 Processing/Misc/UrbanAutonomous/data/operationWindowbak.png diff --git a/Processing/Misc/UrbanAutonomous/DemandStack.java b/Processing/Misc/UrbanAutonomous/DemandStack.java index bf3b4dd..1b2a577 100644 --- a/Processing/Misc/UrbanAutonomous/DemandStack.java +++ b/Processing/Misc/UrbanAutonomous/DemandStack.java @@ -188,6 +188,36 @@ boolean unallocatedHubListIsNotEmpty() { } return result; } + //usage rate + public int usageRateCal(){ + int result=10; + int totalVehicle=UrbanAutonomous.simParam.numberOfVehicle; + int usingVehicle=0; + for (Vehicle vehicle : UrbanAutonomous.vehicleStack.vehicleList) { + if(vehicle.departureList.size()==0&&vehicle.arrivalList.size()==0) + ; + else{ + usingVehicle++; + } + } + result = 100* usingVehicle/totalVehicle; + + if(result==0) + result=100; + + if(result<80){ + /* + if(UrbanAutonomous.simParam.numberOfVehicle>1){ + //UrbanAutonomous.vehicleStack.vehicleList.remove(UrbanAutonomous.vehicleStack.vehicleList.size()-1); + UrbanAutonomous.simParam.numberOfVehicle--; + UrbanAutonomous.vehicleStack.vehicleGen(); + } + */ + } + + return result; + + } // DemandAllocation except hub public void demandAllocation() { diff --git a/Processing/Misc/UrbanAutonomous/OperationDisp.java b/Processing/Misc/UrbanAutonomous/OperationDisp.java index c390c85..eb6b146 100644 --- a/Processing/Misc/UrbanAutonomous/OperationDisp.java +++ b/Processing/Misc/UrbanAutonomous/OperationDisp.java @@ -43,11 +43,17 @@ public void show() { //Optimal Fleet Size p.fill(0,104,55); p.rect(350, 700, UrbanAutonomous.simParam.numberOfVehicle * UrbanAutonomous.simParam.capacityOfVehicle, 50); - //Optimal Fleet Size + //Optimal Fleet Size text p.fill(255,255,255); String fleetSizeLabel = Integer.toString(UrbanAutonomous.simParam.capacityOfVehicle*UrbanAutonomous.simParam.numberOfVehicle); UrbanAutonomous.opw.text(fleetSizeLabel, 360, 745); + //usage rate text + p.fill(255,255,255); + String usageLabel = Integer.toString(UrbanAutonomous.simParam.usagerate); + usageLabel += "%"; + UrbanAutonomous.opw.text(usageLabel, 360, 895); + /* diff --git a/Processing/Misc/UrbanAutonomous/SimParam.java b/Processing/Misc/UrbanAutonomous/SimParam.java index 58f96f7..70345be 100644 --- a/Processing/Misc/UrbanAutonomous/SimParam.java +++ b/Processing/Misc/UrbanAutonomous/SimParam.java @@ -27,7 +27,10 @@ public class SimParam { //Map public int mapType;// 0:urban,1:Rural,2:custom + public int usagerate; + public SimParam() { + usagerate=100; maxX =18; maxY =22; hubEnable=false; @@ -58,11 +61,14 @@ public void init(){ public void update() { currentTime++; + usagerate=UrbanAutonomous.demandStack.usageRateCal(); if (currentTime >= 14400) currentTime = 0; // unallocatedDemandSizeHistory - if (currentTime % 20 == 0) + if (currentTime % 20 == 0){ UrbanAutonomous.demandStack.unallocatedDemandSizeHistory[currentTime / 20] = UrbanAutonomous.demandStack.unallocatedDepartureList.size(); + //usagerate=UrbanAutonomous.demandStack.usageRateCal(); + } currentTimeZone = currentTime / 600;// 600step = 1hour if (!demandSizeCustom) currentDemandSize = demandSizeArray[currentTimeZone]; diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class index 219333136e63415741734b32dca809db69c623a6..9cc331272d6b0c2829d58286fbbf801eb52459bd 100644 GIT binary patch delta 2074 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 U)TF^|nW@waD7Bebm#8iO59&UTtpET3 diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class b/Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class index 5b22416a88af189db59a1c078793e5837c584f12..9677905fac846fc7273ac0636436ae468fc3003e 100644 GIT binary patch delta 1060 zcmYL|OH))=6otRr-PjM0auI@*25rFy9EBDX1EKBgbW*X~qCrL4qSK0$MQ0Q(77Z)*2%46LXBE3Fc}}4$x}eCg)BN4I!nNq4qSa<6 z6?-kZqUf+_DyYS>oq4`V^0h*T4+lCAsCG?)Zzv zg_3`(<}LiJxJ{=+X3cU}{c@T-cNO=T4HEHeV~!t^eDAPx(qHz|@9Cp-K3tr97FvlasB1IV}@?}QYOJ2z#-qU+6Eoqsp zMDRS`m71fhSYb8zH9pi+p_ZiT(7NQUdAWM6SjtUQD&Et4v078qO~XXB_{3L%;s+-VmbI2v_ z4u)Kgn5!Eyg2Oe5_hr!_OM*kP16|^Nw=jog_#?s|m3RzI4>@`{Eog+}T;K$g^f67p z7@ZT_PVzeg{2^QaC#U#JD*t8((Lg-2FK3)s^zx2Pu5a`0CU>^EzsZl=%$pbF{vWAb zG=gDKZ$uXKtZeS6EZ{l0?f=*9b)+l!dUlIk;(?JUYWdJ8Dpbqx_{#>VsI@t}ZL90- zlaei#?70*jmbdxkhK_E;?v;$(TlB8u8fr{_ef=W0nJpH{r9~tdlQ=Hl<%D>8Q3Nw$ fT$VV+O{uyouP$(%wN@!@BHo=nD6>C~dOZ0DSMRqg delta 961 zcmYL|%X17-6vlr&J+DkI>BvI_$;d<=H}8-a5qS~u3PMZ}@)`^gAqiDBv$yRPRa7be zfTYr)l(JQ2WnpijtgNh9DX05Vs_UHo?sx9#zUMpVzAX5>HSzKH+xI{_%WDbO%0+v# zi`kVv3%jm`-hos7tZMpdN)X=%6A&zW=*J3df+siXsyoP;577NKt0c z5%+N@86D+BjN|UBP_ccIQ|^aQRofV6W1O*26PcUYxrNO5%FNtt#W{9aBpw)UB(s>u zDCZRym~hMOWGc<27?T$H!^=0cE+vM~*VLP|AKh%J%8yGFXf(6F8|tK&JYX1;`%1H z#&nPoN-y|wZ&33T$A9;V>1L7JKT#+Us79^<^olr#1){ + //UrbanAutonomous.vehicleStack.vehicleList.remove(UrbanAutonomous.vehicleStack.vehicleList.size()-1); + UrbanAutonomous.simParam.numberOfVehicle--; + UrbanAutonomous.vehicleStack.vehicleGen(); + } + */ + } + + return result; + + } // DemandAllocation except hub public void demandAllocation() { diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java index c390c85..eb6b146 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java @@ -43,11 +43,17 @@ public void show() { //Optimal Fleet Size p.fill(0,104,55); p.rect(350, 700, UrbanAutonomous.simParam.numberOfVehicle * UrbanAutonomous.simParam.capacityOfVehicle, 50); - //Optimal Fleet Size + //Optimal Fleet Size text p.fill(255,255,255); String fleetSizeLabel = Integer.toString(UrbanAutonomous.simParam.capacityOfVehicle*UrbanAutonomous.simParam.numberOfVehicle); UrbanAutonomous.opw.text(fleetSizeLabel, 360, 745); + //usage rate text + p.fill(255,255,255); + String usageLabel = Integer.toString(UrbanAutonomous.simParam.usagerate); + usageLabel += "%"; + UrbanAutonomous.opw.text(usageLabel, 360, 895); + /* diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java index 58f96f7..70345be 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java @@ -27,7 +27,10 @@ public class SimParam { //Map public int mapType;// 0:urban,1:Rural,2:custom + public int usagerate; + public SimParam() { + usagerate=100; maxX =18; maxY =22; hubEnable=false; @@ -58,11 +61,14 @@ public void init(){ public void update() { currentTime++; + usagerate=UrbanAutonomous.demandStack.usageRateCal(); if (currentTime >= 14400) currentTime = 0; // unallocatedDemandSizeHistory - if (currentTime % 20 == 0) + if (currentTime % 20 == 0){ UrbanAutonomous.demandStack.unallocatedDemandSizeHistory[currentTime / 20] = UrbanAutonomous.demandStack.unallocatedDepartureList.size(); + //usagerate=UrbanAutonomous.demandStack.usageRateCal(); + } currentTimeZone = currentTime / 600;// 600step = 1hour if (!demandSizeCustom) currentDemandSize = demandSizeArray[currentTimeZone]; diff --git a/Processing/Misc/UrbanAutonomous/data/operationWindow.png b/Processing/Misc/UrbanAutonomous/data/operationWindow.png index 22f38ea986bb0ef6410ad9592eaf46787ffcf576..0ca385449495548f1b0f48e41581522d45fe20f3 100644 GIT binary patch delta 10504 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 diff --git a/Processing/Misc/UrbanAutonomous/data/operationWindowbak.png b/Processing/Misc/UrbanAutonomous/data/operationWindowbak.png new file mode 100644 index 0000000000000000000000000000000000000000..22f38ea986bb0ef6410ad9592eaf46787ffcf576 GIT binary patch literal 25978 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 literal 0 HcmV?d00001 From 83a4111fba02ceb1600dbe07f21ca8b89f509829 Mon Sep 17 00:00:00 2001 From: Yasutsugu Nagatomi Date: Wed, 13 Apr 2016 09:02:57 -0400 Subject: [PATCH 14/14] fix utilization rate decrease (quick temporary fix) --- .../Misc/UrbanAutonomous/DemandStack.java | 12 ++++++++---- .../Misc/UrbanAutonomous/OperationDisp.java | 2 +- Processing/Misc/UrbanAutonomous/SimParam.java | 7 ++++--- .../Misc/UrbanAutonomous/UrbanAutonomous.pde | 2 ++ .../build-tmp/DemandStack.class | Bin 6956 -> 7047 bytes .../build-tmp/OperationDisp.class | Bin 6910 -> 6914 bytes .../UrbanAutonomous/build-tmp/SimParam.class | Bin 1955 -> 1903 bytes .../build-tmp/UrbanAutonomous$PFrameI.class | Bin 979 -> 979 bytes .../UrbanAutonomous$projApplet.class | Bin 2416 -> 2416 bytes .../build-tmp/UrbanAutonomous.class | Bin 11430 -> 11499 bytes .../build-tmp/source/DemandStack.java | 12 ++++++++---- .../build-tmp/source/OperationDisp.java | 2 +- .../build-tmp/source/SimParam.java | 7 ++++--- .../build-tmp/source/UrbanAutonomous.java | 2 ++ 14 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Processing/Misc/UrbanAutonomous/DemandStack.java b/Processing/Misc/UrbanAutonomous/DemandStack.java index 1b2a577..2fb7cf4 100644 --- a/Processing/Misc/UrbanAutonomous/DemandStack.java +++ b/Processing/Misc/UrbanAutonomous/DemandStack.java @@ -205,14 +205,18 @@ public int usageRateCal(){ if(result==0) result=100; - if(result<80){ - /* + if(result<50){ if(UrbanAutonomous.simParam.numberOfVehicle>1){ //UrbanAutonomous.vehicleStack.vehicleList.remove(UrbanAutonomous.vehicleStack.vehicleList.size()-1); - UrbanAutonomous.simParam.numberOfVehicle--; + int tmp=UrbanAutonomous.simParam.numberOfVehicle/3; + if(tmp>0) + UrbanAutonomous.simParam.numberOfVehicle=tmp; + else{ + UrbanAutonomous.simParam.numberOfVehicle=1; + } + UrbanAutonomous.vehicleStack.vehicleGen(); } - */ } return result; diff --git a/Processing/Misc/UrbanAutonomous/OperationDisp.java b/Processing/Misc/UrbanAutonomous/OperationDisp.java index eb6b146..a75c5f7 100644 --- a/Processing/Misc/UrbanAutonomous/OperationDisp.java +++ b/Processing/Misc/UrbanAutonomous/OperationDisp.java @@ -38,7 +38,7 @@ public void show() { //Demand p.fill(0,104,55); for(int i=0;i<24;i++){ - p.rect(350+60*i, 500-UrbanAutonomous.simParam.demandSizeArray[i], 60,UrbanAutonomous.simParam.demandSizeArray[i]); + p.rect(350+60*i, 500-UrbanAutonomous.simParam.demandSizeArray[i]*5, 60,UrbanAutonomous.simParam.demandSizeArray[i]*5); } //Optimal Fleet Size p.fill(0,104,55); diff --git a/Processing/Misc/UrbanAutonomous/SimParam.java b/Processing/Misc/UrbanAutonomous/SimParam.java index 70345be..7c4abde 100644 --- a/Processing/Misc/UrbanAutonomous/SimParam.java +++ b/Processing/Misc/UrbanAutonomous/SimParam.java @@ -41,11 +41,13 @@ public SimParam() { capacityOfVehicle = 4; numberOfVehicle = 1; currentDemandSize = 0; - demandInterval = 10; + //demandInterval = 10; + demandInterval = 1; vehicleHistorySize = 30; currentTotalCongestionLevel = 0; totalCongestionLevel = new int[720]; - demandSizeArray = new int[] { 5, 5, 5, 5, 5, 10, 20, 50, 50, 20, 10, 10, 20, 10, 20, 30, 50, 50, 50, 30, 20, 10, 10, 10 }; + //demandSizeArray = new int[] { 5, 5, 5, 5, 5, 10, 20, 50, 50, 20, 10, 10, 20, 10, 20, 30, 50, 50, 50, 30, 20, 10, 10, 10 }; + demandSizeArray = new int[] { 1, 1, 1, 1, 1, 2, 4, 10, 10, 4, 2, 2, 4, 2, 4, 6, 10, 10, 10, 6, 4, 2, 2, 2 }; demandLifetime = 10; hubEffectiveLength = 15; hubDedicatedVehicleCapacity = 50; @@ -61,7 +63,6 @@ public void init(){ public void update() { currentTime++; - usagerate=UrbanAutonomous.demandStack.usageRateCal(); if (currentTime >= 14400) currentTime = 0; // unallocatedDemandSizeHistory diff --git a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde index f221a14..ab1c37f 100644 --- a/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde +++ b/Processing/Misc/UrbanAutonomous/UrbanAutonomous.pde @@ -166,6 +166,8 @@ public static int brushNumber; demandStack.demandAllocation(); demandStack.demandHubAllocation(); vehicleStack.allVehicleMovement(); + simParam.usagerate=UrbanAutonomous.demandStack.usageRateCal(); + hubStack.hubVehicleA.move(); hubStack.hubPeripheralVehicleA.move(); hubStack.hubPeripheralVehicleB.move(); diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class b/Processing/Misc/UrbanAutonomous/build-tmp/DemandStack.class index 9cc331272d6b0c2829d58286fbbf801eb52459bd..9d8f28391bc16ab80845e91e20f274234024de53 100644 GIT binary patch delta 1461 zcmc(fO-xi*6vuxDAH&S}XcT5TGeBajVucywCvB>ld3}O`W?a{F}}13<%cF z*2eWh?$*t%jcYs%vMZ0f!W>mxb?doVT)z%3h)=(pER+(~+yW%JN%Bc}16g ztB>>vyc$kMy?lR;8^t{;kV9CXbrhH8q=Xqk<{Ef-mDeg>(+-vIQxT+?4`7DKl8@lLJ-24I$&txCSf;IcY z$P1B?+1hnka6?y;3gy${n(l~~WWg$)YptEBF+<)d-N6~9XQ;)JuR? z32F;M+JYi&L9w==#QYFkmUKp$@pC%(KTP<440yIZXOtQC96V`n^+L7xn%Y~W_7`I>MahivrJx`z$>lRAM(bgeqG%w9URoYL zA_yw7XhWiGDvF+Ztez^$_IkNcf_IQQIh&%K-SoAQq3xCaS+ ztL)nHx~hV3cx7dIB($>5Lq0cr+;qy_f%&(6+~Ka^s;RFi5Ryyg)K^UPaGw=Dc_8%A z-*)~ZACKuLq$#bay4tRcgc|G;yKZ@;rkz~tVH3}MJm;=+$vtw?OCPV=>F#i-+Kz;3 z?Ot5ujgJHPy`1NrkN5ZmZ-ZSEstnu3cHIfDXN}j(Q<6vlmN;9|OH-S4lti|EC(z5W z{MnwHSo${$m$S}a=t8*eT<|xQwKS5R9pmyTjx-aD(XzK~hjoUl!p^qZH=&cy{;@S_Z_H#fN3pKML zhJlwgvQ6ReZ}>?kdv!OkvdgXCB2T+&&+P_Y))*yM@eXmN8}Y&2z$%{Xn$hVoLEcz5 zaDw#&^-k+i44&ZK1faPX?*>-3v954;)(zZYJ_A3%DO zBz?$~z67No#gayuq*E_`HcJNkq(5h6fQB+Kerr;Y@9~7#MG?;U%s|vsAfeO-{)=Y( zLovFR+EhTTm{J?~k7jgakfj+6(F}%a2E#Oi;hMn+&0wTvFiJBRtr?8bZI4aJK=hXT zaf$*H-K{$rmwkrU&iX)B@3#j@wHC){byc0D)j1r1TrLtp%P?_OvI8&i(T diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class b/Processing/Misc/UrbanAutonomous/build-tmp/SimParam.class index 9677905fac846fc7273ac0636436ae468fc3003e..abf50250cfb41cc8fe14b22f963a567e94b30522 100644 GIT binary patch delta 406 zcmW-cyDmgg6o$WXZgY;o!MIFeNQ5xLxRY@wB(76P$PkIf{eCSpO111>;|a)&h{6MS z0+og+GH@S_q?|aZ(MNpY944A=&e*lGaejREJjl(oAPektMQ4jwo!U zGrsKz9N!a$1G;+P>8E^+h;9pXRj8{X-xm6Tvp8T$z|vqI)s`}CF4w5A(m93_zL!JA z?D@K8#%N)ZBy+T~C^=v0;Ehf`=;DiRe&|ux_CQ+-n?54+Q^Eih3`(9gs)TXLb%PP) zTTW!MB+bnb0F-|QLq~wwbrkG`# UC1yAgmxU3lsg~uZ(&TaW4<&#}(*OVf delta 450 zcmW-dxlTe+5QcxaE7vPr5Wz;&5Q5@@q9iIBa7#oBj0H-xki;vpxB_mCr4Mi_Yg-!) zP*_-5`363K7Frl9E79>3|Ce)S{y8&qKJ7OS?Ya5z2q1#u| z7HZIB9w}}$G?tcpmue~_k|dH$Qb?+yr80(WxQU7pA*!4<9?^KVg;VE|R(`hgv%~O_ z-{5{Hr;D?V$KBl1&ix)v!AoYIJY2`EDFE-U~5 delta 159 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 YQOo=^KO1){ //UrbanAutonomous.vehicleStack.vehicleList.remove(UrbanAutonomous.vehicleStack.vehicleList.size()-1); - UrbanAutonomous.simParam.numberOfVehicle--; + int tmp=UrbanAutonomous.simParam.numberOfVehicle/3; + if(tmp>0) + UrbanAutonomous.simParam.numberOfVehicle=tmp; + else{ + UrbanAutonomous.simParam.numberOfVehicle=1; + } + UrbanAutonomous.vehicleStack.vehicleGen(); } - */ } return result; diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java index eb6b146..a75c5f7 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/OperationDisp.java @@ -38,7 +38,7 @@ public void show() { //Demand p.fill(0,104,55); for(int i=0;i<24;i++){ - p.rect(350+60*i, 500-UrbanAutonomous.simParam.demandSizeArray[i], 60,UrbanAutonomous.simParam.demandSizeArray[i]); + p.rect(350+60*i, 500-UrbanAutonomous.simParam.demandSizeArray[i]*5, 60,UrbanAutonomous.simParam.demandSizeArray[i]*5); } //Optimal Fleet Size p.fill(0,104,55); diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java index 70345be..7c4abde 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/SimParam.java @@ -41,11 +41,13 @@ public SimParam() { capacityOfVehicle = 4; numberOfVehicle = 1; currentDemandSize = 0; - demandInterval = 10; + //demandInterval = 10; + demandInterval = 1; vehicleHistorySize = 30; currentTotalCongestionLevel = 0; totalCongestionLevel = new int[720]; - demandSizeArray = new int[] { 5, 5, 5, 5, 5, 10, 20, 50, 50, 20, 10, 10, 20, 10, 20, 30, 50, 50, 50, 30, 20, 10, 10, 10 }; + //demandSizeArray = new int[] { 5, 5, 5, 5, 5, 10, 20, 50, 50, 20, 10, 10, 20, 10, 20, 30, 50, 50, 50, 30, 20, 10, 10, 10 }; + demandSizeArray = new int[] { 1, 1, 1, 1, 1, 2, 4, 10, 10, 4, 2, 2, 4, 2, 4, 6, 10, 10, 10, 6, 4, 2, 2, 2 }; demandLifetime = 10; hubEffectiveLength = 15; hubDedicatedVehicleCapacity = 50; @@ -61,7 +63,6 @@ public void init(){ public void update() { currentTime++; - usagerate=UrbanAutonomous.demandStack.usageRateCal(); if (currentTime >= 14400) currentTime = 0; // unallocatedDemandSizeHistory diff --git a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java index 890ef05..b996133 100644 --- a/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java +++ b/Processing/Misc/UrbanAutonomous/build-tmp/source/UrbanAutonomous.java @@ -186,6 +186,8 @@ public void draw() { demandStack.demandAllocation(); demandStack.demandHubAllocation(); vehicleStack.allVehicleMovement(); + simParam.usagerate=UrbanAutonomous.demandStack.usageRateCal(); + hubStack.hubVehicleA.move(); hubStack.hubPeripheralVehicleA.move(); hubStack.hubPeripheralVehicleB.move();