|
|
|
|
@ -10,6 +10,10 @@ import java.util.Observable;
|
|
|
|
|
* Command class for tacking and gybing
|
|
|
|
|
*/
|
|
|
|
|
public class TackGybeCommand extends ObserverCommand {
|
|
|
|
|
private double goalRotation;
|
|
|
|
|
private double totalRotation = 0;
|
|
|
|
|
private int direction; // -1 for anticlockwise, 1 for clockwise
|
|
|
|
|
private double goalAngle;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Constructor for class
|
|
|
|
|
@ -22,18 +26,26 @@ public class TackGybeCommand extends ObserverCommand {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void execute() {
|
|
|
|
|
|
|
|
|
|
boat.setAutoVMG(false);
|
|
|
|
|
|
|
|
|
|
double boatAngle = boat.getBearing().degrees();
|
|
|
|
|
double windAngle = race.getWindDirection().degrees();
|
|
|
|
|
double differenceAngle = calcDistance(boatAngle, windAngle);
|
|
|
|
|
double angleA = windAngle + differenceAngle;
|
|
|
|
|
double angleB = windAngle - differenceAngle;
|
|
|
|
|
if (angleA % 360 == boatAngle) {
|
|
|
|
|
boat.setBearing(Bearing.fromDegrees(angleB));
|
|
|
|
|
goalAngle = angleB % 360;
|
|
|
|
|
} else {
|
|
|
|
|
boat.setBearing(Bearing.fromDegrees(angleA));
|
|
|
|
|
goalAngle = angleA % 360;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
goalRotation = goalAngle - boatAngle;
|
|
|
|
|
if (goalRotation < 0) {
|
|
|
|
|
goalRotation += 360;
|
|
|
|
|
}
|
|
|
|
|
if (goalRotation > 180) {
|
|
|
|
|
goalRotation = 360 - goalRotation;
|
|
|
|
|
direction = -1;
|
|
|
|
|
} else {
|
|
|
|
|
direction = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -50,7 +62,14 @@ public class TackGybeCommand extends ObserverCommand {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void update(Observable o, Object arg) {
|
|
|
|
|
|
|
|
|
|
double offset = 3.0;
|
|
|
|
|
if (totalRotation < goalRotation) {
|
|
|
|
|
boat.setBearing(Bearing.fromDegrees(boat.getBearing().degrees() + offset * direction));
|
|
|
|
|
totalRotation += offset;
|
|
|
|
|
} else {
|
|
|
|
|
System.out.println(goalAngle + " " + boat.getBearing().degrees());
|
|
|
|
|
race.deleteObserver(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|