In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

渋滞シミュレーション

渋滞をシミュレーションしてみました。
車を円上に並べます。
それぞれにルールを与えます。
1.毎フレーム中心から90度の方向に進む。
2.前の車に近づきすぎたら減速する。遠くなれば加速する

ステージ上をクリックすると、一つの車の速度が半減します。

まぁ、なにが言いたいかというと、高速道路では、なるべく等速で走った方が良い
っと、いうことを渋滞の中で考えました。
Get Adobe Flash player
by kawamura 10 Sep 2010
/**
 * Copyright kawamura ( http://wonderfl.net/user/kawamura )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ptKB
 */

/*
渋滞をシミュレーションしてみました。
車を円上に並べます。
それぞれにルールを与えます。
1.毎フレーム中心から90度の方向に進む。
2.前の車に近づきすぎたら減速する。遠くなれば加速する

ステージ上をクリックすると、一つの車の速度が半減します。

まぁ、なにが言いたいかというと、高速道路では、なるべく等速で走った方が良い
っと、いうことを渋滞の中で考えました。
*/
package {
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        public function FlashTest() {
            // write as3 code here..
            var hw:Hightway=new Hightway()
            addChild(hw)
            hw.init();
            
            var tf:TrafficJam=new TrafficJam(hw);
            addChild(tf)
            tf.init()
        }
    }
}

import flash.display.Sprite;
class Hightway extends Sprite {
    private var n:Number
    private var R:Number
    private var scx:Number;
    private var scy:Number;
    private var c_ar:Array=new Array()
    public function Hightway() {
        // constructor code
        n=100;
        R=200;
    }
    public function init():void{
        scx=stage.stageWidth*.5
        scy=stage.stageHeight*.5
        var i:uint;
        var c:Car
        for(i=0;i<n;i++){
            c=new Car();
            addChild(c)
            var theta:Number=i*2*Math.PI/n
            c.x=scx+R*Math.cos(theta);
            c.y=scy+R*Math.sin(theta);
            c_ar.push(c);
        }
        for(i=0;i<n;i++){
            c=c_ar[i]
            var front:Car;
            if(i==n-1){
                front=c_ar[0]
            }else{
                front=c_ar[i+1]
            }
            c.startMove(front,R);
        }
    }
    public function accident():void{
        var c:Car=c_ar[Math.floor((Math.random()*c_ar.length))];
        c.accident()
        
    }
}
    
import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.Event;
import flash.utils.setTimeout;
import flash.display.MovieClip;

class Car extends Sprite{
    public var _frontcar:Car
    public var _theta:Number;
    public var _R:Number;
    
    private var scx:Number
    private var scy:Number;
    private var _v:Number;
    private var g:Graphics
    private var fd:Number;
    public function Car() {
        // constructor code
        g=this.graphics;
        g.beginFill(0x0000FF);
        g.drawCircle(0,0,1);
        _v=2
    }
    public function init(theta:Number,R:Number,frontcar:Car):void{
        _theta=theta;
        _R=R;
    }
    public function startMove(frontcar:Car,R:Number):void{
        _R=R;
        //
        scx=stage.stageWidth*.5;
        scy=stage.stageHeight*.5;
        //
        _frontcar=frontcar;
        fd=Math.sqrt(Math.pow(_frontcar.x-this.x,2)+Math.pow(_frontcar.y-this.y,2));
        
        addEventListener(Event.ENTER_FRAME,ent)
    }

    public function accident():void{
        _v*=.5;
        setMark()
        
    }
    //private 
    private function setMark():void{
        var ring:MovieClip=new MovieClip;
        addChild(ring);
        var rg:Graphics=ring.graphics;
        rg.beginFill(0xFF0000,0.5);
        rg.drawCircle(0,0,30);
        ring.scaleX=0;
        ring.scaleY=0;
        ring.addEventListener(Event.ENTER_FRAME,ripple);
    }
    private function ripple(evt:Event):void{
        var ring:MovieClip=evt.currentTarget as MovieClip;
        var dx:Number=1-ring.scaleX;
        ring.scaleX+=dx*0.15;
        ring.scaleY=ring.scaleX;
        ring.alpha=1-ring.scaleX;
        if(dx<0.03){
            ring.removeEventListener(Event.ENTER_FRAME,ripple);
            removeChild(ring);
        }
    }
    private function ent(evt:Event):void{

        var theta:Number=-0.5*Math.PI+Math.atan2(scy-this.y,scx-this.x)
        var d:Number=Math.sqrt(Math.pow(_frontcar.x-this.x,2)+Math.pow(_frontcar.y-this.y,2));
        if(d<fd*.5){
            _v*=0.5
        }else{
            _v+=(2-_v)*0.05;
        }
        //
        if(_v<1){
            g.clear();
            g.beginFill(0xFF0000);
            g.drawCircle(0,0,1);
        }else{
            g.clear();
            g.beginFill(0x0000FF);
            g.drawCircle(0,0,1);
        }
        var _x:Number=this.x+_v*Math.cos(theta);
        var _y:Number=this.y+_v*Math.sin(theta);
        theta=Math.atan2(_y-scy,_x-scx);
        this.x=scx+_R*Math.cos(theta);
        this.y=scy+_R*Math.sin(theta);
    }
}

import com.bit101.components.*;
import flash.events.MouseEvent;
import flash.display.Sprite;

class TrafficJam extends Sprite {
    private var hw:Hightway;
    private var pbtn:PushButton;
    public function TrafficJam(heightway:Hightway):void {
        // constructor code
        hw=heightway;
        
    }
    public function init():void{
        pbtn=new PushButton();
        pbtn.label="Traffic Jam";
        pbtn.x=stage.stageWidth*.5-pbtn.width*.5
        pbtn.y=stage.stageHeight*.5-pbtn.height*.5
        addChild(pbtn)
        pbtn.addEventListener(MouseEvent.CLICK,clk);
    }
    private function clk(evt:MouseEvent):void{
        //pbtn.removeEventListener(MouseEvent.CLICK,clk);
        hw.accident();
    }
}