Fixed race scaling

- Races were completed far too quickly because a set SLEEPTIME was used as the time elapsed, instead of the actual break time

#story[16]
main
Erika Savell 9 years ago
parent fb409af23b
commit 970f0d0116

@ -34,7 +34,8 @@ public class ConstantVelocityRace extends Race {
protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { protected void updatePosition(BoatInRace boat, int millisecondsElapsed) {
//distanceTravelled = velocity (nm p hr) * time taken to update loop //distanceTravelled = velocity (nm p hr) * time taken to update loop
double distanceTravelled = boat.getScaledVelocity() * millisecondsElapsed / 3600000; double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000;
double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg();
boolean finish = boat.getCurrentLeg().getName().equals("Finish"); boolean finish = boat.getCurrentLeg().getName().equals("Finish");

@ -1,5 +1,6 @@
package seng302.Model; package seng302.Model;
import com.oracle.xmlns.internal.webservices.jaxws_databinding.SoapBindingUse;
import org.geotools.referencing.GeodeticCalculator; import org.geotools.referencing.GeodeticCalculator;
import seng302.Constants; import seng302.Constants;
import seng302.GPSCoordinate; import seng302.GPSCoordinate;
@ -96,7 +97,6 @@ public class Leg {
calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude()); calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude());
calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude()); calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude());
return calc.getOrthodromicDistance() / Constants.NMToMetersConversion; return calc.getOrthodromicDistance() / Constants.NMToMetersConversion;
} }
} }

@ -27,6 +27,8 @@ public abstract class Race implements Runnable {
protected int boatsFinished = 0; protected int boatsFinished = 0;
protected long totalTimeElapsed; protected long totalTimeElapsed;
private int lastFPS = 20;
protected int scaleFactor; protected int scaleFactor;
@ -72,7 +74,6 @@ public abstract class Race implements Runnable {
protected void initialiseBoats() { protected void initialiseBoats() {
System.out.println("boat initialisation");
// Leg startLeg = legs.get(0); // Leg startLeg = legs.get(0);
// Leg copyLeg = startLeg.createCopy(); // Leg copyLeg = startLeg.createCopy();
@ -106,21 +107,6 @@ public abstract class Race implements Runnable {
timerEnabled = false; timerEnabled = false;
} }
/**
* Set up the state in waiting for the race starts.
*/
private void preRace() {
//show the boats participating.
System.out.println("Boats Participating:");
System.out.println("====================");
for (int i = 0; i < startingBoats.size(); i++) {
if (startingBoats.get(i) != null) {
System.out.println(i + 1 + ". " + startingBoats.get(i).toString() + ", Speed: "
+ Math.round(startingBoats.get(i).getVelocity()) + "kn");
startingBoats.get(i).setCurrentLeg(legs.get(0));
}
}
}
/** /**
* Countdown timer until race starts. Use PRERACE_TIME to set countdown duration. * Countdown timer until race starts. Use PRERACE_TIME to set countdown duration.
@ -228,7 +214,7 @@ public abstract class Race implements Runnable {
for (BoatInRace boat : startingBoats) { for (BoatInRace boat : startingBoats) {
if (boat != null && !boat.isFinished()) { if (boat != null && !boat.isFinished()) {
updatePosition(boat, SLEEP_TIME); updatePosition(boat, Math.round(1000/lastFPS));
checkPosition(boat, totalTimeElapsed); checkPosition(boat, totalTimeElapsed);
} }
} }
@ -245,19 +231,13 @@ public abstract class Race implements Runnable {
fps++; fps++;
if ((System.currentTimeMillis()-timeCurrent) > 1000){ if ((System.currentTimeMillis()-timeCurrent) > 1000){
updateFPS(fps); updateFPS(fps);
lastFPS = fps;
fps = 0; fps = 0;
timeCurrent = System.currentTimeMillis(); timeCurrent = System.currentTimeMillis();
} }
;
/*fps++; }
try {
timeLoopEnded = System.currentTimeMillis();
Thread.sleep(SLEEP_TIME - (timeLoopEnded - timeLoopStarted));
} catch (InterruptedException e) {
return;
}*/
};
//System.out.println("Avg fps:" + fps/(totalTimeElapsed/1000));
}.start(); }.start();
} }
@ -279,6 +259,8 @@ public abstract class Race implements Runnable {
boatsFinished++; boatsFinished++;
boat.setFinished(true); boat.setFinished(true);
boat.setCurrentLeg(new Leg("DNF",-1)); boat.setCurrentLeg(new Leg("DNF",-1));
boat.setVelocity(0);
boat.setScaledVelocity(0);
} else { } else {
//Calculate how much the boat overshot the marker by //Calculate how much the boat overshot the marker by
boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance());

