Allow collision checking to provide collision parameters to ray casting method
- Added tests for MockBoat collision direction and distance #story[1100]
This commit is contained in:
@@ -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)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user