/* * Cellular Automata - standalone version * Original 05-Feb-2010 * Modified 15-Jun-2013 */ import ij.IJ; import ij.ImagePlus; import ij.gui.ImageCanvas; import ij.gui.ImageWindow; import ij.plugin.PlugIn; import ij.process.ByteProcessor; import ij.process.ImageProcessor; import java.awt.Button; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.Dimension; import java.awt.Toolkit; /** * * @author Mike * @version 15-Jun-2013 */ public class Life_ implements PlugIn{ protected int pause = 1; protected int width = 50; protected int height = 50; protected ImageProcessor world; protected ImagePlus display; public Life_() { world = new ByteProcessor(width,height); } @Override public void run(String arg0) { go(); } protected void go(){ populate(true); display = new ImagePlus("Life",world); ControlWindow chartWindow = new ControlWindow(display); chartWindow.setup(this); display.show(); display.getCanvas().setMagnification(4); display.getCanvas().zoomIn(0, 0); } protected void populate(boolean random){ world.fill(); if(random){ int fill = width*height/4; for(int i=0; i3) return 0; else if(neighbours==3 && status==0) return 255; else{ if(status>100)status--; return status; } } protected int countNeighbours(ImageProcessor i,int x, int y){ int n=0; for(int xoffset=-1;xoffset<=1;xoffset++){ for(int yoffset=-1; yoffset<=1; yoffset++){ if(xoffset!=0 || yoffset!=0) n+=getPixelBoolean(i,x+xoffset,y+yoffset); } } return n; } protected int getPixel(ImageProcessor i, int x, int y){ if(x<0)x+=width; if(x>=width)x-=width; if(y<0)y+=height; if(y>=height)y-=height; return i.getPixel(x, y); } protected int getPixelBoolean(ImageProcessor i, int x, int y){ if(x<0)x+=width; if(x>=width)x-=width; if(y<0)y+=height; if(y>=height)y-=height; return getPixel(i,x, y)>1?1:0; } class ControlWindow extends ImageWindow implements ActionListener, Runnable{ Life_ parent; Button start; Button stop; Button reset; Button random; Thread t; boolean isRunning = false; @Override public void run() { while(isRunning){ parent.run(); IJ.wait(pause); } } private ControlWindow(ImagePlus imp, ImageCanvas ic){ super(imp,ic); } private ControlWindow(ImagePlus imp) { this(imp,imp.getCanvas()); Panel p = new Panel(); p.setLayout(new FlowLayout(FlowLayout.RIGHT)); start = makeButton(p,"Start"); stop = makeButton(p,"Stop"); reset = makeButton(p,"Reset"); random = makeButton(p,"Random"); add(p); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Dimension size = getSize(); if (size.height>screen.height) getCanvas().zoomOut(0, 0); pack(); } private Button makeButton(Container c,String s){ Button b = new Button(s); b.addActionListener(this); c.add(b); return b; } public void setup(Life_ listener){ parent = listener; } @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if(source==start && isRunning==false){ isRunning = true; t = new Thread(this); t.start(); } else if(source==stop){ isRunning = false; } else if(source == random){ isRunning = false; parent.populate(true); parent.display.updateAndDraw(); } else if(source == reset){ isRunning = false; parent.populate(false); parent.display.updateAndDraw(); } } @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); Object target = e.getWindow(); if(target==this) isRunning = false; } } // end innner class }