flash on 2011-7-25

by yama3
♥0 | Line 191 | Modified 2011-07-25 18:50:44 | MIT License
play

ActionScript3 source code

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

package {
    import flash.geom.ColorTransform;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.display.Sprite;
    import flash.geom.Point;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.events.MouseEvent;
    import flash.events.Event;
    
    [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="60")]
    
    public class FlashTest extends Sprite {
        private var _container:Sprite = new Sprite();
        private var _pointArray:Array;
        private var src:BitmapData = new BitmapData(465, 465, false, 0x0);
        private var dst:BitmapData = new BitmapData(465, 465, true, 0x0);
        private var steps:Number = 7;
        
        public function FlashTest() {
            graphics.beginFill(0);
            graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
            
            _pointArray = [
                new Point(0,0),
                new Point(265, 0),
                new Point(265, 265),
                new Point(0, 265)
            ];
            
            var _sliceObj:LineSliceObject = new LineSliceObject(stage, _pointArray, 0xffffff);
            _sliceObj.x = _sliceObj.y = 100;
            _container.addChild(_sliceObj);
            addChild(_container).visible = false;
            
            rebuild(), stage.addEventListener(MouseEvent.MOUSE_UP, rebuild);
            addChild(new Bitmap(dst));
            addEventListener("enterFrame", loop);           
        }
        
        private function slice():void {
            var t1:Number = Math.random() * Math.PI * 2;
            var t2:Number = t1 + Math.random() * (Math.PI * 2 / 3) + Math.PI * 1 / 3;
            
            var pt1:Point = Point.polar(300, t1).add(new Point(stage.stageWidth/2, stage.stageHeight/2));
            var pt2:Point = Point.polar(300, t2).add(new Point(stage.stageWidth/2, stage.stageHeight/2));
            
            var lsos:Array = [];
            for(var i:int=0; i<_container.numChildren; i++) {
                lsos.push(_container.getChildAt(i))
            }
            for each(var lso:LineSliceObject in lsos) {
                lso.slice(pt1, pt2);
            }            
        }
        
        private function rebuild(e:MouseEvent = null):void {
            while(_container.numChildren) _container.removeChildAt(0);
            var _sliceObj:LineSliceObject = new LineSliceObject(stage, _pointArray, 0xffffff);
            _sliceObj.x = _sliceObj.y = 100;
            _container.addChild(_sliceObj);
            for(var i:int=0; i<50; i++) slice()
            steps = 7;
        }
        
        private function loop(e:Event):void
        {
            steps = Math.max(0, steps-0.2)
            src.fillRect(src.rect, 0x0)
            src.draw(_container)
            zoomBlur(src, src.rect, dst, zero, steps)
        }
        
        private static var zero:Point = new Point
        private static var halfAlphaCT:ColorTransform = new ColorTransform(1,1,1,0.5)
        public static function zoomBlur(src:BitmapData, srcRect:Rectangle, dst:BitmapData, dstPoint:Point, steps:uint=6, centerX:Number=0.5, centerY:Number=0.5, scaleFactor:Number=1.01):void
        {
            if(steps == 0) {
                dst.copyPixels(src, srcRect, dstPoint)
                return
            }
            
            var cx:Number = centerX * srcRect.width;
            var cy:Number = centerY * srcRect.height;
            var mat:Matrix = new Matrix;
            var temp:BitmapData = new BitmapData(srcRect.width, srcRect.height, src.transparent, 0x0)
            temp.copyPixels(src, srcRect, zero)
            
            for(var i:int=0; i<steps; i++) {
                mat.translate(-cx, -cy)
                mat.scale(scaleFactor, scaleFactor)
                mat.translate(cx, cy)
                temp.draw(temp, mat, halfAlphaCT)
            }
            dst.copyPixels(temp, temp.tect, dstPoint)
            temp.dispose()
        }
    }
}

import flash.display.Sprite;
import flash.display.Stage;
import flash.geom.Point;
import flash.events.MouseEvent;
import caurina.transitions.Tweener;

class LineSliceObject extends Sprite
{
    private var _stage:Stage;
    private var _pointArray:Array;
    private var _color:uint;
    private var _point1:Point;
    private var _point2:Point;
    private var _length:int;
    
