test_case1

by h_kamizono
ref 
Flash Math & Physics Design ActionScript 3.0による数学・物理学表現[実践編]
♥0 | Line 236 | Modified 2010-08-30 07:31:16 | MIT License
play

ActionScript3 source code

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

// ref 
// Flash Math & Physics Design ActionScript 3.0による数学・物理学表現[実践編]
package {
    import flash.display.Sprite;
    import flash.display.MovieClip;
    public class FlashTest extends MovieClip {
        public function FlashTest() {
            // write as3 code here..
            var kazuH:Number = 4;
            var kazuV:Number = 1; 
            var intervalH:Number = 120;
            var intervalV:Number = 200;
            for (var i:Number = 0; i < kazuH; ++i) {
                for (var j:Number = 0; j < kazuV; ++j) {
                    var tx:Number = stage.stageWidth/2
                                    - intervalH*(kazuH - 1)/2
                                    + intervalH*i;
                    var ty:Number = stage.stageHeight/2
                                    - intervalV*(kazuV - 1)/2
                                    + intervalV*j;
                    addChild(new ThePlate(tx, ty));
                    addChild(new TheCircle(tx, ty));
                    addChild(new TheTriangle(tx, ty));
                }

            }

        }
    }
}
import flash.display.ShaderPrecision;
import flash.accessibility.Accessibility;
import flash.display.Shape;
import flash.display.AVM1Movie;
import flash.trace.Trace;

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.utils.Timer;

class TheShape extends Sprite {
    public var pin:Sprite = new Sprite();
    public var shapeContent:Sprite = new Sprite();
    public var ppt:PhysicalPoint;
    public var isPressed:Boolean = false;
    
    public var curMouse:Point;
    public var preMouse:Point;
    
    public var color:Number = (Math.random()*10000000)%1677215;
    
    public function onMDown(ev:MouseEvent) :void {
        parent.setChildIndex(this, parent.numChildren-1);
        ppt.x = curMouse.x;
        ppt.y = curMouse.y;
        var kaitenX:Number = (curMouse.x - this.x)
                             * Math.cos(-ppt.angle)
                             - (curMouse.y - this.y)
                             * Math.sin(-ppt.angle);
        var kaitenY:Number = (curMouse.x - this.x)
                             * Math.sin(-ppt.angle)
                             + (curMouse.y - this.y)
                             * Math.cos(-ppt.angle);
        shapeContent.x -= kaitenX;
        shapeContent.y -= kaitenY;
        this.x = ppt.x;
        this.y = ppt.y;
        isPressed = true;
    }
    
    
    public function onMUp(ev:MouseEvent) :void {
        isPressed = false;
    }

    public function loop(event:TimerEvent) :void {
        preMouse = curMouse;
        curMouse = this.localToGlobal(
                   new Point(this.mouseX, this.mouseY));
        ppt.setKakuKasokudo2(
        -Math.atan2(shapeContent.y, shapeContent.x) + Math.PI/2, 30);
        
        if (isPressed) {
            ppt.x = curMouse.x;
            ppt.y = curMouse.y;
            var mouseAngle:Number = Math.atan2(
                                    curMouse.y - preMouse.y,
                                    curMouse.x - preMouse.x);
            var mouseDist:Number = Point.distance(
                                   new Point(curMouse.x, curMouse.y),
                                   new Point(curMouse.x, curMouse.y));
            var distpar:Number = Point.distance(
                                 new Point(shapeContent.x, shapeContent.y),
                                 new Point(0, 0)) / (Math.sqrt(
                                 shapeContent.width * shapeContent.width + 
                                 shapeContent.height * shapeContent.height)/2);
            var k:Number = Math.atan2(shapeContent.y,
                                      shapeContent.x) + ppt.angle;
            var h:Number = mouseAngle + Math.PI;
            var ak:Number = mouseDist * distpar * Math.sin(h-k);
            ppt.setKakuKasokudo(ak*3);
        }
        
        this.x = ppt.x;
        this.y = ppt.y;
        this.rotation = ppt.angle/Math.PI*180;
        

    }
}

class TheCircle extends TheShape {
    public var r:Number = 50;
    function TheCircle(xx:Number, yy:Number) {
        ppt = new PhysicalPoint(xx, yy);
        pin.graphics.lineStyle(1, 0x222222);
        pin.graphics.beginFill(0x222222);
        pin.graphics.drawCircle(0, 0, 5);
        pin.graphics.endFill();
        
        shapeContent.graphics.clear();
        shapeContent.graphics.lineStyle(1, 0x000000);
        //var color:Number = (Math.random()*10000000)%1677215;
        shapeContent.graphics.beginFill(color, 0.8);
        shapeContent.graphics.drawCircle(0, 0, r);
        shapeContent.graphics.endFill();
        
        addChild(shapeContent);
        addChild(pin);
        
        curMouse = this.localToGlobal(
                   new Point(this.mouseX, this.mouseY));
                   
        addEventListener(MouseEvent.MOUSE_DOWN, onMDown);
        addEventListener(MouseEvent.MOUSE_UP, onMUp);
        
        var timer:Timer = new Timer(33);
        timer.addEventListener(TimerEvent.TIMER, loop);
        timer.start(); 
    }

}

