diff --git a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java index 2e3aedf4..c2d6e3e0 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/RaceViewController.java @@ -317,32 +317,62 @@ public class RaceViewController extends Controller { Subject3D sailsSubject = new Subject3D(sails3D, 0); sails3D.setMaterial(boatColorMat); sailsSubject.setXRot(0d); + sailsSubject.setHeading(visualiserRace.getVisualiserRaceState().getWindDirection().degrees()); viewSubjects.add(sailsSubject); AnimationTimer sailsFollowBoat = new AnimationTimer() { + double sailCurrent = visualiserRace.getVisualiserRaceState().getWindDirection().degrees(); + boolean canLuff = true; + @Override public void handle(long now) { - double windDir = visualiserRace.getVisualiserRaceState().getWindDirection().degrees(); - double windOffset = (360 - windDir + boat.getBearing().degrees()) % 360; - double sailDir = windOffset / 180 * 270 + windDir + 180; - boolean leftOfWind = windOffset >= 180; - if (leftOfWind){ - System.out.println("is left"); - sailDir = -sailDir; + //if sails are out + double sailDir; + //if sails are luffing + if (boat.isSailsOut()) { + double windDir = visualiserRace.getVisualiserRaceState().getWindDirection().degrees(); + double windOffset = (360 - windDir + boat.getBearing().degrees()) % 360; + sailDir = windOffset / 180 * 270 + windDir + 180; + boolean leftOfWind = windOffset >= 180; + if (leftOfWind){ + sailDir = -sailDir; + } else { + sailDir = windDir - sailDir; + } } else { - System.out.println("is right"); - sailDir = windDir - sailDir; + sailDir = visualiserRace.getVisualiserRaceState().getWindDirection().degrees(); } - if (boat.isSailsOut()) { - sailsSubject.setHeading(sailDir); - if (sails3D.isLuffing()) { - sails3D.stopLuffing(); + + double compA = ((sailCurrent - sailDir) % 360 + 360) % 360; + double compB = ((sailDir - sailCurrent) % 360 + 360) % 360; + if (compB < compA){ + if (compB < compA - 5){ + sailCurrent += 5; + canLuff = false; + } else { + sailCurrent = sailDir; + canLuff = true; } } else { - sailsSubject.setHeading(visualiserRace.getVisualiserRaceState().getWindDirection().degrees()); - if (!sails3D.isLuffing()){ - sails3D.startLuffing(); + if (compA > compB + 5){ + sailCurrent -= 5; + canLuff = false; + } else { + sailCurrent = sailDir; + canLuff = true; + } + } + sailsSubject.setHeading(sailCurrent); + if (canLuff) { + if (boat.isSailsOut()) { + if (sails3D.isLuffing()) { + sails3D.stopLuffing(); + } + } else { + if (!sails3D.isLuffing()) { + sails3D.startLuffing(); + } } } sailsSubject.setX(gpsConverter.convertGPS(boat.getPosition()).getX());