Began implementing function to calculate boat's new coordinates
-Using haversine function -current values being produced are too small #implement #story[9]
This commit is contained in:
@@ -28,15 +28,29 @@ public class ConstantVelocityRace extends Race {
|
||||
double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg();
|
||||
|
||||
boat.setDistanceTravelledInLeg(totalDistanceTravelled);
|
||||
boat.setCurrentPosition(calculate_position(totalDistanceTravelled, boat.calculateHeading()));
|
||||
boat.setCurrentPosition(calculate_position(boat.getCurrentLeg().getStartGraphCoordinate(),
|
||||
totalDistanceTravelled, boat.calculateHeading()));
|
||||
//Calculate new coordinates based on boat's heading for the leg, and distance traveled
|
||||
}
|
||||
|
||||
protected GPSCoordinate calculate_position(double distanceTravelled, double heading) {
|
||||
protected static GPSCoordinate calculate_position(GPSCoordinate oldCoordinates, double distanceTravelled, double heading) {
|
||||
|
||||
//Find new coordinate using current heading and distance
|
||||
|
||||
return new GPSCoordinate(-1, -1);
|
||||
double oldLatitude = oldCoordinates.getLatitude();
|
||||
|
||||
double EARTH_RADIUS = 6371; //km
|
||||
double oldLongitude = oldCoordinates.getLongitude();
|
||||
double angularDistance = distanceTravelled / EARTH_RADIUS;
|
||||
|
||||
|
||||
double newLatitude = Math.asin( Math.sin(oldLatitude)*Math.cos(angularDistance) +
|
||||
Math.cos(oldLatitude)*Math.sin(angularDistance)*Math.cos(heading) );
|
||||
double newLongitude = oldLongitude + Math.atan2(Math.sin(heading)*Math.sin(angularDistance)*Math.cos(oldLatitude),
|
||||
Math.cos(angularDistance)-Math.sin(oldLatitude)*Math.sin(newLatitude));
|
||||
|
||||
|
||||
return new GPSCoordinate(newLatitude, newLongitude);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ public abstract class Race {
|
||||
protected ArrayList<BoatInRace> finishingBoats = new ArrayList<>();
|
||||
protected Leg[] legs;
|
||||
|
||||
|
||||
private int SLEEP_TIME = 1000; //time in milliseconds to pause in a paced loop
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package seng302.Model;
|
||||
|
||||
import org.junit.Test;
|
||||
import seng302.GPSCoordinate;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 16/03/17.
|
||||
*/
|
||||
public class ConstantVelocityRaceTest {
|
||||
|
||||
@Test
|
||||
public void travelling5nmNorthGivesCorrectNewCoordinates() {
|
||||
GPSCoordinate oldPos = new GPSCoordinate(0, 0);
|
||||
System.out.print(ConstantVelocityRace.calculate_position(oldPos, 1, 0).getLatitude());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package seng302.Model;
|
||||
|
||||
import org.junit.Test;
|
||||
import seng302.GPSCoordinate;
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Model.ConstantVelocityRace;
|
||||
import seng302.Model.Leg;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 15/03/17.
|
||||
*/
|
||||
public class RaceTest {
|
||||
|
||||
|
||||
@Test
|
||||
public void singleBoatRaceRunsAndFinishes() {
|
||||
|
||||
BoatInRace boat = new BoatInRace("NZ", 2500);
|
||||
BoatInRace[] boats = new BoatInRace[] {boat};
|
||||
Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(3, 4), 0);
|
||||
Leg[] legs = new Leg[] {leg1};
|
||||
ConstantVelocityRace race = new ConstantVelocityRace(boats, legs);
|
||||
race.run();
|
||||
assertTrue(race.finishingBoats.size() == 1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fasterBoatFinishesFirst() {
|
||||
BoatInRace fasterBoat = new BoatInRace("NZ", 2800);
|
||||
BoatInRace slowerBoat = new BoatInRace("AU", 1800);
|
||||
BoatInRace[] boats = new BoatInRace[] {slowerBoat, fasterBoat};
|
||||
Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(3, 4), 0);
|
||||
Leg[] legs = new Leg[] {leg1};
|
||||
ConstantVelocityRace race = new ConstantVelocityRace(boats, legs);
|
||||
race.run();
|
||||
|
||||
assertTrue(race.finishingBoats.get(0).getName() == "NZ");
|
||||
assertTrue(race.finishingBoats.get(1).getName() == "AU");
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
package seng302;
|
||||
|
||||
import org.junit.Test;
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Model.ConstantVelocityRace;
|
||||
import seng302.Model.Leg;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 15/03/17.
|
||||
*/
|
||||
public class RaceTest {
|
||||
|
||||
|
||||
@Test
|
||||
public void singleBoatRaceRunsAndFinishes(){
|
||||
|
||||
BoatInRace boat = new BoatInRace("NZ", 240);
|
||||
BoatInRace[] boats = new BoatInRace[] {boat};
|
||||
Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(3, 4), 0);
|
||||
Leg[] legs = new Leg[] {leg1};
|
||||
ConstantVelocityRace race = new ConstantVelocityRace(boats, legs);
|
||||
race.run();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user