/*******************************************************************************
* TurtleKit 3 - Agent Based and Artificial Life Simulation Platform
* Copyright (C) 2011-2014 Fabien Michel
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package turtlekit.flocking;
import java.util.logging.Level;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import madkit.simulation.SimulationException;
import madkit.simulation.probe.PropertyProbe;
import turtlekit.agr.TKOrganization;
import turtlekit.gui.util.ChartsUtil;
import turtlekit.viewer.AbstractObserver;
public class HeadingChecker extends AbstractObserver {
private PropertyProbe<BirdFlockingUnify,Double> probeHeading;
private XYSeries heading;
private int index = 0;
public HeadingChecker() {
createGUIOnStartUp(); //prevent inappropriate launching and thus null pointer
}
/**
* Just to do some initialization work
*/
@Override
protected void activate() {
setLogLevel(Level.ALL);
super.activate();
probeHeading = new PropertyProbe<BirdFlockingUnify,Double>(getCommunity(), TKOrganization.TURTLES_GROUP, TKOrganization.TURTLE_ROLE, "angle");
addProbe(probeHeading);
}
@Override
public void setupFrame(JFrame frame) {
XYSeriesCollection dataset = new XYSeriesCollection();
final ChartPanel chartPanel = ChartsUtil.createChartPanel(dataset, "Average heading", null, null);
chartPanel.setPreferredSize(new java.awt.Dimension(550, 250));
heading = new XYSeries("Average heading");
dataset.addSeries(heading);
frame.setContentPane(chartPanel);
frame.setLocation(50, 0);
// XYSeries s = dataset.getSeries("Total");
}
@Override
protected void observe() {
double averageHeading = 0;
double averageSpeed = 0;
for (BirdFlockingUnify a : probeHeading.getCurrentAgentsList()) {
averageHeading += probeHeading.getPropertyValue(a);
}
averageHeading /= (double) probeHeading.size();
if(index % 10000 == 0){
heading.clear();
}
try {
heading.add(index, averageHeading);
} catch (SimulationException | NullPointerException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
index++;
}
}