Allow collision checking to provide collision parameters to ray casting method

- Added tests for MockBoat collision direction and distance

#story[1100]
main
cbt24 8 years ago
parent 2fbb96afd7
commit 7d64a43350

@ -207,15 +207,23 @@ public class MockBoat extends Boat implements Collider {
} }
@Override @Override
public boolean rayCast(MockBoat boat) { public boolean rayCast(MockBoat boat, Collision collision) {
double distance = GPSCoordinate.calculateDistanceMeters(boat.getCurrentPosition(), this.getCurrentPosition()); double distance = GPSCoordinate.calculateDistanceMeters(boat.getCurrentPosition(), this.getCurrentPosition());
Bearing bearing = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(boat.getCurrentPosition(), this.getCurrentPosition())); Bearing bearing = GPSCoordinate.calculateBearing(boat.getCurrentPosition(), this.getCurrentPosition());
if(distance < 100 && boat != this) {
onCollisionEnter(new Collision(bearing, distance)); if(distance <= collision.getDistance() && (int)bearing.degrees() == (int)collision.getBearing().degrees()) {
onCollisionEnter(collision);
return true; return true;
} else return false; } else return false;
} }
@Override
public boolean rayCast(MockBoat boat) {
if(boat != this) {
return rayCast(boat, new Collision(Bearing.fromDegrees(0), 100));
} else return false;
}
@Override @Override
public void onCollisionEnter(Collision e) { public void onCollisionEnter(Collision e) {
System.out.println(e.getBearing().degrees()); System.out.println(e.getBearing().degrees());

@ -7,7 +7,15 @@ import mock.model.MockBoat;
*/ */
public interface Collider { public interface Collider {
/** /**
* Indicates whether a ray cast from a boat to a target collider triggers a collision. * Indicates whether a ray cast from a boat to a target collider triggers a collision with the specified parameters.
* @param boat potentially colliding with target
* @param collision parameters of valid collision
* @return whether or not a collision has occurred
*/
boolean rayCast(MockBoat boat, Collision collision);
/**
* Indicates whether a ray cast from a boat to a target collider triggers a collision. Parameters are set by the object.
* @param boat potentially colliding with target * @param boat potentially colliding with target
* @return whether or not a collision has occurred * @return whether or not a collision has occurred
*/ */

@ -34,6 +34,11 @@ public class ColliderRegistry implements Collider {
for(Collider collider: colliders) addCollider(collider); for(Collider collider: colliders) addCollider(collider);
} }
@Override
public boolean rayCast(MockBoat boat, Collision collision) {
return false;
}
@Override @Override
public boolean rayCast(MockBoat boat) { public boolean rayCast(MockBoat boat) {
for(Collider collider: colliders) { for(Collider collider: colliders) {

@ -5,11 +5,6 @@ import mock.model.MockBoat;
import mock.model.collider.Collider; import mock.model.collider.Collider;
import mock.model.collider.Collision; import mock.model.collider.Collision;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/** /**
* Represents a compound mark - that is, either one or two individual marks which form a single compound mark. * Represents a compound mark - that is, either one or two individual marks which form a single compound mark.
*/ */
@ -151,16 +146,25 @@ public class CompoundMark implements Collider {
} }
@Override @Override
public boolean rayCast(MockBoat boat) { public boolean rayCast(MockBoat boat, Collision collision) {
GPSCoordinate position = boat.getCurrentPosition(); GPSCoordinate position = boat.getCurrentPosition();
double distance = GPSCoordinate.calculateDistanceMeters(position, closestMark(position).getPosition()); double distance = GPSCoordinate.calculateDistanceMeters(position, closestMark(position).getPosition());
Bearing bearing = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(position, closestMark(position).getPosition())); // Compass direction of collider
if(distance < 100) { Bearing absolute = Bearing.fromAzimuth(GPSCoordinate.calculateAzimuth(position, closestMark(position).getPosition()));
onCollisionEnter(new Collision(bearing, distance)); // 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);
return true; return true;
} else return false; } else return false;
} }
@Override
public boolean rayCast(MockBoat boat) {
return rayCast(boat, new Collision(Bearing.fromDegrees(0), 100));
}
@Override @Override
public void onCollisionEnter(Collision e) { public void onCollisionEnter(Collision e) {
System.out.println(e.getBearing().degrees()); System.out.println(e.getBearing().degrees());

@ -1,7 +1,37 @@
package mock.model; package mock.model;
import mock.model.collider.Collision;
import org.junit.Before;
import org.junit.Test;
import shared.model.Bearing;
import shared.model.CompoundMark;
import shared.model.GPSCoordinate;
import shared.model.Mark;
import static org.junit.Assert.*; import static org.junit.Assert.*;
public class MockBoatTest { public class MockBoatTest {
//TODO private MockBoat boat;
private CompoundMark ahead;
private CompoundMark behind;
@Before
public void setUp() {
boat = new MockBoat(0, "Bob", "NZ", null);
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)));
}
@Test
public void markAheadOfBoat0() {
assertTrue(ahead.rayCast(boat, new Collision(Bearing.fromDegrees(0), 100)));
}
@Test
public void markBehindBoat180() {
assertTrue(behind.rayCast(boat, new Collision(Bearing.fromDegrees(180), 100)));
}
} }

Loading…
Cancel
Save