package simulation.entity; import sim.engine.SimState; import sim.engine.Steppable; import simulation.SimulationModel; @SuppressWarnings("serial") public class Entity implements Steppable { private static int GRID_SIZE_X; private static int GRID_SIZE_Y; protected int x; protected int y; protected SimulationModel simModel; public Entity(SimulationModel simModel) { this.simModel = simModel; } public static int getGRID_SIZE_X() { return GRID_SIZE_X; } public static void setGRID_SIZE_X(int gRID_SIZE_X) { GRID_SIZE_X = gRID_SIZE_X; } public static int getGRID_SIZE_Y() { return GRID_SIZE_Y; } public static void setGRID_SIZE_Y(int gRID_SIZE_Y) { GRID_SIZE_Y = gRID_SIZE_Y; } public float getY() { return simModel.getYard().getObjectLocation(this).y; } public float getX() { return simModel.getYard().getObjectLocation(this).x; } public void setX(float x) { simModel.getYard().setObjectLocation(this, (int) x, (int)getY()); } public void setY(float y) { simModel.getYard().setObjectLocation(this, simModel.getYard().getObjectLocation(this).x,(int) y); } protected boolean isSameLocation(int x,int y) { if (x ==(int)getX() && y == (int)getY()) return true; else return false; } protected boolean isSameLocation(Entity entity) { if (entity.getX() == (int)getX() && entity.getY() == (int)getY()) return true; else return false; } protected int getXShortestDirection(int x) { int xa = (int) getX(); int xb = x; int minAbsDx = Math.min(Math.abs(xb - xa), GRID_SIZE_X - Math.abs(xb - xa)); if (minAbsDx == Math.abs(xb - xa)) { return xb - xa; } else { return GRID_SIZE_X - (xb - xa); } } protected int getXShortestDirection(Entity entity) { int xa = (int) getX(); int xb = (int) entity.getX(); int minAbsDx = Math.min(Math.abs(xb - xa), GRID_SIZE_X - Math.abs(xb - xa)); if (minAbsDx == Math.abs(xb - xa)) { return xb - xa; } else { return GRID_SIZE_X - (xb - xa); } } protected int getYShortestDirection(int y) { int ya = (int) getY(); int yb = y; int minAbsDy = Math.min(Math.abs(yb - ya), GRID_SIZE_Y - Math.abs(yb - ya)); if (minAbsDy == Math.abs(yb - ya)) { return yb - ya; } else { return GRID_SIZE_Y - (yb - ya); } } protected int getYShortestDirection(Entity entity) { int ya = (int)getY(); int yb = (int) entity.getY(); int minAbsDy = Math.min(Math.abs(yb - ya), GRID_SIZE_Y - Math.abs(yb - ya)); if (minAbsDy == Math.abs(yb - ya)) { return yb - ya; } else { return GRID_SIZE_Y - (yb - ya); } } protected double getShortestDistanceToPoint(int x, int y){ int xa = (int)getX(); int xb = x; int ya = (int)getY(); int yb = y; if((xa==xb)&&(ya==yb)){ return 0; }else{ int dX = Math.min(Math.abs(xb - xa), GRID_SIZE_X - Math.abs(xb - xa)); int dY = Math.min(Math.abs(yb - ya), GRID_SIZE_Y - Math.abs(yb - ya)); double distance = Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2)); return distance; } } protected double getShortestDistanceToEntity(Entity entity) { /** Dx = min(abs(xb-xa) , X - abs(xb-xa)) avec X largeur de la grille **/ /** Dy = min(abs(yb-ya) , X - abs(yb-ya)) avec Y hauteur de la grille **/ /** Distance finale : entier le plus proche de sqrt(Dx^2 + Dy^2) **/ int xa = (int)getX(); int xb = (int)entity.getX(); int ya = (int)getY(); int yb = (int)entity.getY(); int dX = Math.min(Math.abs(xb - xa), GRID_SIZE_X - Math.abs(xb - xa)); int dY = Math.min(Math.abs(yb - ya), GRID_SIZE_Y - Math.abs(yb - ya)); double distance = Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2)); return distance; } public String toString() { return "(x: " + x + ", y: " + y + ")"; } @Override public void step(SimState arg0) { x = simModel.getYard().getObjectLocation(this).x; y = simModel.getYard().getObjectLocation(this).y; } }