@ -771,39 +771,60 @@ public class MockRace extends Race {
}
/ * *
* Checks if a boat has finished any legs , or has pulled out of race ( DNF ) .
* @param boat The boat to check .
* @param timeElapsed The total time , in milliseconds , that has elapsed since the race started .
* /
protected void checkPosition ( MockBoat boat , long timeElapsed ) {
protected void checkPosition ( MockBoat boat , long timeElapsed ) { //TODO cater for gates and rounding that aren't port side
//The distance, in nautical miles, within which the boat needs to get in order to consider that it has reached the marker.
double epsilonNauticalMiles = 100.0 / Constants . NMToMetersConversion ; //100 meters. TODO should be more like 5-10 .
double epsilonNauticalMiles = 250.0 / Constants . NMToMetersConversion ; //250 meters .
if ( boat . calculateDistanceToNextMarker ( ) < epsilonNauticalMiles ) {
//Boat has reached its target marker, and has moved on to a new leg.
//Boat is within an acceptable distance from the mark.
GPSCoordinate startDirectionLinePoint = boat . getCurrentLeg ( ) . getStartCompoundMark ( ) . getMark1Position ( ) ;
//todo will need to change this for gates, so that the end point is the side of the gate needed to be rounded
GPSCoordinate endDirectionLinePoint = boat . getCurrentLeg ( ) . getEndCompoundMark ( ) . getMark1Position ( ) ;
//Calculate how much the boat overshot the marker by.
double overshootMeters = boat . calculateDistanceToNextMarker ( ) ;
Bearing bearingOfDirectionLine = GPSCoordinate . calculateBearing ( startDirectionLinePoint , endDirectionLinePoint ) ;
//use the direction line to create three invisible points that act as crossover lines a boat must cross
//to round a mark
GPSCoordinate roundCheck1 = GPSCoordinate . calculateNewPosition ( startDirectionLinePoint ,
epsilonNauticalMiles , Azimuth . fromDegrees ( bearingOfDirectionLine . degrees ( ) + 90 ) ) ; //adding 90 so the check line is parallel
//Move boat on to next leg.
Leg nextLeg = this . legs . get ( boat . getCurrentLeg ( ) . getLegNumber ( ) + 1 ) ;
boat . setCurrentLeg ( nextLeg ) ;
GPSCoordinate roundCheck2 = GPSCoordinate . calculateNewPosition ( startDirectionLinePoint ,
epsilonNauticalMiles , Azimuth . fromDegrees ( bearingOfDirectionLine . degrees ( ) ) ) ;
//Add overshoot distance into the distance travelled for the next leg.
boat . setDistanceTravelledInLeg ( overshootMeters ) ;
//Setting a high value for this allows the boat to immediately do a large turn, as it needs to in order to get to the next mark.
boat . setTimeSinceTackChange ( 999999 ) ;
//boats must pass all checks in order to round a mark
switch ( boat . getRoundingStatus ( ) ) {
case 0 : //hasn't started rounding
if ( boat . isPortSide ( boat . getCurrentLeg ( ) . getEndCompoundMark ( ) . getMark1 ( ) ) & &
GPSCoordinate . intersects ( boat . getCurrentLeg ( ) . getEndCompoundMark ( ) . getMark1 ( ) . getPosition ( ) ,
roundCheck1 , boat . getCurrentPosition ( ) ) ) {
boat . increaseRoundingStatus ( ) ;
}
break ;
case 1 : //has been parallel to the mark
if ( boat . isPortSide ( boat . getCurrentLeg ( ) . getEndCompoundMark ( ) . getMark1 ( ) ) & &
GPSCoordinate . intersects ( boat . getCurrentLeg ( ) . getEndCompoundMark ( ) . getMark1 ( ) . getPosition ( ) ,
roundCheck2 , boat . getCurrentPosition ( ) ) ) {
boat . increaseRoundingStatus ( ) ;
}
break ;
case 2 : //has traveled 180 degrees around the mark
//Move boat on to next leg.
boat . resetRoundingStatus ( ) ;
Leg nextLeg = this . legs . get ( boat . getCurrentLeg ( ) . getLegNumber ( ) + 1 ) ;
boat . setCurrentLeg ( nextLeg ) ;
break ;
}
//Check if the boat has finished or stopped racing.
if ( this . isLastLeg ( boat . getCurrentLeg ( ) ) ) {
//Boat has finished.
boat . setTimeFinished ( timeElapsed ) ;
@ -824,6 +845,60 @@ public class MockRace extends Race {
}
//old method fo checking if boats passed a mark
//
// /**
// * Checks if a boat has finished any legs, or has pulled out of race (DNF).
// * @param boat The boat to check.
// * @param timeElapsed The total time, in milliseconds, that has elapsed since the race started.
// */
// protected void checkPosition(MockBoat boat, long timeElapsed) {
//
// //The distance, in nautical miles, within which the boat needs to get in order to consider that it has reached the marker.
// double epsilonNauticalMiles = 100.0 / Constants.NMToMetersConversion; //100 meters. TODO should be more like 5-10.
//
// if (boat.calculateDistanceToNextMarker() < epsilonNauticalMiles) {
// //Boat has reached its target marker, and has moved on to a new leg.
//
//
//
// //Calculate how much the boat overshot the marker by.
// double overshootMeters = boat.calculateDistanceToNextMarker();
//
//
// //Move boat on to next leg.
// Leg nextLeg = this.legs.get(boat.getCurrentLeg().getLegNumber() + 1);
// boat.setCurrentLeg(nextLeg);
//
// //Add overshoot distance into the distance travelled for the next leg.
// boat.setDistanceTravelledInLeg(overshootMeters);
//
// //Setting a high value for this allows the boat to immediately do a large turn, as it needs to in order to get to the next mark.
// boat.setTimeSinceTackChange(999999);
//
//
// //Check if the boat has finished or stopped racing.
//
// if (this.isLastLeg(boat.getCurrentLeg())) {
// //Boat has finished.
// boat.setTimeFinished(timeElapsed);
// boat.setCurrentSpeed(0);
// boat.setStatus(BoatStatusEnum.FINISHED);
//
// } else if (doNotFinish()) {
// //Boat has pulled out of race.
// boat.setTimeFinished(timeElapsed);
// boat.setCurrentLeg(new Leg("DNF", -1));
// boat.setCurrentSpeed(0);
// boat.setStatus(BoatStatusEnum.DNF);
//
// }
//
// }
//
// }
/ * *