/**
*
*/
package iamrescue.agent.firebrigade;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import rescuecore2.misc.gui.ScreenTransform;
import rescuecore2.standard.entities.Building;
import rescuecore2.standard.view.StandardViewLayer;
import rescuecore2.view.RenderedObject;
public class HeatTransferGraphLayer extends StandardViewLayer {
private static final Color EDGE_COLOR = new Color(160, 52, 52, 255);
private static final float MAX_LINE_WIDTH = 20;
private HeatTransferGraph graph;
private double maxCoef = Integer.MIN_VALUE;
public HeatTransferGraphLayer(HeatTransferGraph graph) {
this.graph = graph;
Collection<Building> buildings = graph.getBuildings();
for (Building building : buildings) {
Map<Building, Double> coef = graph.getHeatTransferRays(building);
for (Building neigh : coef.keySet()) {
if (neigh.equals(building))
continue;
maxCoef = Math.max(maxCoef, coef.get(neigh));
}
}
}
/*
* (non-Javadoc)
*
* @see rescuecore2.view.ViewLayer#getName()
*/
@Override
public String getName() {
return "Fire Model Graph";
}
/*
* (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) {
g.setColor(Color.BLACK);
Collection<Building> vertices = graph.getGraph().getVertices();
Set<Building> done = new HashSet<Building>();
for (Building building : vertices) {
done.add(building);
int x1 = transform.xToScreen(building.getX());
int y1 = transform.yToScreen(building.getY());
for (Building neighbour : graph.getNeighbouringBuildings(building)) {
if (done.contains(neighbour))
continue;
int x2 = transform.xToScreen(neighbour.getX());
int y2 = transform.yToScreen(neighbour.getY());
int halfWayX = (x1 + x2) / 2;
int halfWayY = (y1 + y2) / 2;
Stroke stroke = g.getStroke();
Color c = g.getColor();
g.setColor(EDGE_COLOR);
Double from = graph.getHeatTransferRays(building)
.get(neighbour);
Double to = graph.getHeatTransferRays(neighbour).get(building);
from = from == null ? 0 : from;
to = to == null ? 0 : to;
float strokeWidthFrom = (float) ((from / maxCoef) * MAX_LINE_WIDTH);
float strokeWidthTo = (float) ((to / maxCoef) * MAX_LINE_WIDTH);
if (strokeWidthFrom >= 1.0) {
g.setStroke(new BasicStroke(strokeWidthFrom,
BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
g.drawLine(x1, y1, halfWayX, halfWayY);
}
if (strokeWidthTo >= 1.0) {
g.setStroke(new BasicStroke(strokeWidthTo,
BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
g.drawLine(halfWayX, halfWayY, x2, y2);
}
g.setStroke(stroke);
g.setColor(c);
}
// g.drawString("N " + building.getID(), x1, y1);
}
return new ArrayList<RenderedObject>();
}
}