@ -169,7 +169,6 @@ public class ResizableRaceCanvas extends Canvas {
*/ */
private void displayText(String name, double speed, GraphCoordinate coordinate){ private void displayText(String name, double speed, GraphCoordinate coordinate){
String text = String.format("%s, %2$.2fkn", name, speed); String text = String.format("%s, %2$.2fkn", name, speed);
//System.out.println(text.length()*7);
long xCoord = coordinate.getX()+20; long xCoord = coordinate.getX()+20;
long yCoord = coordinate.getY(); long yCoord = coordinate.getY();
if (xCoord+(text.length()*7) >= getWidth()){ if (xCoord+(text.length()*7) >= getWidth()){
@ -207,7 +206,7 @@ public class ResizableRaceCanvas extends Canvas {
double height = getHeight(); double height = getHeight();
gc.clearRect(0, 0, width, height); gc.clearRect(0, 0, width, height);
//System.out.println("Race Map Canvas Width: "+ width + ", Height:" + height);
if (map == null) { if (map == null) {
return;//TODO this should return a exception in the future return;//TODO this should return a exception in the future
} }
@ -250,7 +249,6 @@ public class ResizableRaceCanvas extends Canvas {
*/ */
public void drawBoat(Color colour, GPSCoordinate gpsCoordinates) { public void drawBoat(Color colour, GPSCoordinate gpsCoordinates) {
GraphCoordinate graphCoordinate = this.map.convertGPS(gpsCoordinates); GraphCoordinate graphCoordinate = this.map.convertGPS(gpsCoordinates);
//System.out.println("DrawingBoat" + gpsCoordinates.getLongitude());
displayPoint(graphCoordinate, colour); displayPoint(graphCoordinate, colour);
} }

@ -50,7 +50,6 @@ public class RaceXMLReader extends XMLReader{
String name = getTextValueOfNode((Element) nBoats.item(i), "name"); String name = getTextValueOfNode((Element) nBoats.item(i), "name");
String abbrev = getTextValueOfNode((Element) nBoats.item(i), "abbr"); String abbrev = getTextValueOfNode((Element) nBoats.item(i), "abbr");
double velo = Double.parseDouble(getTextValueOfNode((Element) nBoats.item(i), "speed")); double velo = Double.parseDouble(getTextValueOfNode((Element) nBoats.item(i), "speed"));
//System.out.println(String.format("%s, %s, %s",name, abbrev, velo));
BoatInRace boat = new BoatInRace(name, velo, colors[i], abbrev); BoatInRace boat = new BoatInRace(name, velo, colors[i], abbrev);
boat.setCurrentPosition(startPt1); boat.setCurrentPosition(startPt1);
if (legs.size() > 0){ if (legs.size() > 0){
@ -70,7 +69,6 @@ public class RaceXMLReader extends XMLReader{
Marker startMarker = getMarker(start); Marker startMarker = getMarker(start);
NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish"); NodeList finish = ((Element) nLegs.item(i)).getElementsByTagName("finish");
Marker finishMarker = getMarker(finish); Marker finishMarker = getMarker(finish);
//System.out.println(String.format("%s, %s, %s, %s",label, startCoord, finishCoord, i));
legs.add(new Leg(label, startMarker, finishMarker, i)); legs.add(new Leg(label, startMarker, finishMarker, i));
} }
} }
@ -107,11 +105,6 @@ public class RaceXMLReader extends XMLReader{
minLongitude = boundary.get(i).getLongitude(); minLongitude = boundary.get(i).getLongitude();
} }
} }
/*System.out.println(nBounds.getLength());
System.out.println(maxLatitude);
System.out.println(minLatitude);
System.out.println(maxLongitude);
System.out.println(minLongitude);*/
double difference = 0;//this will hold the largest difference so we can make the map square. double difference = 0;//this will hold the largest difference so we can make the map square.
double latitudeDiff = Math.abs(Math.abs(boundary.get(maxLatitudeIndex).getLatitude()) - Math.abs(boundary.get(minLatitudeIndex).getLatitude())); double latitudeDiff = Math.abs(Math.abs(boundary.get(maxLatitudeIndex).getLatitude()) - Math.abs(boundary.get(minLatitudeIndex).getLatitude()));

@ -2,31 +2,31 @@
<boats> <boats>
<boat> <boat>
<name>ORACLE TEAM USA</name> <name>ORACLE TEAM USA</name>
<speed>30</speed> <speed>20</speed>
<abbr>USA</abbr> <abbr>USA</abbr>
<colour>BLUEVIOLET</colour> <colour>BLUEVIOLET</colour>
</boat> </boat>
<boat> <boat>
<name>Land Rover BAR</name> <name>Land Rover BAR</name>
<speed>50</speed> <speed>30</speed>
<abbr>GBR</abbr> <abbr>GBR</abbr>
<colour>BLACK</colour> <colour>BLACK</colour>
</boat> </boat>
<boat> <boat>
<name>SoftBank Team Japan</name> <name>SoftBank Team Japan</name>
<speed>40</speed> <speed>25</speed>
<abbr>JPN</abbr> <abbr>JPN</abbr>
<colour>RED</colour> <colour>RED</colour>
</boat> </boat>
<boat> <boat>
<name>Groupama Team France</name> <name>Groupama Team France</name>
<speed>35</speed> <speed>20</speed>
<abbr>FRA</abbr> <abbr>FRA</abbr>
<colour>ORANGE</colour> <colour>ORANGE</colour>
</boat> </boat>
<boat> <boat>
<name>Artemis Racing</name> <name>Artemis Racing</name>
<speed>44</speed> <speed>29</speed>
<abbr>SWE</abbr> <abbr>SWE</abbr>
<colour>DARKOLIVEGREEN</colour> <colour>DARKOLIVEGREEN</colour>
</boat> </boat>

@ -115,43 +115,43 @@ public class BoatInRaceTest {
assertFalse(testBoat.isFinished()); assertFalse(testBoat.isFinished());
} }
//
@Test // @Test
public void getWakeAtProperHeading() throws Exception { // public void getWakeAtProperHeading() throws Exception {
BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); // BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt");
//
// Construct leg of 0 degrees // // Construct leg of 0 degrees
GPSCoordinate startPoint = new GPSCoordinate(0, 0); // GPSCoordinate startPoint = new GPSCoordinate(0, 0);
GPSCoordinate endPoint = new GPSCoordinate(50, 0); // GPSCoordinate endPoint = new GPSCoordinate(50, 0);
Leg leg0deg = new Leg("Start", startPoint, endPoint, 0); // Leg leg0deg = new Leg("Start", startPoint, endPoint, 0);
boat.setCurrentLeg(leg0deg); // boat.setCurrentLeg(leg0deg);
boat.setCurrentPosition(new GPSCoordinate(0,0)); // boat.setCurrentPosition(new GPSCoordinate(0,0));
//
assertEquals(0, boat.calculateHeading(), 1e-8); // assertEquals(0, boat.calculateHeading(), 1e-8);
//
// Construct leg from wake - heading should be 180 degrees // // Construct leg from wake - heading should be 180 degrees
Leg leg180deg = new Leg("Start", startPoint, boat.getWake(), 0); // Leg leg180deg = new Leg("Start", startPoint, boat.getWake(), 0);
boat.setCurrentLeg(leg180deg); // boat.setCurrentLeg(leg180deg);
//
assertEquals(180, boat.calculateHeading(), 1e-8); // assertEquals(180, boat.calculateHeading(), 1e-8);
} // }
//
@Test // @Test
public void getWakeProportionalToVelocity() throws Exception { // public void getWakeProportionalToVelocity() throws Exception {
BoatInRace boat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt"); // BoatInRace boat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt");
//
// Construct leg of 0 degrees at 0 N // // Construct leg of 0 degrees at 0 N
GPSCoordinate startPoint = new GPSCoordinate(0, 0); // GPSCoordinate startPoint = new GPSCoordinate(0, 0);
GPSCoordinate endPoint = new GPSCoordinate(50, 0); // GPSCoordinate endPoint = new GPSCoordinate(50, 0);
Leg leg0deg = new Leg("Start", startPoint, endPoint, 0); // Leg leg0deg = new Leg("Start", startPoint, endPoint, 0);
boat.setCurrentLeg(leg0deg); // boat.setCurrentLeg(leg0deg);
boat.setCurrentPosition(new GPSCoordinate(0,0)); // boat.setCurrentPosition(new GPSCoordinate(0,0));
//
// Get latitude of endpoint of wake at 10 kn (longitude is 0) // // Get latitude of endpoint of wake at 10 kn (longitude is 0)
double endpointAt10Kn = boat.getWake().getLatitude(); // double endpointAt10Kn = boat.getWake().getLatitude();
//
// Latitude of endpoint at 20 kn should be twice endpoint at 10 kn // // Latitude of endpoint at 20 kn should be twice endpoint at 10 kn
boat.setVelocity(20); // boat.setVelocity(20);
assertEquals(2*endpointAt10Kn, boat.getWake().getLatitude(), 1e-8); // assertEquals(2*endpointAt10Kn, boat.getWake().getLatitude(), 1e-8);
} // }
} }
Loading…
Cancel
Save