Implemented redrawing boat with each loop

- Not complete. New gps coordinate needs work around bearing -> azimuth conversion

#implement #story[9]
main
Erika Savell 9 years ago
parent e6e59e2df9
commit 05c7af4abf

@ -18,6 +18,13 @@
<option name="OPEN_IN_BROWSER" value="true" />
<option name="OPTION_INCLUDE_LIBS" value="false" />
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>

@ -8,12 +8,9 @@ import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import seng302.Controllers.Controller;
import seng302.Controllers.MainController;
import seng302.Model.BoatInRace;
import seng302.Model.ConstantVelocityRace;
import seng302.Model.Leg;
import java.io.InputStream;
import java.util.Scanner;
public class App extends Application
{
@ -26,42 +23,6 @@ public class App extends Application
launch(args);
/* SPRINT 1 Leftovers
int timescale = 0; // Scale 5 min to 1 min, 1min = 200 5 min = 1000
Scanner sc = new Scanner(System.in);
while(timescale != 1 && timescale != 5) {
System.out.println("Enter whether you wish the race to last 1 or 5 minutes.");
String input = sc.nextLine();
try {
timescale = Integer.parseInt(input);
}catch (Exception e){
System.out.println("Please Enter a 1 or 5.");
}
}
timescale = timescale == 1 ? 200: 1000; //200ms = 1000ms if 1 minute elapse else 1000ms = 1000ms if 5 minutes
Boat[] boats = {
new Boat("ORACLE TEAM USA", 11),
new Boat("Artemis Racing", 10),
new Boat("Emirates Team New Zealand", 12),
new Boat("Groupama Team France", 11.5),
new Boat("Land Rover BAR", 11),
new Boat("SoftBank Team Japan", 10.5)
};
Leg[] marks = {
new Leg("Start", 0, 0, 295),
new Leg("Mark", 360, 360, 250),
new Leg("Leeward Gate", 965, 630, 790),
new Leg("Windward Gate", 1865, 205, 0),
new Leg("Leeward Gate", 2765, 630, 790),
new Leg("Finish", 3035, 475, 1015)
};
Race race = new ConstantVelocityRace(boats, marks, timescale);
race.simulateRace();*/
}
@Override

