Skip to content

Commit

Permalink
Adds junction, sink and source
Browse files Browse the repository at this point in the history
+ bug fixes
Tutorium 6
  • Loading branch information
apriljunge committed Jan 27, 2022
1 parent a0193ee commit be7dfaf
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 16 deletions.
8 changes: 5 additions & 3 deletions Tests_Ue5/trafficsim/model/grid/RoadTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Vector;

import static org.junit.jupiter.api.Assertions.*;

Expand Down Expand Up @@ -49,10 +50,11 @@ void vehicleInteraction(){

@Test
void clearTest(){
String temp = r1.getRoad().toString();
r1.addVehicle(c1, 0);
r1.addVehicle(c2, 49);
r1.clearRoad();
assertNotEquals(temp, r1.getRoad().toString());

Vehicle[] expected=new Vehicle[r1.getLength()];
assertArrayEquals(expected, r1.getRoad());
}

}
40 changes: 40 additions & 0 deletions src/trafficsim/model/grid/Junction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package trafficsim.model.grid;

import trafficsim.model.traffic.Vehicle;

import java.util.ArrayList;
import java.util.Random;

public class Junction implements TrafficNode {
private ArrayList<Road> outgoingRoads = new ArrayList<>(0);
private ArrayList<Road> freeRoads = new ArrayList<>(0);
private Random rnd = new Random();

@Override
public boolean canMoveTo(int position) {
findFreeRoads(position);
return freeRoads.size() > 0;
}

@Override
public void transferVehicle(Road origin, Vehicle v, int position) {
if (freeRoads.size() > 0) {
int roadNumber = rnd.nextInt(freeRoads.size());
freeRoads.get(roadNumber).addVehicle(v, position);
origin.removeVehicle(v);
}
}

public void addRoad(Road r) {
this.outgoingRoads.add(r);
}

private void findFreeRoads(int position) {
freeRoads.clear();
for (Road road: this.outgoingRoads) {
if (road.getDistanceToNextCar(0) >= position && road.getVehicle(0) == null) {
freeRoads.add(road);
}
}
}
}
33 changes: 21 additions & 12 deletions src/trafficsim/model/grid/Road.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public Vehicle getVehicle(int position) {
}

public void applyRules() {
for (int position = 0; position < this.road.length; position++) {
for (int position = this.road.length - 1; position >= 0; position--) {
Vehicle v = this.road[position];

if (v == null) {
Expand All @@ -95,7 +95,7 @@ public boolean isEmpty(int lower, int upper) {
int from = Math.max(0, lower);
int to = Math.min(upper, this.road.length);

for (int i = from; i < to; i++) {
for (int i = from; i <= to; i++) {
if (this.road[i] != null) {
return false;
}
Expand All @@ -105,9 +105,9 @@ public boolean isEmpty(int lower, int upper) {
}

public int getDistanceToNextCar(int position) {
for (int i = position; i < this.road.length; i++) {
for (int i = position + 1; i < this.road.length; i++) {
if (this.road[i] != null) {
return i - position - (this.road[i].getLength() + (int)Math.ceil((double)this.maxV / 2));
return i - position - this.road[i].getLength() - (int)Math.ceil(this.maxV / 2);
}
}

Expand Down Expand Up @@ -140,7 +140,7 @@ private void dawdle(Vehicle v) {

if (isDawdling()) {
if (speed > 0) {
v.setSpeed(speed + 1);
v.setSpeed(speed - 1);
}
}
}
Expand All @@ -158,28 +158,37 @@ private void move(Vehicle v, int position) {
}

private boolean isFirst(Vehicle v) {
for (Vehicle vehicle:this.road) {
if (vehicle != null) {
return vehicle == v;
for (int i = this.road.length - 1; i >= 0; i--) {
if (this.road[i] != null) {
return this.road[i] == v;
}
}

return false;
}

private int distanceToEnd(int position) {
return this.road.length - position;
return this.road.length - position - 1;
}

private boolean isDawdling() {
return rnd.nextDouble() < this.dawdleFactor;
return rnd.nextDouble() <= this.dawdleFactor;
}

private void transfer(Vehicle v, int position) {
// TODO
int distanceToEnd = distanceToEnd(position);
int newPosition = v.getSpeed() - distanceToEnd;

if (roadEnd.canMoveTo(newPosition)) {
roadEnd.transferVehicle(this, v, newPosition);
} else {
v.setSpeed(distanceToEnd);
moveForward(v, position);
}
}

private void moveForward(Vehicle v, int position) {
// TODO
this.road[position] = null;
this.road[position + v.getSpeed()] = v;
}
}
15 changes: 15 additions & 0 deletions src/trafficsim/model/grid/Sink.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package trafficsim.model.grid;

import trafficsim.model.traffic.Vehicle;

public class Sink implements TrafficNode {
@Override
public boolean canMoveTo(int position) {
return true;
}

@Override
public void transferVehicle(Road origin, Vehicle v, int position) {
origin.removeVehicle(v);
}
}
42 changes: 42 additions & 0 deletions src/trafficsim/model/grid/Source.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package trafficsim.model.grid;

import trafficsim.model.traffic.Car;
import trafficsim.model.traffic.Truck;
import trafficsim.model.traffic.Vehicle;

import java.util.Random;

public class Source {
private Road road;
private double sourcingFactor;
private Random rnd = new Random();

public Source() {
}

public Source(Road road) {
this.road = road;
}

public void generateVehicle() {
int speed = rnd.nextInt(this.road.getMaxV()) + 1;
Vehicle v;

if (road.isEmpty(0, speed) && rnd.nextDouble() < this.sourcingFactor) {
if (rnd.nextDouble() <= 0.1) {
v = new Truck(speed);
} else {
v = new Car(speed);
}
road.addVehicle(v, 0);
}
}

public void setRoad(Road road) {
this.road = road;
}

public void setSourcingFactor(double sourcingFactor) {
this.sourcingFactor = sourcingFactor;
}
}
3 changes: 2 additions & 1 deletion trafficsim.iml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/Tests_Ue5" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/Tests_Ue6" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/Tests_Ue5" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
Expand Down

0 comments on commit be7dfaf

Please sign in to comment.