    public function LineSliceObject(_stage:Stage, _pointArray:Array, _color:uint){
        this._stage = _stage;
        this._pointArray = _pointArray;
        this._color = _color;
        drawRectFromPoint(this, _pointArray, _color);
    }
    
    private function drawRectFromPoint(_target:*, _pointArray:Array, _color:uint):void
    {
        _target.graphics.beginFill(_color, 1.0);
        _target.graphics.moveTo(_pointArray[0].x, _pointArray[0].y);
        _length = _pointArray.length;
        for(var i:int=1; i<_length; i++)
        {
            var _point:Point = _pointArray[i];
            _target.graphics.lineTo(_point.x, _point.y);
        }
        _target.graphics.endFill();
    }
    
    public function slice(_point1:Point, _point2:Point):void
    {
        var _pt1:Point = globalToLocal(_point1);
        var _pt2:Point = globalToLocal(_point2);
        var _newPointArray:Array = [new Array(), new Array()];
        var _numCloss:int = 0;
        
        for(var i:int=0; i<_length; i++)
        {
            var _pt3:Point = _pointArray[i];
            var _pt4:Point = (_pointArray[i+1]) ? _pointArray[i+1]:_pointArray[0];
            var _clossPt:Point = crossPoint(_pt1, _pt2, _pt3, _pt4);
            
            _newPointArray[0].push(_pt3);
            if(_clossPt)
            {
                _newPointArray[0].push(_clossPt);
                _newPointArray[1].push(_clossPt);
                _newPointArray.reverse();
                _numCloss++;
            }
        }
        if(_numCloss == 2)
        {
            var _newObj1:LineSliceObject = new LineSliceObject(_stage, _newPointArray[0], _color);
            var _newObj2:LineSliceObject = new LineSliceObject(_stage, _newPointArray[1], _color);
            _newObj1.x = _newObj2.x = this.x;
            _newObj1.y = _newObj2.y = this.y;
            parent.addChild(_newObj1);
            parent.addChild(_newObj2);
            parent.removeChild(this);
            
            var _vector:Point = _pt2.subtract(_pt1);
            var _angle:Number = Math.atan2(_vector.y, _vector.x);
            var _force:int = 30 * Math.random() * 20;
            var _fx:Number = Math.abs(Math.sin(_angle));
            var _fy:Number = Math.abs(Math.cos(_angle));
            var _fx1:Number = (_newPointArray[0][0].x < _newPointArray[1][0].x) ? -_fx:_fx;
            var _fx2:Number = (_newPointArray[1][0].x < _newPointArray[0][0].x) ? -_fx:_fx;
            var _fy1:Number = (_newPointArray[0][0].y < _newPointArray[1][0].y) ? -_fy:_fy;
            var _fy2:Number = (_newPointArray[1][0].y < _newPointArray[0][0].y) ? -_fy:_fy;
            Tweener.addTween(_newObj1, {x:_newObj1.x + _fx1 * _force, y:_newObj1.y+_fy1*_force,
            rotationX:Math.random()*360,
            rotationY:Math.random()*360,
            rotationZ:Math.random()*360,
            time:3});
            Tweener.addTween(_newObj2, {x:_newObj2.x + _fx2 * _force, y:_newObj2.y+_fy2*_force,
            rotationX:Math.random()*360,
            rotationY:Math.random()*360,
            rotationZ:Math.random()*360,
            time:3});
        }
    }
    
    private function crossPoint(_pt1:Point, _pt2:Point, _pt3:Poiont, _pt4:Point):Point
    {
        var _vector1:Point = _pt2.subtract(_pt1);
        var _vector2:Point = _pt4.subtract(_pt3);
        
        if(cross(_vector1, _vector2) == 0.0) return null;
        var _s:Number = cross(_vector2, _pt3.subtract(_pt1)) / cross(_vector2, _vector1);
        var _t:Number = cross(_vector1, _pt1.subtract(_pt3)) / cross(_vector1, _vector2);
        
        if(isCross(_s) && isCross(_t))
        {
            _vector1.x *= _s;
            _vector1.y *= _s;
            return _pt1.add(_vector1);
        }
        else return null;
    }
    
    private function cross(_vector1:Point, _vector2:Point):Number
    {
        return (_vector1.x * _vector2.y - _vector1.y * _vector2.x);
    }
    
    public static function isCross(_n:Number):Boolean
    {
        return ((0<=_n)&&(_n<=1));
    }





}