From 9ca50aa66c9f8570f2ca5b209f6051627a9f5bc0 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Tue, 15 Aug 2017 14:26:43 +1200 Subject: [PATCH] Ray casting now only supports distance specification. #story[1100] --- .../src/main/java/mock/model/MockBoat.java | 13 +++++++------ .../main/java/mock/model/collider/Collider.java | 8 ++++---- .../mock/model/collider/ColliderRegistry.java | 2 +- .../src/main/java/shared/model/CompoundMark.java | 13 +++++++------ .../src/test/java/mock/model/MockBoatTest.java | 16 ++++++++-------- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/racevisionGame/src/main/java/mock/model/MockBoat.java b/racevisionGame/src/main/java/mock/model/MockBoat.java index 2a179f7e..6ab43cf3 100644 --- a/racevisionGame/src/main/java/mock/model/MockBoat.java +++ b/racevisionGame/src/main/java/mock/model/MockBoat.java @@ -207,12 +207,13 @@ public class MockBoat extends Boat implements Collider { } @Override - public boolean rayCast(MockBoat boat, Collision collision) { - double distance = GPSCoordinate.calculateDistanceMeters(boat.getCurrentPosition(), this.getCurrentPosition()); - Bearing bearing = GPSCoordinate.calculateBearing(boat.getCurrentPosition(), this.getCurrentPosition()); + public boolean rayCast(MockBoat boat, double distance) { + double actualDistance = GPSCoordinate.calculateDistanceMeters(boat.getCurrentPosition(), this.getCurrentPosition()); + Bearing absolute = GPSCoordinate.calculateBearing(boat.getCurrentPosition(), this.getCurrentPosition()); + Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); - if(distance <= collision.getDistance() && (int)bearing.degrees() == (int)collision.getBearing().degrees()) { - onCollisionEnter(collision); + if(actualDistance <= distance) { + onCollisionEnter(new Collision(relative, actualDistance)); return true; } else return false; } @@ -220,7 +221,7 @@ public class MockBoat extends Boat implements Collider { @Override public boolean rayCast(MockBoat boat) { if(boat != this) { - return rayCast(boat, new Collision(Bearing.fromDegrees(0), 100)); + return rayCast(boat, 100); } else return false; } diff --git a/racevisionGame/src/main/java/mock/model/collider/Collider.java b/racevisionGame/src/main/java/mock/model/collider/Collider.java index 479cfc2f..c7a2fa51 100644 --- a/racevisionGame/src/main/java/mock/model/collider/Collider.java +++ b/racevisionGame/src/main/java/mock/model/collider/Collider.java @@ -7,15 +7,15 @@ import mock.model.MockBoat; */ public interface Collider { /** - * Indicates whether a ray cast from a boat to a target collider triggers a collision with the specified parameters. + * Indicates whether a ray cast from a boat to a target collider is within the specified length. * @param boat potentially colliding with target - * @param collision parameters of valid collision + * @param distance distance for valid collision * @return whether or not a collision has occurred */ - boolean rayCast(MockBoat boat, Collision collision); + boolean rayCast(MockBoat boat, double distance); /** - * Indicates whether a ray cast from a boat to a target collider triggers a collision. Parameters are set by the object. + * Indicates whether a ray cast from a boat to a target collider triggers a collision. Distance is set by the object. * @param boat potentially colliding with target * @return whether or not a collision has occurred */ diff --git a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java index 59eb742b..7127b75c 100644 --- a/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java +++ b/racevisionGame/src/main/java/mock/model/collider/ColliderRegistry.java @@ -35,7 +35,7 @@ public class ColliderRegistry implements Collider { } @Override - public boolean rayCast(MockBoat boat, Collision collision) { + public boolean rayCast(MockBoat boat, double distance) { return false; } diff --git a/racevisionGame/src/main/java/shared/model/CompoundMark.java b/racevisionGame/src/main/java/shared/model/CompoundMark.java index 1787562d..29bbd10f 100644 --- a/racevisionGame/src/main/java/shared/model/CompoundMark.java +++ b/racevisionGame/src/main/java/shared/model/CompoundMark.java @@ -146,27 +146,28 @@ public class CompoundMark implements Collider { } @Override - public boolean rayCast(MockBoat boat, Collision collision) { + public boolean rayCast(MockBoat boat, double distance) { GPSCoordinate position = boat.getCurrentPosition(); - double distance = GPSCoordinate.calculateDistanceMeters(position, closestMark(position).getPosition()); + double actualDistance = GPSCoordinate.calculateDistanceMeters(position, closestMark(position).getPosition()); // Compass direction of collider Bearing absolute = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(position, closestMark(position).getPosition())); // Direction of collider from heading Bearing relative = Bearing.fromDegrees(absolute.degrees() - boat.getBearing().degrees()); - if(distance <= collision.getDistance() && (int)relative.degrees() == (int)collision.getBearing().degrees()) { - onCollisionEnter(collision); + if(actualDistance <= distance) { + onCollisionEnter(new Collision(relative, distance)); return true; } else return false; } @Override public boolean rayCast(MockBoat boat) { - return rayCast(boat, new Collision(Bearing.fromDegrees(0), 100)); + return rayCast(boat, 100); } @Override public void onCollisionEnter(Collision e) { - System.out.println(e.getBearing().degrees()); + if(e.getBearing().degrees() < 90) System.out.println("Starboard"); + else if(e.getBearing().degrees() > 270) System.out.println("Port"); } } diff --git a/racevisionGame/src/test/java/mock/model/MockBoatTest.java b/racevisionGame/src/test/java/mock/model/MockBoatTest.java index 61762192..10792a12 100644 --- a/racevisionGame/src/test/java/mock/model/MockBoatTest.java +++ b/racevisionGame/src/test/java/mock/model/MockBoatTest.java @@ -12,8 +12,8 @@ import static org.junit.Assert.*; public class MockBoatTest { private MockBoat boat; - private CompoundMark ahead; - private CompoundMark behind; + private CompoundMark near; + private CompoundMark far; @Before public void setUp() { @@ -21,17 +21,17 @@ public class MockBoatTest { boat.setCurrentPosition(new GPSCoordinate(0,0)); boat.setBearing(Bearing.fromDegrees(180)); - ahead = new CompoundMark(0, "Ahead", new Mark(0, "Ahead", new GPSCoordinate(-.0001, 0))); - behind = new CompoundMark(1, "Behind", new Mark(0, "Behind", new GPSCoordinate(.0001, 0))); + near = new CompoundMark(0, "Near", new Mark(0, "Near", new GPSCoordinate(-.0001, 0))); + far = new CompoundMark(1, "Far", new Mark(0, "Far", new GPSCoordinate(.001, 0))); } @Test - public void markAheadOfBoat0() { - assertTrue(ahead.rayCast(boat, new Collision(Bearing.fromDegrees(0), 100))); + public void nearMarkWithin100m() { + assertTrue(near.rayCast(boat, 100)); } @Test - public void markBehindBoat180() { - assertTrue(behind.rayCast(boat, new Collision(Bearing.fromDegrees(180), 100))); + public void farMarkBeyond100m() { + assertFalse(far.rayCast(boat, 100)); } }