class TheTriangle extends TheShape {
    public var edge:Number = 100;
    public var tmp:Number = 0.433012702;
    function TheTriangle(xx:Number, yy:Number) {
        ppt = new PhysicalPoint(xx, yy);
        pin.graphics.lineStyle(1, 0x222222);
        pin.graphics.beginFill(0x222222);
        pin.graphics.drawCircle(0, 0, 5);
        pin.graphics.endFill();
        
        shapeContent.graphics.clear();
        shapeContent.graphics.lineStyle(1, 0x000000);
        //var color:Number = (Math.random()*10000000)%1677215;
        shapeContent.graphics.beginFill(color, 0.8);
        var vertices:Vector.<Number>=Vector.<Number>([0,tmp*edge, (edge/2),-(tmp*edge), -(edge/2),-(tmp*edge)]);
        shapeContent.graphics.drawTriangles(vertices);
        shapeContent.graphics.endFill();
        
        addChild(shapeContent);
        addChild(pin);
        
        curMouse = this.localToGlobal(
                   new Point(this.mouseX, this.mouseY));
                   
        addEventListener(MouseEvent.MOUSE_DOWN, onMDown);
        addEventListener(MouseEvent.MOUSE_UP, onMUp);
        
        var timer:Timer = new Timer(33);
        timer.addEventListener(TimerEvent.TIMER, loop);
        timer.start(); 
    }

}

class ThePlate extends TheShape {
    public var haba:Number = 80;
    public var takasa:Number = 160;
    
    function ThePlate(xx:Number, yy:Number) {
        ppt = new PhysicalPoint(xx, yy - takasa/4);
        pin.graphics.lineStyle(1, 0x222222);
        pin.graphics.beginFill(0x222222);
        pin.graphics.drawCircle(0, 0, 5);
        pin.graphics.endFill();
        
        shapeContent.graphics.clear();
        shapeContent.graphics.lineStyle(1, 0x000000);
        var color:Number = (Math.random()*10000000)%1677215;
        shapeContent.graphics.beginFill(color, 0.8);
        shapeContent.graphics.drawRect(
                      -haba/2, -takasa/2, haba, takasa);
        shapeContent.graphics.endFill();
        shapeContent.y = takasa/4;
        
        addChild(shapeContent);
        addChild(pin);
        
        curMouse = this.localToGlobal(
                   new Point(this.mouseX, this.mouseY));
                   
        addEventListener(MouseEvent.MOUSE_DOWN, onMDown);
        addEventListener(MouseEvent.MOUSE_UP, onMUp);
        
        var timer:Timer = new Timer(33);
        timer.addEventListener(TimerEvent.TIMER, loop);
        timer.start(); 
    }
}

class PhysicalPoint extends Point {
    public var vx:Number, vy:Number;
    public var ax:Number, ay:Number;
    public var b:Number;
    public var sakkiTime:Number;
    public var timer:Timer;
    
    public var preX:Number, preY:Number;
    
    public var kb:Number;
    public var angle:Number;
    public var preAngle:Number;
    public var kakusokudo:Number;
    public var kakukasokudo:Number;
    
    public var limitter:Number = 0.3;
    
    function PhysicalPoint(xx: Number = 0, yy:Number = 0, an:Number = 0) {
        x = xx; y = yy;
        preX = xx; preY = yy;
        b = 1;
        vx = 0; vy = 0;
        ax = 0; ay = 0;
        
        angle = an;
        preAngle = an;
        kb = 1;
        kakusokudo = 0;
        kakukasokudo = 0;
        
        sakkiTime = new Date().getTime();
        timer = new Timer(33);
        timer.addEventListener(TimerEvent.TIMER, loop);
        timer.start();
        
    }
    
    public function loop(event:TimerEvent) :void {
        var nowTime:Number = new Date().getTime();
        var t:Number = (nowTime - sakkiTime)/1000;
        
        if (t > limitter) t = limitter;
        
        preX = x;
        preY = y;
        
        x += vx*t + 0.5*ax*t*t;
        y += vy*t + 0.5*ay*t*t;
        
        vx += ax*t; vy += ay*t;
        vx *= b;    vy *= b;
        ax = 0;     ay = 0;
        preAngle = angle;
        angle += kakusokudo * t + 0.5*kakukasokudo*t*t;
        kakusokudo += kakusokudo*t;
        
        kakusokudo *= kb;
        kakukasokudo = 0;
        sakkiTime = nowTime;
    }
    
    public function setKasokudo(aax:Number = 0, aay:Number = 0) :void {
        ax += aax;
        ay += aay;
    }
    
    public function setKasokudoByPolar(r:Number=0, dire:Number = 0) :void {
        ax += r*Math.cos(dire);
        ay += r*Math.sin(dire);
    }
    
    public function setKakuKasokudo(aan:Number = 0) :void {
        kakukasokudo += aan;
    }
    
    public function setKakuKasokudo2(dire:Number, val:Number) :void {
        var aan:Number = val * Math.sin(dire - angle);
        setKakuKasokudo(aan);
    }

}