/**
** TurkanaSouthModelWithUI.java
**
** Copyright 2011 by Andrew Crooks, Joey Harrison, Mark Coletti, and
** George Mason University.
**
** Licensed under the Academic Free License version 3.0
**
** See the file "LICENSE" for more information
**
** $Id$
**/
package sim.app.geo.turkana;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import org.jfree.data.xy.XYSeries;
import sim.display.Controller;
import sim.display.Display2D;
import sim.display.GUIState;
import sim.engine.SimState;
import sim.engine.Steppable;
import sim.field.grid.IntGrid2D;
import sim.portrayal.grid.FastValueGridPortrayal2D;
import sim.portrayal.grid.SparseGridPortrayal2D;
import sim.portrayal.simple.MovablePortrayal2D;
import sim.portrayal.simple.OvalPortrayal2D;
import sim.util.gui.SimpleColorMap;
import sim.util.media.chart.*;
/*
* TurkanaSouthModelWithUI
* Main GUI class for the TurkanaSouth model.
*
* Author: Joey Harrison
*
*/
public class TurkanaSouthModelWithUI extends GUIState
{
public Display2D display;
public JFrame displayFrame;
FastValueGridPortrayal2D populationDensityPortrayal = new FastValueGridPortrayal2D("Population Density");
FastValueGridPortrayal2D rainPortrayal = new FastValueGridPortrayal2D("Rain");
FastValueGridPortrayal2D vegetationPortrayal = new FastValueGridPortrayal2D("Vegetation");
SparseGridPortrayal2D agentPortrayal = new SparseGridPortrayal2D();
JFrame populationStatsFrame;
public TimeSeriesChartGenerator populationStatsChart = new TimeSeriesChartGenerator();
private XYSeries populationSeries;
TurkanaSouthModel model;
public TurkanaSouthModelWithUI()
{
super(new TurkanaSouthModel(System.currentTimeMillis()));
model = (TurkanaSouthModel) state;
}
public TurkanaSouthModelWithUI(SimState state)
{
super(state);
model = (TurkanaSouthModel) state;
}
public static String getName()
{
return "Turkana South";
}
@Override
public Object getSimulationInspectedObject()
{
return state;
} // non-volatile
@Override
public void load(SimState state)
{
super.load(state);
setupPortrayals();
}
@Override
public void start()
{
super.start();
setupPortrayals();
populationSeries.clear(); // clear the data for the chart
}
@SuppressWarnings("serial")
public void setupPortrayals()
{
int maxValue = ((IntGrid2D)model.populationDensityGrid.getGrid()).max();
populationDensityPortrayal.setField(model.populationDensityGrid.getGrid());
populationDensityPortrayal.setMap(
new SimpleColorMap(0, maxValue, Color.black, Color.white) {
@Override
public double filterLevel(double level) {
// since the population grid values are all very small except
// a few verge large values, scale the color map nonlinearly
// so the low values don't just appear black
return Math.sqrt(level);
}
});
rainPortrayal.setField(model.rainGrid);
rainPortrayal.setMap(new SimpleColorMap(0, 1, Color.black, Color.white));
vegetationPortrayal.setField(model.vegetationGrid);
vegetationPortrayal.setMap(new SimpleColorMap(0, model.maxVegetationLevel, Color.black, Color.green));
agentPortrayal.setField(model.agentGrid);
agentPortrayal.setPortrayalForAll(new MovablePortrayal2D(new OvalPortrayal2D(Color.blue, 0.7)));
this.scheduleRepeatingImmediatelyAfter(new Steppable() {
@Override
public void step(SimState state) {
populationSeries.add(state.schedule.getTime() / model.ticksPerMonth, model.agents.size());
}
});
populationStatsChart.repaint();
display.reset();
display.repaint();
}
@Override
public void init(Controller c)
{
super.init(c);
// since we're running the GUI, don't print stats
model.printStats = false;
display = new Display2D(model.windowWidth, model.windowHeight, this); // at 400x400, we've got 4x4 per array position
displayFrame = display.createFrame();
displayFrame.setTitle("Turkana South");
c.registerFrame(displayFrame); // register the frame so it appears in the "Display" list
displayFrame.setVisible(true);
display.attach(populationDensityPortrayal, "Pop. Density");
display.attach(rainPortrayal, "Rain", false);
display.attach(vegetationPortrayal, "Vegetation", true);
display.attach(agentPortrayal, "Turkanians");
display.setBackdrop(Color.black);
c.registerFrame(createPopulationStatsFrame());
//populationStatsFrame.setVisible(true);
}
public JFrame createPopulationStatsFrame()
{
populationSeries = new XYSeries("Population");
populationStatsChart = new TimeSeriesChartGenerator();
populationStatsChart.setTitle("Population Statistics");
((TimeSeriesAttributes)(populationStatsChart.addSeries(populationSeries, null))).setStrokeColor(Color.blue);
populationStatsChart.setXAxisLabel("Time in months");
populationStatsChart.setYAxisLabel("Population");
populationStatsFrame = populationStatsChart.createFrame(this);
populationStatsFrame.getContentPane().setLayout(new BorderLayout());
populationStatsFrame.getContentPane().add(populationStatsChart, BorderLayout.CENTER);
populationStatsFrame.pack();
return populationStatsFrame;
}
public void quit()
{
super.quit();
if (populationStatsFrame != null)
{
populationStatsFrame.dispose();
}
populationStatsFrame = null;
}
/**
* @param args
*/
public static void main(String[] args)
{
new TurkanaSouthModelWithUI().createController();
}
}