|
|
|
|
@ -66,7 +66,7 @@ public class Race implements Runnable {
|
|
|
|
|
* Frame periods are multiplied by this to get the amount of time a single frame represents.
|
|
|
|
|
* E.g., frame period = 20ms, scale = 5, frame represents 20 * 5 = 100ms, and so boats are simulated for 100ms, even though only 20ms actually occurred.
|
|
|
|
|
*/
|
|
|
|
|
private int scaleFactor = 30;
|
|
|
|
|
private int scaleFactor = 15;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The race ID of the course.
|
|
|
|
|
@ -587,23 +587,30 @@ public class Race implements Runnable {
|
|
|
|
|
boat.moveForwards(distanceTravelledMeters, updatePeriodMilliseconds * this.scaleFactor);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Calculate the boat's bearing bounds, to ensure that it doesn't go out of the course.
|
|
|
|
|
Bearing[] bearingBounds = this.calculateBearingBounds(boat);
|
|
|
|
|
//Only get a new VMG if the boat will go outside the course, or X seconds have elapsed.
|
|
|
|
|
boolean willStayInsideCourse = this.checkBearingInsideCourse(boat.getBearing(), boat.getCurrentPosition());
|
|
|
|
|
long tackPeriod = 15000;
|
|
|
|
|
if (!willStayInsideCourse || (boat.getTimeSinceTackChange() > tackPeriod)) {
|
|
|
|
|
|
|
|
|
|
//Calculate the boat's bearing bounds, to ensure that it doesn't go out of the course.
|
|
|
|
|
Bearing[] bearingBounds = this.calculateBearingBounds(boat);
|
|
|
|
|
|
|
|
|
|
//Calculate the new VMG.
|
|
|
|
|
VMG newVMG = this.calculateVMG(boat, bearingBounds);
|
|
|
|
|
|
|
|
|
|
//Calculate the new VMG.
|
|
|
|
|
VMG newVMG = this.calculateVMG(boat, bearingBounds);
|
|
|
|
|
|
|
|
|
|
//If the new vmg improves velocity, use it.
|
|
|
|
|
if (improvesVelocity(boat, newVMG)) {
|
|
|
|
|
boat.setVMG(newVMG);
|
|
|
|
|
} else {
|
|
|
|
|
//We also need to use the new VMG if our current bearing will take us out of the course.
|
|
|
|
|
if (!this.checkBearingInsideCourse(boat.getBearing(), boat.getCurrentPosition())) {
|
|
|
|
|
|
|
|
|
|
//If the new vmg improves velocity, use it.
|
|
|
|
|
if (improvesVelocity(boat, newVMG)) {
|
|
|
|
|
boat.setVMG(newVMG);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
//We also need to use the new VMG if our current bearing will take us out of the course.
|
|
|
|
|
if (!willStayInsideCourse) {
|
|
|
|
|
boat.setVMG(newVMG);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|