import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.zip.*; import java.util.*; // RoboGrapher by PEZ // Based on Kawigi's FloodGrapher // // This is open source. You may use the code as you wish as long as you don't modify // the "license" and always include references to where the code came from. But mostly // you are encouraged to improve RoboGrapher and post the improvements on: // // http://robowiki.dyndns.org/?RoboGrapher public class RoboGrapher extends Canvas implements ItemListener, WindowListener { private static int[] segmentLengths = { 3, 5, 5 }; private static final int SEGMENTS = segmentLengths.length; private static String[][] segmentLabels = { { "Acceleration", "Decelerating", "Constant", "Accelerating" }, { "Distance", "a", "b", "c", "d", "e" }, { "Fire power", "a", "b", "c", "d", "e" } }; private int[][][][][] stats; private int[] graph; private int buckets; private static Choice fileChooser; private static Choice[] segmentChoosers = new Choice[SEGMENTS]; private static File folder; private static Button refreshFileListButton; int graphWidth = 425; int graphHeight = 425; public static void main(String args[]) { RoboGrapher grapher = new RoboGrapher(); Frame frame = new Frame("Robo Grapher"); frame.setSize(760, 540); try { folder = new File(args[args.length-1]); } catch (Exception e) { folder = new File(".robotcache/pez.TityusMega_0.2.2.jar_/pez/TityusMega.data/"); } fileChooser = new Choice(); refreshFileList(); fileChooser.addItemListener(grapher); for (int i = 0; i < SEGMENTS; i++) { segmentChoosers[i] = new Choice(); segmentChoosers[i].addItem("All segments"); for (int j = 1, n = segmentLabels[i].length; j < n; j++) { segmentChoosers[i].addItem(segmentLabels[i][j]); } segmentChoosers[i].addItemListener(grapher); } Panel controls = new Panel(new GridLayout(20, 1)); refreshFileListButton = new Button("Refresh file list"); controls.add(refreshFileListButton); controls.add(new Label("File:")); controls.add(fileChooser); for (int i = 0; i < SEGMENTS; i++) { controls.add(new Label(segmentLabels[i][0])); controls.add(segmentChoosers[i]); } frame.setLayout(null); frame.add(grapher); grapher.setBounds(25, 20, 500, 500); frame.add(controls); controls.setBounds(525, 20, 200, 500); frame.addWindowListener(grapher); frame.show(); } public void itemStateChanged(ItemEvent e) { if (e.getSource() == fileChooser) { loadFile(); } else if (e.getSource() == refreshFileListButton) { refreshFileList(); } resetGraph(); } static void refreshFileList() { String[] filenames = folder.list(); fileChooser.removeAll(); fileChooser.addItem(""); if (filenames != null) for (int i=0; i<filenames.length; i++) fileChooser.addItem(filenames[i]); } public void loadFile() { try { ZipInputStream zipin = new ZipInputStream(new FileInputStream(new File(folder, fileChooser.getSelectedItem()))); zipin.getNextEntry(); ObjectInputStream in = new ObjectInputStream(zipin); stats = (int[][][][][])in.readObject(); buckets = 23; //stats.length; in.close(); } catch (Exception ex) { System.out.println("problem: " + ex); ex.printStackTrace(); } } public void resetGraph() { if (stats == null) return; graph = new int[buckets]; int[] min = new int[SEGMENTS]; int[] max = new int[SEGMENTS]; for (int i = 0; i < SEGMENTS; i++) { if (segmentChoosers[i].getSelectedIndex() == 0) { min[i] = 0; max[i] = segmentLengths[i] - 1; } else { min[i] = max[i] = segmentChoosers[i].getSelectedIndex() - 1; } } for (int s0 = min[0]; s0 <= max[0]; s0++) { for (int s1 = min[1]; s1 <= max[1]; s1++) { for (int s2 = min[2]; s2 <= max[2]; s2++) { int samplesize=0, maxSamples=0; for (int bucket = 0; bucket < buckets; bucket++) { graph[bucket] += stats[s0][s1][s2][0][bucket]; samplesize += stats[s0][s1][s2][0][bucket]; maxSamples = Math.max(maxSamples, stats[s0][s1][s2][0][bucket]); } } } } repaint(); } public void paint(Graphics g) { g.setColor(Color.black); g.translate(25, 25); g.drawRect(0, 0, graphWidth, graphHeight); g.drawString("-0.5", graphWidth / 4, graphHeight + 20); g.drawString("0.0", graphWidth / 2, graphHeight + 20); g.drawString("0.5", 3 * graphWidth / 4, graphHeight + 20); g.setColor(Color.gray); g.drawLine(graphWidth / 4, 0, graphWidth / 4, graphHeight); g.drawLine(graphWidth / 2, 0, graphWidth / 2, graphHeight); g.drawLine(3 * graphWidth / 4, 0, 3 * graphWidth / 4, graphHeight); if (graph == null) return; int maxgraph = 0; int samples = 0; for (int i = 0; i < buckets; i++) { samples += graph[i]; if (graph[i] > maxgraph) maxgraph = graph[i]; } g.setColor(Color.blue); if (maxgraph > 0) for (int i = 0; i < buckets - 1; i++) g.drawLine((i * graphWidth) / (buckets - 1), graphHeight - graphHeight * graph[i] / maxgraph, ((i + 1) * graphWidth) / (buckets - 1), graphHeight - graphHeight * graph[i + 1] / maxgraph); g.setColor(Color.black); g.drawString("samples: " + samples + ", highest: " + maxgraph + " (" + (float)maxgraph/samples + "%)", 0, -5); } public void windowClosing(WindowEvent e) { e.getWindow().dispose(); } public void windowActivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowOpened(WindowEvent e) {} }