@ -5,40 +5,34 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.util.Callback;
import seng302.GPSCoordinate;
import javafx.scene.transform.Rotate;
import seng302.GraphCoordinate;
import seng302.Model.ResizableRaceCanvas;
import seng302.Model.*;
import seng302.RaceMap;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.ResourceBundle;
/**
* Created by Gondr on 15/03/2017.
*/
public class RaceController extends Controller{
@FXML
TableView boatInfoTable;
@FXML
AnchorPane canvasBase;
@FXML
ResizableRaceCanvas raceMap;
@FXML
TableView boatInfoTable;
@FXML
TableColumn<BoatInRace, String> boatPlacingColumn;
@FXML
@ -49,6 +43,13 @@ public class RaceController extends Controller{
private GraphicsContext gc;
private RaceMap map;
public void updateMap(BoatInRace[] boats) {
raceMap.setBoats(boats);
raceMap.drawRaceMap();
}
public void updateInfoTable(Race race) {
boatInfoTable.getItems().clear();
boatInfoTable.setItems(FXCollections.observableArrayList(race.getStartingBoats()));
@ -65,17 +66,23 @@ public class RaceController extends Controller{
@Override
public void initialize(URL location, ResourceBundle resources) {
BoatInRace boat = new BoatInRace("NZ", 100);
boat.setColour(Color.DARKVIOLET);
boat.setCurrentPosition(new GPSCoordinate(0, 0));
BoatInRace[] boats = new BoatInRace[] {boat};
raceMap = new ResizableRaceCanvas();
raceMap.widthProperty().bind(canvasBase.widthProperty());
raceMap.heightProperty().bind(canvasBase.heightProperty());
raceMap.draw();
raceMap.setBoats(boats);
raceMap.drawRaceMap();
canvasBase.getChildren().add(raceMap);
BoatInRace boat = new BoatInRace("NZ", 1000);
BoatInRace[] boats = new BoatInRace[] {boat};
ArrayList<Leg> legs = new ArrayList<>();
legs.add(new Leg("Start", 1, new GPSCoordinate(0,0), new GPSCoordinate(1,1), 0));
legs.add(new Leg("Mark", 1, new GPSCoordinate(0,0), new GPSCoordinate(1,1), 1));
legs.add(new Leg("Start", 10, new GPSCoordinate(32.296577, -64.854304), new GPSCoordinate(32.296576, -64.854304), 0));
legs.add(new Leg("Mark", 50, new GPSCoordinate(32.296577, -64.854304), new GPSCoordinate(32.308046, -64.831785), 1));
ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, this);

@ -18,5 +18,9 @@ public class GPSCoordinate {
return longitude;
}
public String toString() {
return String.format("Latitude: %f Longitude: %f", latitude, longitude);
}
}

@ -1,7 +1,9 @@
package seng302.Model;
import javafx.scene.paint.Color;
import seng302.GPSCoordinate;
import seng302.GraphCoordinate;
/**
* Created by esa46 on 15/03/17.
@ -12,6 +14,23 @@ public class BoatInRace extends Boat {
private double distanceTravelledInLeg;
private GPSCoordinate currentPosition;
private long timeFinished;
private Color colour;
public GPSCoordinate getCurrentPosition() {
return currentPosition;
}
public long getTimeFinished() {
return timeFinished;
}
public Color getColour() {
return colour;
}
public void setColour(Color colour) {
this.colour = colour;
}
public void setTimeFinished(long timeFinished) {
this.timeFinished = timeFinished;
@ -43,7 +62,6 @@ public class BoatInRace extends Boat {
}
/**
* Calculates the bearing of the travel via map coordinates of the raceMarkers
* @return

@ -42,7 +42,7 @@ public class ConstantVelocityRace extends Race {
boat.setDistanceTravelledInLeg(totalDistanceTravelled);
boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartGraphCoordinate(),
totalDistanceTravelled, boat.calculateHeading()));
//Calculate new coordinates based on boat's heading for the leg, and distance traveled
}
public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double heading) {
@ -53,12 +53,13 @@ public class ConstantVelocityRace extends Race {
Point2D startPoint = new Point2D.Double(oldCoordinates.getLatitude(), oldCoordinates.getLongitude());
geodeticCalculator.setStartingGeographicPoint(startPoint);
double azimuth = heading - 180;
geodeticCalculator.setDirection(azimuth, distanceTravelled);
heading = 1;
double azimuth = 180 - heading;
System.out.println(heading);
geodeticCalculator.setDirection(azimuth, distanceTravelled * 1852 );
Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint();

@ -81,6 +81,8 @@ public abstract class Race implements Runnable {
updatePosition(boat, SLEEP_TIME);
checkPosition(boat, totalTimeElapsed);
}
controller.updateMap(startingBoats);
try {
timeLoopEnded = System.currentTimeMillis();
Thread.sleep(SLEEP_TIME - (timeLoopEnded - timeLoopStarted));

@ -5,22 +5,30 @@ import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.transform.Rotate;
import seng302.GPSCoordinate;
import seng302.GraphCoordinate;
import seng302.RaceMap;
import java.util.Random;
/**
* Created by fwy13 on 17/03/17.
*/
public class ResizableRaceCanvas extends Canvas {
GraphicsContext gc;
RaceMap map;
private BoatInRace[] boats;
public void setBoats(BoatInRace[] boats) {
this.boats = boats;
}
public ResizableRaceCanvas(RaceMap map) {
this.map = map;
gc = this.getGraphicsContext2D();
// Redraw canvas when size changes.
widthProperty().addListener(evt -> draw());
heightProperty().addListener(evt -> draw());
widthProperty().addListener(evt -> drawRaceMap());
heightProperty().addListener(evt -> drawRaceMap());
}
public ResizableRaceCanvas(){
@ -31,7 +39,7 @@ public class ResizableRaceCanvas extends Canvas {
this.map = map;
}
public void displayBoat(GraphCoordinate graphCoordinate, Paint paint){
public void displayMark(GraphCoordinate graphCoordinate, Paint paint){
gc.setFill(paint);
gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 15, 15);
}
@ -44,7 +52,6 @@ public class ResizableRaceCanvas extends Canvas {
gc.strokeLine(graphCoordinateA.getX(), graphCoordinateA.getY(), graphCoordinateB.getX(), graphCoordinateB.getY());
}
public void displayPoint(GraphCoordinate graphCoordinate, Paint paint){
gc.setFill(paint);
gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 10, 10);
@ -65,20 +72,20 @@ public class ResizableRaceCanvas extends Canvas {
gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy());
}
public void draw() {
public void drawRaceMap() {
double width = getWidth();
double height = getHeight();
gc.clearRect(0, 0, width, height);
System.out.println("Race Map Canvas Width: "+ width + ", Height:" + height);
this.map = new RaceMap(32.320989, -64.863, 32.278, -64.821, (int)width, (int)height);
if (map == null){
return;
}
System.out.println("Drawing");
gc.clearRect(0, 0, width, height);
//boat
GraphCoordinate boat1coord = this.map.convertGPS(32.296577, -64.854304);
displayBoat(boat1coord, Color.AQUAMARINE);
//finish line
gc.setLineWidth(2);
GraphCoordinate finishLineCoord1 = this.map.convertGPS(32.317379, -64.839291);
@ -90,19 +97,33 @@ public class ResizableRaceCanvas extends Canvas {
GraphCoordinate southGate2 = this.map.convertGPS(32.280164, -64.847591);
GraphCoordinate northGate1 = this.map.convertGPS(32.309693, -64.835249);
GraphCoordinate northGate2 = this.map.convertGPS(32.308046, -64.831785);
displayBoat(boat1coord, Color.AQUAMARINE);
displayBoat(markCoord, Color.GOLD);
displayMark(markCoord, Color.GOLD);
displayLine(southGate1, southGate2, Color.DARKCYAN);
displayLine(northGate1, northGate2, Color.DARKVIOLET);
//start line
GraphCoordinate startline1 = this.map.convertGPS(32.296577, -64.854304);
GraphCoordinate startline2 = this.map.convertGPS(32.293771, -64.855242);
displayLine(startline1, startline2, Color.GREEN);
if (boats != null) {
for (BoatInRace boat : boats) {
System.out.print("Drawing Boat At: " + boat.getCurrentPosition());
displayMark(this.map.convertGPS(boat.getCurrentPosition()), boat.getColour());
}
}
//display wind direction arrow - specify origin point and angle
displayArrow(new GraphCoordinate(500, 20), 100);
}
public void drawBoat(Color colour, GPSCoordinate gpsCoordinates) {
GraphCoordinate graphCoordinate = this.map.convertGPS(gpsCoordinates);
System.out.println("DrawingBoat" + gpsCoordinates.getLongitude());
displayPoint(graphCoordinate, colour);
}
@Override
public boolean isResizable() {
return true;

@ -21,4 +21,8 @@ public class RaceMap {
public GraphCoordinate convertGPS(double lat, double lon) {
return new GraphCoordinate((int) ((height * (lon - y1) / (y2 - y1))),(int) (width * (lat - x1) / (x2 - x1)));
}
public GraphCoordinate convertGPS(GPSCoordinate coordinate) {
return convertGPS(coordinate.getLatitude(), coordinate.getLongitude());
}
}

Loading…
Cancel
Save