1D Cellular Automata
http://en.wikipedia.org/wiki/Cellular_automata
♥0 |
Line 171 |
Modified 2014-07-10 11:57:00 |
MIT License
archived:2017-03-20 00:58:33
ActionScript3 source code
/**
* Copyright greentec ( http://wonderfl.net/user/greentec )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/wpde
*/
package {
import com.bit101.components.Label;
import com.bit101.components.PushButton;
import com.bit101.components.ComboBox;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
public class FlashTest extends Sprite {
public var mainBitmap:Bitmap;
public var mainBitmapData:BitmapData;
public var data:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(465);
public var rule:Object = { };
public var ruleButtonArray:Array = [];
public var ruleNum:int;
public var ruleLabel:Label;
public var initCombo:ComboBox;
public function FlashTest() {
// write as3 code here..
stage.scaleMode = "noScale";
mainBitmapData = new BitmapData(465, 465, false, 0xffffff);
mainBitmap = new Bitmap(mainBitmapData);
addChild(mainBitmap);
rule["111"] = 0; //rule 30
rule["110"] = 0;
rule["101"] = 0;
rule["100"] = 1;
rule["11"] = 1;
rule["10"] = 1;
rule["1"] = 1;
rule["0"] = 0;
var i:int;
var j:int;
var str:String;
for (i = 0; i < 465; i += 1)
{
data[i] = new Vector.<int>(465);
}
data[0][int(465 / 2)] = 1; //initialization
for (i = 0; i < 464; i += 1)
{
for (j = 1; j < 464; j += 1)
{
str = String(data[i][j - 1] * 100 + data[i][j] * 10 + data[i][j + 1]);
data[i + 1][j] = rule[str];
}
}
for (i = 0; i < 465; i += 1) //draw
{
for (j = 0; j < 465; j += 1)
{
if (data[i][j] == 1)
{
mainBitmapData.setPixel(j, i, 0x0);
}
}
}
var resetButton:PushButton = new PushButton(this, 465 - 110, 10, "Reset", onReset);
resetButton.alpha = 0.8;
initCombo = new ComboBox(this, resetButton.x, resetButton.y + resetButton.height + 5, "Select Init", ["one left", "one middle", "one right", "25% random", "50% random", "75% random"]);
initCombo.alpha = 0.8;
var _ruleButton:PushButton;
for (i = 0; i < 8; i += 1)
{
_ruleButton = new PushButton(this, 10 + i * 30, 10, (7 - i).toString(2), onChangeRule);
_ruleButton.name = _ruleButton.label;
if (_ruleButton.label.length < 3)
{
var len:int = 3 - _ruleButton.label.length;
for (j = 0; j < len; j += 1)
{
_ruleButton.label = "0" + _ruleButton.label;
}
}
_ruleButton.toggle = true;
_ruleButton.width = 30;
_ruleButton.height = 30;
_ruleButton.alpha = 0.8;
if (rule[_ruleButton.name] == 1)
{
_ruleButton.selected = true;
}
ruleButtonArray.push(_ruleButton);
}
ruleLabel = new Label(this, 10, _ruleButton.y + _ruleButton.height + 5, "");
ruleNum = 0;
for (i = 0; i < 8; i += 1)
{
ruleNum += (ruleButtonArray[i].selected == true ? 1 : 0) * Math.pow(2, (7 - i));
ruleLabel.text = "Rule " + String(ruleNum);
}
}
private function onChangeRule(e:Event):void
{
rule[e.target.name] = e.target.selected == true ? 1 : 0;
ruleNum = 0;
var i:int;
for (i = 0; i < 8; i += 1)
{
ruleNum += (ruleButtonArray[i].selected == true ? 1 : 0) * Math.pow(2, (7 - i));
ruleLabel.text = "Rule " + String(ruleNum);
}
}
private function onReset(e:Event = null):void
{
mainBitmapData.fillRect(mainBitmapData.rect, 0xffffff);
var i:int, j:int;
var str:String;
data[0] = new Vector.<int>(465);
switch(initCombo.selectedItem)
{
case "one left":
data[0][0] = 1;
break;
case "one middle":
data[0][int(465 / 2)] = 1;
break;
case "one right":
data[0][464] = 1;
break;
case "25% random":
for (i = 0; i < 465; i += 1)
{
if (Math.random() < 0.25)
{
data[0][i] = 1;
}
}
break;
case "50% random":
for (i = 0; i < 465; i += 1)
{
if (Math.random() < 0.5)
{
data[0][i] = 1;
}
}
break;
case "75% random":
for (i = 0; i < 465; i += 1)
{
if (Math.random() < 0.75)
{
data[0][i] = 1;
}
}
break;
default:
data[0][int(465 / 2)] = 1;
break;
}
for (i = 0; i < 464; i += 1)
{
for (j = 1; j < 464; j += 1)
{
str = String(data[i][j - 1] * 100 + data[i][j] * 10 + data[i][j + 1]);
data[i + 1][j] = rule[str];
}
}
for (i = 0; i < 465; i += 1) //draw
{
for (j = 0; j < 465; j += 1)
{
if (data[i][j] == 1)
{
mainBitmapData.setPixel(j, i, 0x0);
}
}
}
}
}
}