package iamrescue.agent.firebrigade;
import java.util.Map;
import javolution.util.FastMap;
import rescuecore2.standard.entities.Building;
public class FastFireDistanceArray {
private Map<Integer, Float> distances; // maps distance with time
private float angle; // direction of fire spreading
private float averageSpeed;
private Building frontier;
private Building previousFrontier;
/**
* Constructor of the class
*
* @param center initial frontier (commonly the centre of the fire site)
* @param angle direction of the fire
*
*/
public FastFireDistanceArray(Building center, float angle){
this.angle = angle;
this.frontier = center;
this.previousFrontier = center;
distances = new FastMap<Integer, Float>();
}
/**
*
* @return current angle ~ direction of the Fire
*
*/
public double getAngle(){
return angle;
}
public float getAverageSpeed(){
return averageSpeed;
}
/**
* the following method add a new distance to the estimate
*
* @param time current time step
* @param distance to memorise
*/
public void addDistance(int time, float distance) {
Float previousDistance = this.distances.get(time);
this.distances.put(new Integer(time), distance);
if(previousDistance == null){
// System.out.println(frontierBuilding + " the distance to be added is: " + distance);
this.averageSpeed += distance / time;
}
else
this.averageSpeed = averageSpeed + (distance - previousDistance) / time;
// this.lastUpdatedTime = time;
}
/**
* calculate the estimated average of the speed of fire in a certain direction
*
* @param time at which we want the estimate to work
*
* @return the estimated distance of where the fire is going to be after @param time time-steps
*
*/
public double getPredictedDistance(int time) {
// return (averageSpeed / distances.size())*(time - lastUpdatedTime);
return (averageSpeed / distances.size())*time;
}
/**
*
* @return distances vector
*/
public Map<Integer, Float> getDistances(){
return distances;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
FireDistanceArray compareArray = (FireDistanceArray) obj;
boolean anglesAreEquals = false;
boolean frontiersAreEquals = false;
boolean distancesAreEquals = false;
if(angle == compareArray.getAngle()){
// System.out.println("angles are: " + angle + " " + compareArray.getAngle());
anglesAreEquals = true;
}
if(distances.equals(compareArray.getDistances())) distancesAreEquals = true;
return anglesAreEquals && frontiersAreEquals && distancesAreEquals;
}
@Override
protected Object clone() throws CloneNotSupportedException {
FastFireDistanceArray clone = new FastFireDistanceArray(this.frontier, this.angle);
clone.averageSpeed = this.averageSpeed;
for (Integer time : this.distances.keySet())
clone.addDistance(time, this.distances.get(time));
return clone;
}
public void setAverageSpeed(Float speed) {
averageSpeed = speed;
}
public void setFrontierBuilding(Building building) {
this.frontier = building;
}
public Building getFrontierBuilding() {
return frontier;
}
public Building getPreviousFrontier() {
return previousFrontier;
}
public void setPreviousFrontier(Building previousFrontier) {
this.previousFrontier = previousFrontier;
}
}