From 64e96a1b8b935598464de5b668f5211399f8b0da Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 12:14:28 +1200 Subject: [PATCH 01/11] Class for shifting wind. #story[1187] --- .../src/main/java/mock/app/Event.java | 10 +--- .../src/main/java/mock/model/MockRace.java | 5 +- .../{ => wind}/ConstantWindGenerator.java | 4 +- .../model/{ => wind}/RandomWindGenerator.java | 2 +- .../model/wind/ShiftingWindGenerator.java | 51 +++++++++++++++++++ .../mock/model/{ => wind}/WindGenerator.java | 2 +- .../mock/model/ConstantWindGeneratorTest.java | 2 + .../test/java/mock/model/MockRaceTest.java | 5 +- .../mock/model/RandomWindGeneratorTest.java | 1 + 9 files changed, 62 insertions(+), 20 deletions(-) rename racevisionGame/src/main/java/mock/model/{ => wind}/ConstantWindGenerator.java (96%) rename racevisionGame/src/main/java/mock/model/{ => wind}/RandomWindGenerator.java (99%) create mode 100644 racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java rename racevisionGame/src/main/java/mock/model/{ => wind}/WindGenerator.java (96%) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index 228534c2..f36ac714 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -4,6 +4,8 @@ import mock.dataInput.PolarParser; import mock.exceptions.EventConstructionException; import mock.model.*; import mock.model.commandFactory.CompositeCommand; +import mock.model.wind.RandomWindGenerator; +import mock.model.wind.WindGenerator; import mock.xml.RaceXMLCreator; import network.Messages.LatestMessages; import org.xml.sax.SAXException; @@ -18,16 +20,8 @@ import shared.model.Constants; import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; import java.io.IOException; -import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; /** diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 379123af..ed7b6fd2 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -1,9 +1,6 @@ package mock.model; -import javafx.animation.AnimationTimer; -import mock.xml.*; -import network.Messages.BoatLocation; -import network.Messages.BoatStatus; +import mock.model.wind.WindGenerator; import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.RaceStatusEnum; import shared.dataInput.BoatDataSource; diff --git a/racevisionGame/src/main/java/mock/model/ConstantWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ConstantWindGenerator.java similarity index 96% rename from racevisionGame/src/main/java/mock/model/ConstantWindGenerator.java rename to racevisionGame/src/main/java/mock/model/wind/ConstantWindGenerator.java index ae14daac..6cdfafe9 100644 --- a/racevisionGame/src/main/java/mock/model/ConstantWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ConstantWindGenerator.java @@ -1,11 +1,9 @@ -package mock.model; +package mock.model.wind; import shared.model.Bearing; import shared.model.Wind; -import java.util.Random; - /** * This class generates Wind objects for use in a MockRace. * Initialised with a baseline wind speed and direction, and keeps it constant. diff --git a/racevisionGame/src/main/java/mock/model/RandomWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/RandomWindGenerator.java similarity index 99% rename from racevisionGame/src/main/java/mock/model/RandomWindGenerator.java rename to racevisionGame/src/main/java/mock/model/wind/RandomWindGenerator.java index 4f981b8d..bd7b13c3 100644 --- a/racevisionGame/src/main/java/mock/model/RandomWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/RandomWindGenerator.java @@ -1,4 +1,4 @@ -package mock.model; +package mock.model.wind; import shared.model.Bearing; diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java new file mode 100644 index 00000000..4a1c158e --- /dev/null +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -0,0 +1,51 @@ +package mock.model.wind; + +import shared.model.Bearing; +import shared.model.Wind; + +/** + * Created by jjg64 on 28/08/17. + */ +public class ShiftingWindGenerator implements WindGenerator { + Bearing baselineBearing; + double baseLineSpeed; + double maxBearingVariance = 5; // In degrees + double oscillationPeriod = 3e6; // In milliseconds + + public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { + this.baselineBearing = baselineBearing; + this.baseLineSpeed = baseLineSpeed; + } + + @Override + public Wind generateBaselineWind() { + return new Wind(baselineBearing, baseLineSpeed); + } + + @Override + public Wind generateNextWind(Wind currentWind) { + return changeWind(currentWind); + } + + private Wind changeWind(Wind currentWind) { + currentWind = oscillateWind(currentWind); + currentWind = shiftWind(currentWind); + return currentWind; + } + + private Wind oscillateWind(Wind currentWind) { + return currentWind; + } + + private Wind shiftWind(Wind currentWind) { + return currentWind; + } + + public void setMaxBearingVariance(double maxBearingVariance) { + this.maxBearingVariance = maxBearingVariance; + } + + public void setOscillationPeriod(double oscillationPeriod) { + this.oscillationPeriod = oscillationPeriod; + } +} diff --git a/racevisionGame/src/main/java/mock/model/WindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/WindGenerator.java similarity index 96% rename from racevisionGame/src/main/java/mock/model/WindGenerator.java rename to racevisionGame/src/main/java/mock/model/wind/WindGenerator.java index 8285d5d3..52ee2cd6 100644 --- a/racevisionGame/src/main/java/mock/model/WindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/WindGenerator.java @@ -1,4 +1,4 @@ -package mock.model; +package mock.model.wind; import shared.model.Wind; diff --git a/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java b/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java index 6f67dc30..f7c69acf 100644 --- a/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java +++ b/racevisionGame/src/test/java/mock/model/ConstantWindGeneratorTest.java @@ -1,5 +1,7 @@ package mock.model; +import mock.model.wind.ConstantWindGenerator; +import mock.model.wind.WindGenerator; import org.junit.Before; import org.junit.Test; import shared.model.Bearing; diff --git a/racevisionGame/src/test/java/mock/model/MockRaceTest.java b/racevisionGame/src/test/java/mock/model/MockRaceTest.java index 4f3f7705..f53b2970 100644 --- a/racevisionGame/src/test/java/mock/model/MockRaceTest.java +++ b/racevisionGame/src/test/java/mock/model/MockRaceTest.java @@ -1,7 +1,8 @@ package mock.model; import mock.dataInput.PolarParserTest; -import network.Messages.LatestMessages; +import mock.model.wind.ConstantWindGenerator; +import mock.model.wind.WindGenerator; import shared.dataInput.*; import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidRaceDataException; @@ -9,8 +10,6 @@ import shared.exceptions.InvalidRegattaDataException; import shared.model.Bearing; import shared.model.Constants; -import static org.junit.Assert.*; - public class MockRaceTest { //TODO diff --git a/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java b/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java index 76eed977..0f60bcea 100644 --- a/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java +++ b/racevisionGame/src/test/java/mock/model/RandomWindGeneratorTest.java @@ -1,5 +1,6 @@ package mock.model; +import mock.model.wind.RandomWindGenerator; import org.junit.Before; import org.junit.Test; import shared.model.Bearing; From 12e2ae9c0150ad6e3e5de6ca77ff606cb11fcbf8 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 13:21:34 +1200 Subject: [PATCH 02/11] Started implementing wind oscillation. #story[1187] --- .../src/main/java/mock/app/Event.java | 17 ++++--- .../model/wind/ShiftingWindGenerator.java | 49 ++++++++++++++----- .../src/main/java/shared/model/Wind.java | 7 +++ 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index f36ac714..096705bb 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -5,6 +5,7 @@ import mock.exceptions.EventConstructionException; import mock.model.*; import mock.model.commandFactory.CompositeCommand; import mock.model.wind.RandomWindGenerator; +import mock.model.wind.ShiftingWindGenerator; import mock.model.wind.WindGenerator; import mock.xml.RaceXMLCreator; import network.Messages.LatestMessages; @@ -124,13 +125,17 @@ public class Event { this.latestMessages = new LatestMessages(); //Create and start race. - WindGenerator windGenerator = new RandomWindGenerator( +// WindGenerator windGenerator = new RandomWindGenerator( +// Bearing.fromDegrees(225), +// Bearing.fromDegrees(215), +// Bearing.fromDegrees(235), +// 12d, +// 8d, +// 16d ); + WindGenerator windGenerator = new ShiftingWindGenerator( Bearing.fromDegrees(225), - Bearing.fromDegrees(215), - Bearing.fromDegrees(235), - 12d, - 8d, - 16d ); + 12 + ); RaceLogic newRace = new RaceLogic( new MockRace( boatDataSource, diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index 4a1c158e..fc3e3dc2 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -3,18 +3,28 @@ package mock.model.wind; import shared.model.Bearing; import shared.model.Wind; +import java.util.Random; + /** * Created by jjg64 on 28/08/17. */ public class ShiftingWindGenerator implements WindGenerator { Bearing baselineBearing; double baseLineSpeed; - double maxBearingVariance = 5; // In degrees + double speedVariance = 4; + double bearingVariance = 5; // In degrees double oscillationPeriod = 3e6; // In milliseconds + double timeOfLastOscillationReset = 0; + double timeSinceLastChange = 0; + double timeSinceLastShift = 0; // Back / veer + + boolean oscillationLeft = false; + public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; this.baseLineSpeed = baseLineSpeed; + initialiseOscillationDirection(); } @Override @@ -27,22 +37,39 @@ public class ShiftingWindGenerator implements WindGenerator { return changeWind(currentWind); } - private Wind changeWind(Wind currentWind) { - currentWind = oscillateWind(currentWind); - currentWind = shiftWind(currentWind); - return currentWind; + private Wind changeWind(Wind wind) { + Wind newWind = new Wind(wind.getWindDirection(), wind.getWindSpeed()); + oscillateWind(newWind); + shiftWind(newWind); + changeWindSpeed(newWind); + return newWind; + } + + private void oscillateWind(Wind wind) { + double timeSinceLastOscillationReset = System.currentTimeMillis() - timeOfLastOscillationReset; + if (oscillationLeft) { + + } + } + + private void shiftWind(Wind wind) { + } + + private void changeWindSpeed(Wind wind) { + } - private Wind oscillateWind(Wind currentWind) { - return currentWind; + private void initialiseOscillationDirection() { + oscillationLeft = new Random().nextBoolean(); + timeOfLastOscillationReset = System.currentTimeMillis(); } - private Wind shiftWind(Wind currentWind) { - return currentWind; + public void setBearingVariance(double maxBearingVariance) { + this.bearingVariance = maxBearingVariance; } - public void setMaxBearingVariance(double maxBearingVariance) { - this.maxBearingVariance = maxBearingVariance; + public void setSpeedVariance(double speedVariance) { + this.speedVariance = speedVariance; } public void setOscillationPeriod(double oscillationPeriod) { diff --git a/racevisionGame/src/main/java/shared/model/Wind.java b/racevisionGame/src/main/java/shared/model/Wind.java index 08d391c2..531d8473 100644 --- a/racevisionGame/src/main/java/shared/model/Wind.java +++ b/racevisionGame/src/main/java/shared/model/Wind.java @@ -48,4 +48,11 @@ public class Wind { return windSpeed; } + public void setWindSpeed(double windSpeed) { + this.windSpeed = windSpeed; + } + + public void setWindDirection(Bearing windDirection) { + this.windDirection = windDirection; + } } From d0ba7b93e09187be12f07df2b5a8facc852888fc Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 14:40:52 +1200 Subject: [PATCH 03/11] Wind oscillates, replaces random wind with shifting wind. #story[1187] --- .../src/main/java/mock/app/Event.java | 2 ++ .../model/wind/ShiftingWindGenerator.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java index d75307cf..c7f7d5ff 100644 --- a/racevisionGame/src/main/java/mock/app/Event.java +++ b/racevisionGame/src/main/java/mock/app/Event.java @@ -23,6 +23,8 @@ import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; /** diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index fc3e3dc2..cb94e55c 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -13,10 +13,11 @@ public class ShiftingWindGenerator implements WindGenerator { double baseLineSpeed; double speedVariance = 4; double bearingVariance = 5; // In degrees - double oscillationPeriod = 3e6; // In milliseconds + double oscillationVariance = 0.25; + double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds double timeOfLastOscillationReset = 0; - double timeSinceLastChange = 0; + double timeOfLastChange = 0; double timeSinceLastShift = 0; // Back / veer boolean oscillationLeft = false; @@ -42,13 +43,39 @@ public class ShiftingWindGenerator implements WindGenerator { oscillateWind(newWind); shiftWind(newWind); changeWindSpeed(newWind); + timeOfLastChange = System.currentTimeMillis(); return newWind; } private void oscillateWind(Wind wind) { double timeSinceLastOscillationReset = System.currentTimeMillis() - timeOfLastOscillationReset; + double timeSinceLastChange = System.currentTimeMillis() - timeOfLastChange; + double newBearing = wind.getWindDirection().degrees(); + double degreeChange = timeSinceLastChange * 2 * bearingVariance / oscillationPeriod; + degreeChange = (1 - oscillationVariance) * degreeChange + (2 * oscillationVariance) * degreeChange * Math.random(); + + if (timeSinceLastOscillationReset >= oscillationPeriod) { + timeOfLastOscillationReset = System.currentTimeMillis(); + oscillationLeft = !oscillationLeft; + } if (oscillationLeft) { - + newBearing -= degreeChange; + if (newBearing < baselineBearing.degrees() - bearingVariance) { + System.out.println(timeSinceLastOscillationReset); + oscillationLeft = !oscillationLeft; + timeOfLastOscillationReset = System.currentTimeMillis(); + } else { + wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); + } + } else { + newBearing += degreeChange; + if (newBearing > baselineBearing.degrees() + bearingVariance) { + System.out.println(timeSinceLastOscillationReset); + oscillationLeft = !oscillationLeft; + timeOfLastOscillationReset = System.currentTimeMillis(); + } else { + wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); + } } } From b0f7c5e73475f18a13e085c7aa726b15b26d4b2d Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Tue, 29 Aug 2017 15:53:41 +1200 Subject: [PATCH 04/11] Wind speed changes depending on where the wind direction is. #story[1187] --- .../model/wind/ShiftingWindGenerator.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index cb94e55c..f9e5a4be 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -11,7 +11,7 @@ import java.util.Random; public class ShiftingWindGenerator implements WindGenerator { Bearing baselineBearing; double baseLineSpeed; - double speedVariance = 4; + double speedVariance = 2; double bearingVariance = 5; // In degrees double oscillationVariance = 0.25; double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds @@ -20,7 +20,7 @@ public class ShiftingWindGenerator implements WindGenerator { double timeOfLastChange = 0; double timeSinceLastShift = 0; // Back / veer - boolean oscillationLeft = false; + boolean anticlockwise = false; public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; @@ -56,13 +56,13 @@ public class ShiftingWindGenerator implements WindGenerator { if (timeSinceLastOscillationReset >= oscillationPeriod) { timeOfLastOscillationReset = System.currentTimeMillis(); - oscillationLeft = !oscillationLeft; + anticlockwise = !anticlockwise; } - if (oscillationLeft) { + if (anticlockwise) { newBearing -= degreeChange; if (newBearing < baselineBearing.degrees() - bearingVariance) { System.out.println(timeSinceLastOscillationReset); - oscillationLeft = !oscillationLeft; + anticlockwise = !anticlockwise; timeOfLastOscillationReset = System.currentTimeMillis(); } else { wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); @@ -71,7 +71,7 @@ public class ShiftingWindGenerator implements WindGenerator { newBearing += degreeChange; if (newBearing > baselineBearing.degrees() + bearingVariance) { System.out.println(timeSinceLastOscillationReset); - oscillationLeft = !oscillationLeft; + anticlockwise = !anticlockwise; timeOfLastOscillationReset = System.currentTimeMillis(); } else { wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); @@ -83,11 +83,14 @@ public class ShiftingWindGenerator implements WindGenerator { } private void changeWindSpeed(Wind wind) { - + double deg = wind.getWindDirection().degrees(); + double offset = deg - baselineBearing.degrees(); + double newSpeed = offset / bearingVariance * speedVariance + baseLineSpeed; + wind.setWindSpeed(newSpeed); } private void initialiseOscillationDirection() { - oscillationLeft = new Random().nextBoolean(); + anticlockwise = new Random().nextBoolean(); timeOfLastOscillationReset = System.currentTimeMillis(); } From 0de7780020563dc70d427238c4fed2ef20024079 Mon Sep 17 00:00:00 2001 From: Joseph Date: Thu, 31 Aug 2017 12:26:30 +1200 Subject: [PATCH 05/11] Changed wind speed to be non-linear. #story[1187] --- .../mock/model/wind/ShiftingWindGenerator.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index f9e5a4be..d36a843b 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -11,7 +11,7 @@ import java.util.Random; public class ShiftingWindGenerator implements WindGenerator { Bearing baselineBearing; double baseLineSpeed; - double speedVariance = 2; + double windSpeedVariance = 5; double bearingVariance = 5; // In degrees double oscillationVariance = 0.25; double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds @@ -61,7 +61,6 @@ public class ShiftingWindGenerator implements WindGenerator { if (anticlockwise) { newBearing -= degreeChange; if (newBearing < baselineBearing.degrees() - bearingVariance) { - System.out.println(timeSinceLastOscillationReset); anticlockwise = !anticlockwise; timeOfLastOscillationReset = System.currentTimeMillis(); } else { @@ -70,7 +69,6 @@ public class ShiftingWindGenerator implements WindGenerator { } else { newBearing += degreeChange; if (newBearing > baselineBearing.degrees() + bearingVariance) { - System.out.println(timeSinceLastOscillationReset); anticlockwise = !anticlockwise; timeOfLastOscillationReset = System.currentTimeMillis(); } else { @@ -83,10 +81,10 @@ public class ShiftingWindGenerator implements WindGenerator { } private void changeWindSpeed(Wind wind) { - double deg = wind.getWindDirection().degrees(); - double offset = deg - baselineBearing.degrees(); - double newSpeed = offset / bearingVariance * speedVariance + baseLineSpeed; - wind.setWindSpeed(newSpeed); + double offsetAngle = (wind.getWindDirection().radians() - baselineBearing.radians()); + double offset = Math.sin(offsetAngle) * windSpeedVariance; + double newWindSpeed = baseLineSpeed + offset; + wind.setWindSpeed(newWindSpeed); } private void initialiseOscillationDirection() { @@ -98,8 +96,8 @@ public class ShiftingWindGenerator implements WindGenerator { this.bearingVariance = maxBearingVariance; } - public void setSpeedVariance(double speedVariance) { - this.speedVariance = speedVariance; + public void setWindSpeedVariance(double windSpeedVariance) { + this.windSpeedVariance = windSpeedVariance; } public void setOscillationPeriod(double oscillationPeriod) { From ec5bc9c6aa8ecc08acdd534b46d1cde601d5f0fe Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 1 Sep 2017 13:19:59 +1200 Subject: [PATCH 06/11] Wind now will occasionally back and veer (in some games, takes ~20min for full 180 degree rotation) #story[1188] --- .../model/wind/ShiftingWindGenerator.java | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index d36a843b..1b995a81 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -5,22 +5,23 @@ import shared.model.Wind; import java.util.Random; -/** - * Created by jjg64 on 28/08/17. - */ public class ShiftingWindGenerator implements WindGenerator { - Bearing baselineBearing; - double baseLineSpeed; - double windSpeedVariance = 5; - double bearingVariance = 5; // In degrees - double oscillationVariance = 0.25; - double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds - - double timeOfLastOscillationReset = 0; - double timeOfLastChange = 0; - double timeSinceLastShift = 0; // Back / veer - - boolean anticlockwise = false; + private Bearing baselineBearing; + private double baseLineSpeed; + private double windSpeedVariance = 5; + private double bearingVariance = 5; // In degrees + private double oscillationVariance = 0.25; + private double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds + private double shiftTime = 1e3 * 60; + private double shiftedSoFar = 0; + + private double timeOfLastOscillationReset = 0; + private double timeOfLastChange = 0; + private double timeOfLastShift = 0; // Back / veer + + private boolean anticlockwise = false; + private boolean shiftAnticlockwise = false;//true for Back, false for veer + private boolean shiftThisRace = Math.random() > 0.5; public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; @@ -41,7 +42,7 @@ public class ShiftingWindGenerator implements WindGenerator { private Wind changeWind(Wind wind) { Wind newWind = new Wind(wind.getWindDirection(), wind.getWindSpeed()); oscillateWind(newWind); - shiftWind(newWind); + if (shiftThisRace){shiftWind(newWind);} changeWindSpeed(newWind); timeOfLastChange = System.currentTimeMillis(); return newWind; @@ -78,6 +79,27 @@ public class ShiftingWindGenerator implements WindGenerator { } private void shiftWind(Wind wind) { + double timeSinceLastShift = System.currentTimeMillis() - timeOfLastShift; + double newBearing = wind.getWindDirection().degrees(); + double degreeChange = 7; + + if (timeSinceLastShift >= shiftTime){ + shiftedSoFar += degreeChange; + if (shiftedSoFar >= 180){ + shiftAnticlockwise = Math.random() > 0.5; + shiftedSoFar = 0; + System.out.println("Swapping"); + } + + timeOfLastShift = System.currentTimeMillis(); + if (shiftAnticlockwise){ + newBearing -= degreeChange; + wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); + } else { + newBearing += degreeChange; + wind.setWindDirection(Bearing.fromDegrees(newBearing % 360)); + } + } } private void changeWindSpeed(Wind wind) { From dbd4703e741980cd03653e8f58d4695c4c7c7319 Mon Sep 17 00:00:00 2001 From: hba56 Date: Tue, 5 Sep 2017 23:21:49 +1200 Subject: [PATCH 07/11] javadoc fix --- .../src/main/java/visualiser/Controllers/MainController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index 57d18830..a80f44e7 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -3,7 +3,6 @@ package visualiser.Controllers; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.layout.AnchorPane; -import visualiser.app.App; import visualiser.gameController.ControllerClient; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRaceEvent; @@ -40,6 +39,7 @@ public class MainController extends Controller { * Transitions from the StartController screen (displays pre-race information) to the RaceController (displays the actual race). * @param visualiserRace The object modelling the race. * @param controllerClient Socket Client that manipulates the controller. + * @param isHost true if this is a host */ public void beginRace(VisualiserRaceEvent visualiserRace, ControllerClient controllerClient, Boolean isHost) { raceController.startRace(visualiserRace, controllerClient, isHost); From 2382585c15132597635d455ed8374a2c60a9e15a Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Wed, 6 Sep 2017 16:58:27 +1200 Subject: [PATCH 08/11] Fixed Javadoc and also made some variables private #story[1187] --- .../model/wind/ShiftingWindGenerator.java | 24 +++++++++---------- .../Controllers/MainController.java | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index d36a843b..efba7c79 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -9,18 +9,18 @@ import java.util.Random; * Created by jjg64 on 28/08/17. */ public class ShiftingWindGenerator implements WindGenerator { - Bearing baselineBearing; - double baseLineSpeed; - double windSpeedVariance = 5; - double bearingVariance = 5; // In degrees - double oscillationVariance = 0.25; - double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds - - double timeOfLastOscillationReset = 0; - double timeOfLastChange = 0; - double timeSinceLastShift = 0; // Back / veer - - boolean anticlockwise = false; + private Bearing baselineBearing; + private double baseLineSpeed; + private double windSpeedVariance = 5; + private double bearingVariance = 5; // In degrees + private double oscillationVariance = 0.25; + private double oscillationPeriod = 1e3 * 60 * 1; // In milliseconds + + private double timeOfLastOscillationReset = 0; + private double timeOfLastChange = 0; + private double timeSinceLastShift = 0; // Back / veer + + private boolean anticlockwise = false; public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java index 57d18830..5098bc26 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/MainController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/MainController.java @@ -40,6 +40,7 @@ public class MainController extends Controller { * Transitions from the StartController screen (displays pre-race information) to the RaceController (displays the actual race). * @param visualiserRace The object modelling the race. * @param controllerClient Socket Client that manipulates the controller. + * @param isHost if the client is the host of a race or not. */ public void beginRace(VisualiserRaceEvent visualiserRace, ControllerClient controllerClient, Boolean isHost) { raceController.startRace(visualiserRace, controllerClient, isHost); From 86f495a5512a30a510208152126f0f5e36d8a676 Mon Sep 17 00:00:00 2001 From: hba56 Date: Wed, 6 Sep 2017 17:04:15 +1200 Subject: [PATCH 09/11] javaDoc --- .../model/wind/ShiftingWindGenerator.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java index 1b995a81..5d5e4995 100644 --- a/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java +++ b/racevisionGame/src/main/java/mock/model/wind/ShiftingWindGenerator.java @@ -23,6 +23,11 @@ public class ShiftingWindGenerator implements WindGenerator { private boolean shiftAnticlockwise = false;//true for Back, false for veer private boolean shiftThisRace = Math.random() > 0.5; + /** + * Constructor + * @param baselineBearing baseline bearing for wind + * @param baseLineSpeed base line speed for wind + */ public ShiftingWindGenerator(Bearing baselineBearing, double baseLineSpeed) { this.baselineBearing = baselineBearing; this.baseLineSpeed = baseLineSpeed; @@ -39,6 +44,10 @@ public class ShiftingWindGenerator implements WindGenerator { return changeWind(currentWind); } + /** + * @param wind the wind to change + * @return the changed wind + */ private Wind changeWind(Wind wind) { Wind newWind = new Wind(wind.getWindDirection(), wind.getWindSpeed()); oscillateWind(newWind); @@ -48,6 +57,10 @@ public class ShiftingWindGenerator implements WindGenerator { return newWind; } + /** + * moves the wind 5 degrees up and down + * @param wind the wind to oscillate + */ private void oscillateWind(Wind wind) { double timeSinceLastOscillationReset = System.currentTimeMillis() - timeOfLastOscillationReset; double timeSinceLastChange = System.currentTimeMillis() - timeOfLastChange; @@ -78,6 +91,10 @@ public class ShiftingWindGenerator implements WindGenerator { } } + /** + * Slowly shifts the wind up to 180 degrees from where it started + * @param wind the wind to change + */ private void shiftWind(Wind wind) { double timeSinceLastShift = System.currentTimeMillis() - timeOfLastShift; double newBearing = wind.getWindDirection().degrees(); @@ -102,6 +119,10 @@ public class ShiftingWindGenerator implements WindGenerator { } } + /** + * Change the wind speed + * @param wind the wind to change + */ private void changeWindSpeed(Wind wind) { double offsetAngle = (wind.getWindDirection().radians() - baselineBearing.radians()); double offset = Math.sin(offsetAngle) * windSpeedVariance; @@ -109,6 +130,9 @@ public class ShiftingWindGenerator implements WindGenerator { wind.setWindSpeed(newWindSpeed); } + /** + * starts the wind oscillation direction + */ private void initialiseOscillationDirection() { anticlockwise = new Random().nextBoolean(); timeOfLastOscillationReset = System.currentTimeMillis(); From 0886a609111ec7396283d990711e46038e750c85 Mon Sep 17 00:00:00 2001 From: hba56 Date: Wed, 6 Sep 2017 17:08:53 +1200 Subject: [PATCH 10/11] arrow Flip --- .../resources/visualiser/images/arrow.png | Bin 16120 -> 9414 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/racevisionGame/src/main/resources/visualiser/images/arrow.png b/racevisionGame/src/main/resources/visualiser/images/arrow.png index fab6e21d62803e12fb373e877e8f14edd8e9caae..ec5eb3cc6352cc9f1f90f73b41c35dd68d495f6c 100644 GIT binary patch literal 9414 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 literal 16120 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 From 7024cac4264dc0e6ade4c42e6042162db8bd3559 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Wed, 6 Sep 2017 17:41:48 +1200 Subject: [PATCH 11/11] Rotated image of arrow direction #story[1187] --- .../resources/visualiser/images/arrow.png | Bin 9414 -> 9439 bytes settings/keyBindings.xml | 33 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 settings/keyBindings.xml diff --git a/racevisionGame/src/main/resources/visualiser/images/arrow.png b/racevisionGame/src/main/resources/visualiser/images/arrow.png index ec5eb3cc6352cc9f1f90f73b41c35dd68d495f6c..cd7bab1036b743d28fe7f39d1d16bccca60a3a06 100644 GIT binary patch literal 9439 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 diff --git a/settings/keyBindings.xml b/settings/keyBindings.xml new file mode 100644 index 00000000..2b807e17 --- /dev/null +++ b/settings/keyBindings.xml @@ -0,0 +1,33 @@ + + + + + SPACE + + + + SHIFT + + + + DOWN + + + + X + + + + ENTER + + + + Z + + + + UP + + + +