package iamrescue.routing.gui;
import iamrescue.agent.firebrigade.FastFirePredictor;
import iamrescue.agent.firebrigade.FastFireSite;
import iamrescue.agent.firebrigade.FastImportanceModel;
import java.awt.Color;
import java.awt.Graphics2D;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javolution.util.FastSet;
import rescuecore2.misc.gui.ScreenTransform;
import rescuecore2.standard.entities.Building;
import rescuecore2.standard.view.StandardViewLayer;
import rescuecore2.view.RenderedObject;
import rescuecore2.view.ViewComponent;
import rescuecore2.view.ViewListener;
import rescuecore2.worldmodel.EntityID;
public class BuildingImportanceLayer extends StandardViewLayer implements
ViewListener {
private static final Color[] colours = new Color[] { Color.BLACK,
Color.BLUE, Color.RED, Color.GREEN, Color.CYAN, Color.PINK,
Color.MAGENTA };
private FastFirePredictor firePredictor;
private NumberFormat format;
public BuildingImportanceLayer(FastFirePredictor firePredictor) {
this.firePredictor = firePredictor;
format = NumberFormat.getInstance();
format.setMaximumFractionDigits(4);
}
/*
* (non-Javadoc)
*
* @see rescuecore2.view.ViewLayer#getName()
*/
@Override
public String getName() {
return "Importance Model";
}
/*
* (non-Javadoc)
*
* @see rescuecore2.view.ViewLayer#render(java.awt.Graphics2D,
* rescuecore2.misc.gui.ScreenTransform, int, int)
*/
@Override
public Collection<RenderedObject> render(Graphics2D g,
ScreenTransform transform, int width, int height) {
List<FastFireSite> fireSites = firePredictor.getFireSites();
FastImportanceModel importanceModel = firePredictor
.getImportanceModel();
Set<Building> fringe = new FastSet<Building>();
for (FastFireSite fireSite : fireSites) {
fringe.addAll(fireSite.getFringe());
}
int siteCounter = 0;
// System.out.println("There are " + fireSites.size() + " fire sites.");
for (FastFireSite fireSite : fireSites) {
g.setColor(colours[siteCounter % colours.length]);
siteCounter++;
Map<EntityID, Building> buildingsOnFire = fireSite
.getBuildingsOnFire();
Building highest = null;
double highestImportance = Double.MIN_VALUE;
for (Building building : buildingsOnFire.values()) {
/*
* if (!fringe.contains(building)) { continue; }
*/
// System.out.print(building.getFullDescription());
double contextImportance = firePredictor.calculateImportance(building);
if (contextImportance > highestImportance
&& fringe.contains(building)) {
highestImportance = contextImportance;
highest = building;
}
double realImportance = firePredictor
.calculateImportance(building);
int x1 = transform.xToScreen(building.getX());
int y1 = transform.yToScreen(building.getY());
g.drawString("FS"
+ siteCounter
+ ": "
+ realImportance
+ " ["
+ "ci:"
+ firePredictor.calculateContextDependentImportance(building)
+ ",i:"
+ firePredictor.getImportanceModel().getImportance(
building) + "]", x1, y1);
// g.drawOval(x1, y1 - 20, 10, 10);
}
if (highest != null) {
g.setColor(Color.RED);
int x1 = transform.xToScreen(highest.getX());
int y1 = transform.yToScreen(highest.getY());
g.drawOval(x1 - 10, y1 - 10, 20, 20);
// System.out.println("\nHighest importance: "
// + highest.getFullDescription() + ", importance: "
// + highestImportance);
}
}
return new ArrayList<RenderedObject>();
}
/*
* (non-Javadoc)
*
* @seerescuecore2.view.ViewListener#objectsClicked(rescuecore2.view.
* ViewComponent, java.util.List)
*/
@Override
public void objectsClicked(ViewComponent view, List<RenderedObject> objects) {
/*
* for (RenderedObject obj : objects) { if (obj.getObject() instanceof
* Building) { System.out.print } }
*/}
/*
* (non-Javadoc)
*
* @seerescuecore2.view.ViewListener#objectsRollover(rescuecore2.view.
* ViewComponent, java.util.List)
*/
@Override
public void objectsRollover(ViewComponent view, List<RenderedObject> objects) {
// TODO Auto-generated method stub
}
}