package rescuecore2.standard.entities;
import rescuecore2.worldmodel.EntityID;
import rescuecore2.misc.geometry.Point2D;
import rescuecore2.misc.geometry.Line2D;
/**
An edge is a line segment with an optional neighbouring entity. Edges without neighbours are impassable, edges with neighbours are passable.
*/
public class Edge {
private Point2D start;
private Point2D end;
private Line2D line;
private EntityID neighbour;
/**
Constuct an impassable Edge.
@param startX The X coordinate of the first endpoint.
@param startY The Y coordinate of the first endpoint.
@param endX The X coordinate of the second endpoint.
@param endY The Y coordinate of the second endpoint.
*/
public Edge(int startX, int startY, int endX, int endY) {
this(new Point2D(startX, startY), new Point2D(endX, endY), null);
}
/**
Constuct an impassable Edge.
@param start The first endpoint coordinates.
@param end The second endpoint coordinates.
*/
public Edge(Point2D start, Point2D end) {
this(start, end, null);
}
/**
Constuct an Edge. If the neighbour is null then this edge is impassable; if it is non-null then this edge is passable.
@param startX The X coordinate of the first endpoint.
@param startY The Y coordinate of the first endpoint.
@param endX The X coordinate of the second endpoint.
@param endY The Y coordinate of the second endpoint.
@param neighbour The ID of the neighbour on the other side of this edge. This may be null to indicate an impassable edge.
*/
public Edge(int startX, int startY, int endX, int endY, EntityID neighbour) {
this(new Point2D(startX, startY), new Point2D(endX, endY), neighbour);
}
/**
Constuct an Edge. If the neighbour is null then this edge is impassable; if it is non-null then this edge is passable.
@param start The first endpoint coordinates.
@param end The second endpoint coordinates.
@param neighbour The ID of the neighbour on the other side of this edge. This may be null to indicate an impassable edge.
*/
public Edge(Point2D start, Point2D end, EntityID neighbour) {
this.start = start;
this.end = end;
this.neighbour = neighbour;
line = new Line2D(start, end);
}
/**
Get the X coordinate of the first endpoint.
@return The X coordinate of the first endpoint.
*/
public int getStartX() {
return (int)start.getX();
}
/**
Get the Y coordinate of the first endpoint.
@return The Y coordinate of the first endpoint.
*/
public int getStartY() {
return (int)start.getY();
}
/**
Get the X coordinate of the second endpoint.
@return The X coordinate of the second endpoint.
*/
public int getEndX() {
return (int)end.getX();
}
/**
Get the Y coordinate of the second endpoint.
@return The Y coordinate of the second endpoint.
*/
public int getEndY() {
return (int)end.getY();
}
/**
Get the start point.
@return The start point.
*/
public Point2D getStart() {
return start;
}
/**
Get the end point.
@return The end point.
*/
public Point2D getEnd() {
return end;
}
/**
Get the ID of the neighbour.
@return The ID of the neighbour or null if this edge is impassable.
*/
public EntityID getNeighbour() {
return neighbour;
}
/**
Find out if this edge is passable or not.
@return True iff the neighbour is non-null.
*/
public boolean isPassable() {
return neighbour != null;
}
/**
Get a line representing this edge.
@return A Line2D representing this edge.
*/
public Line2D getLine() {
return line;
}
@Override
public String toString() {
return "Edge from " + start + " to " + end + " (" + (neighbour == null ? "impassable" : "neighbour: " + neighbour) + ")";
}
}