flash on 2009-11-7

by uwi
♥0 | Line 122 | Modified 2009-11-07 14:54:14 | MIT License | (replaced)
play

Related images

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/sgn9
 */

package {
    import flash.display.*;
    import flash.geom.*;
    import flash.events.*;
    import flash.text.*;
    import net.wonderfl.utils.SequentialLoader;
    import net.hires.debug.Stats;
    
    public class FillFillRect extends Sprite {
        public const PIC_DEFAULT : String = "http://assets.wonderfl.net/images/related_images/b/b8/b825/b8258201e6eb69aebaed9c7e4d6c954c1848f6cc";
        private var _images : Array = [];
        
        private var _tf : TextField;
        
        public function FillFillRect() {
            SequentialLoader.loadImages([PIC_DEFAULT], _images, onImageLoaded);
        }
        
        private var _targ : BitmapData;
        private var _elitebmd : BitmapData;
        private var _curbmd : BitmapData;
        private var _curdiff : Number;
        private var _nextbmd : BitmapData;
        private var _cur : Array;
        private var _elite : Array;
        private var _elitediff : Number;
        
        private var _W : Number;
        private var _H : Number;
        
        private function onImageLoaded() : void
        {
            var l : Loader = _images.pop();
            _targ = new BitmapData(l.width, l.height, false);
            _targ.draw(l);
//            addChild(new Bitmap(_targ));
            
            _elitebmd = new BitmapData(l.width, l.height, false, 0x000000);
            addChild(new Bitmap(_elitebmd));
            
            _W = l.width;
            _H = l.height;
            _cur = new Array(N);
            _elite = new Array(N);
            
            for(var i : int = 0;i < N;i++){
                _cur[i] = generate();
                _elite[i] = {};
            }
            
            _curbmd = new BitmapData(_W, _H, false, 0x000000);
            _nextbmd = new BitmapData(_W, _H, false, 0x000000);
            _curdiff = Number.MAX_VALUE;
            _elitediff = Number.MAX_VALUE;
            _curbmd.lock();
            _nextbmd.lock();
            _R0 = _elitebmd.rect;
            
            _tf = new TextField();
            _tf.x = 0;
            _tf.y = 420;
            _tf.width = 400;
            _tf.height = 100;
            addChild(_tf);
            
            addChild(new Stats());
            
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }
        
        private function onEnterFrame(e : Event) : void
        {
            _elitebmd.lock();
            for(var i : int = 0;i < 10;i++){
                step();
            }
            _elitebmd.unlock();
//            _tf.text = "" + _curdiff + "\n" + _elitediff;
            
            /*
            var curhist : Vector.<Vector.<Number>> = _elitebmd.histogram();
            var targhist : Vector.<Vector.<Number>> = _targ.histogram();
            var diffcur : Number = 0;
            for(var ch : int = 0;ch < 3;ch++){
                for(i = 0;i < 256;i++){
                    diffcur += (curhist[ch][i] - targhist[ch][i]) * (curhist[ch][i] - targhist[ch][i]);
                }
            }
            */
            
            _tf.text = "" + countDiff(_elitebmd, _targ, _R0);
        }
        
        private function generate() : Array
        {
            var r : Rectangle = new Rectangle(
                    Math.random() * _W, Math.random() * _H,
                    Math.random() * Math.random() * _W + 2,
                    Math.random() * Math.random() * _H + 2
                    );
            if(r.x + r.width >= _W){
                r.width = _W - r.x;
            }
            if(r.y + r.height >= _H){
                r.height = _H - r.y;
            } 
            return [r, uint(Math.random() * 0xffffff)];
        }
        
        private const N : int = 500;
        private var _R0 : Rectangle;
        private const P0 : Point = new Point(0, 0);
        
        private function step() : void
        {
            var ind : int = Math.random() * N;
            var i : int;
            _nextbmd.fillRect(_R0, 0x000000);
            var candi : Array = generate();
            
            for(i = 0;i < ind;i++){
                _nextbmd.fillRect(_cur[i][0], _cur[i][1]);
            }
            _nextbmd.fillRect(candi[0], candi[1]);
            for(i = ind + 1;i < N;i++){
                _nextbmd.fillRect(_cur[i][0], _cur[i][1]);
            }
            
            var u : Rectangle = _cur[ind][0].union(candi[0]);
            
            /*
            var curhist : Vector.<Vector.<Number>> = _curbmd.histogram(u);
            var nexthist : Vector.<Vector.<Number>> = _nextbmd.histogram(u);
            var targhist : Vector.<Vector.<Number>> = _targ.histogram(u);
            */
            
            var diffcur : Number = countDiff(_curbmd, _targ, _cur[ind][0]) + countDiff(_curbmd, _targ, candi[0]);
            var diffnext : Number = countDiff(_nextbmd, _targ, _cur[ind][0]) + countDiff(_nextbmd, _targ, candi[0]);
            /*
            for(var ch : int = 0;ch < 3;ch++){
                for(i = 0;i < 256;i++){
                    diffcur += (curhist[ch][i] - targhist[ch][i]) * (curhist[ch][i] - targhist[ch][i]);
                    diffnext += (nexthist[ch][i] - targhist[ch][i]) * (nexthist[ch][i] - targhist[ch][i]);
                }
            } 
            */
            
            if(diffcur > diffnext){
                _cur[ind] = candi;
                _curbmd.copyPixels(_nextbmd, _R0, P0);
                _elitebmd.copyPixels(_curbmd, _R0, P0);
                    /*
                if(_curdiff < _elitediff){
                    _elitediff = _curdiff;
                    _elitebmd.copyPixels(_curbmd, _R0, P0);
                    for(i = 0;i < N;i++){
                        _elite[i] = _cur[i].concat();
                    }
                }
                */
            }
        }
        
        private function countDiff(a : BitmapData, b : BitmapData, u : Rectangle) : Number
        {
            var diff : Number = 0;
            for(var x : int = u.x;x < u.x + u.width;x+=2){
                for(var y : int = u.y;y < u.y + u.height;y+=2){
                    var pa : uint = a.getPixel(x, y);
                    var pb : uint = b.getPixel(x, y);

                    var rr : int, gg : int, bb : int;
                    rr = (pa >> 16) - (pb >> 16);
                    gg = ((pa >> 8) & 255) - ((pb >> 8) & 255);
                    bb = (pa & 255) - (pb & 255);
                    diff += rr * rr + gg * gg + bb * bb;
                }
            }
            return diff;
        }
    }
}