1D Cellular Automata

by greentec
http://en.wikipedia.org/wiki/Cellular_automata
♥0 | Line 171 | Modified 2014-07-10 11:57:00 | MIT License
play

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);
                    }
                }
            }
        }
    }
}

Forked