グラフ描画

by WinField95
♥0 | Line 219 | Modified 2012-02-19 10:07:54 | MIT License
play

ActionScript3 source code

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

package
{
    import adobe.utils.CustomActions;
    import flash.display.Sprite
    import flash.text.*;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;
    
    
    public class Main extends Sprite
    {
    
        var display:Display;
        var button1:SimpleButton;
        var button2:SimpleButton;

        
        public function Main():void
        {                

            
            var back:Sprite = new Sprite(); // background
            back.graphics.beginFill(0x000000);
            back.graphics.drawRect(0, 0, 800, 800);
            back.graphics.endFill();
            addChild(back);
                            
            
            var x0:int , y0:int ;
            x0 = y0 = 232;
            
            var arr:Array = new Array();
            arr.push(new Cir(x0 + 0, y0 + 0, 0));
            arr.push(new Cir(x0 + 0, y0 +  200, 1));
            arr.push(new Cir(x0 + 200, y0 +  0 , 2));
            arr.push(new Cir(x0 + 100, y0 + 200,3))
                    
            graphics.lineStyle(4.0);
            
            var matrix:Array = new Array();
            var m0:Array = [0, 0, 1, 0];
            var m1:Array = [0, 0, 2, 0];
            var m2:Array = [1, 2, 0, 3];
            var m3:Array = [0, 0, 3, 0];
            
            
            matrix.push(m0);
            matrix.push(m1);
            matrix.push(m2);
            matrix.push(m3);
                    
            display = new Display(matrix,arr); // 隣接行列の情報とノードに関する情報をコンストラクタの引数として持つ。
            display.Draw();
        
            button1 = new Button('START',130)
            button1.x = 0;
            button1.y = 200;
               button1.addEventListener(MouseEvent.CLICK, button1_onMouseClick);

            button2 = new Button('END',130)
            button2.x = 0;
            button2.y = 200;
            button2.addEventListener(MouseEvent.CLICK, button2_onMouseClick);    
            
            addChild(button1);
            
        }
        
        
            
        public function button1_onMouseClick(event:MouseEvent):void
        {
            addChild(display);
            removeChild(button1);
            addChild(button2);
        }
        
        
        public function button2_onMouseClick(event:MouseEvent):void
        {
            removeChild(display);
            removeChild(button2);
            addChild(button1);
        }
        
        
        
    }
}



import flash.display.*;
import flash.text.*;
class Button extends SimpleButton // ボタンのクラス
{
    public function Button(label:String, width:int = 0):void
    {
        filters = [new GlowFilter(0xffffff,.5)];        
        
        var up:Sprite = _buildImage(label, 0xCCCCCC, width);
        var over:Sprite = _buildImage(label, 0x87CEFA, width);
        var down:Sprite = _buildImage(label, 0x4682B4, width);
        down.y = 1;
        super(up, over, down, up);
    }

    public function _buildImage(label:String, color:int, width:int = 0):Sprite
    {
       
        var text:TextField = new TextField();
        text.defaultTextFormat = new TextFormat('Verdana', 10, 0x000000, true, null, null, null, null, TextFormatAlign.CENTER);
        text.autoSize = TextFieldAutoSize.CENTER;
        text.selectable = false;
        text.text = label;
        text.x = (width - text.width) >> 1;
        text.y = 5;
        var base:Shape = new Shape();
        var g:Graphics = base.graphics;
        g.beginFill(color);
        g.drawRect(0, 0, width, text.height + 3);
        g.endFill();
        var sp:Sprite = new Sprite();
        sp.addChild(base);
        sp.addChild(text);
        return sp;
        
    }        
}










import flash.display.SpreadMethod;
import flash.text.TextField;


class Cir { // ノードの情報を管理する。
    
    private var x:Number, y:Number, r:Number, id:Number;
    private var tf:TextField;
    
    function Cir(xx:Number, yy:Number, idd:Number){ //コンストラクタ
        r = 20;
        x = xx;
        y = yy;
        id = idd;
        
        tf = new TextField();
        tf.x = x - 6;
        tf.y = y - 8;
        
        tf.selectable = false;
        //tf.textColor = 0xAAAAAA;
        tf.text += id;
    }

    public function getX():Number{ 
        return x;
    }
    public function getY():Number{
        return y;
    }
    public function getR():Number{
        return r;
    }
    public function getT():TextField {
        return tf;
    }
}








import flash.display.Sprite
import flash.events.MouseEvent;

class Edge extends Sprite{  // エッジの情報を管理するクラス
    private var line:Sprite; // ラインを描画するスプライト
    private var tmp:Sprite;  // lineのtemp
    private var sx:Number, sy:Number, gx:Number, gy:Number,cost:Number; // 描画を始めるポイントと終えるポイント
    private var tf:TextField; // コストを表示するテキストフィールド
    
    
    function Edge(sxx:Number, syy:Number, gxx:Number, gyy:Number,ccost:Number) { //コンストラクタ
        sx = sxx;
        sy = syy;
        gx = gxx;
        gy = gyy;
        cost = ccost;
        tf = new TextField();
        
        tf.x = 20;
        tf.y = 10;
    
        tf.text = "cost = ";
        tf.text += cost;
        tf.textColor = 0x000000;
    }
    
    public function drawLine():void { // エッジを描く
        line = new Sprite();
        line.graphics.lineStyle(6.0, 0xFFFFFF);
        //line.filters = [new GlowFilter(0xFFFFFF)];
        line.graphics.moveTo(sx,sy);
        line.graphics.lineTo(gx,gy);
        line.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
        addChild(line);
        tmp = line;
    }
    
    
    public function onMouseOver(event:MouseEvent):void // マウスを乗せたとき色を変える
    {
        line = new Sprite();
        line.graphics.lineStyle(6.0, 0x00FFFF);
        line.graphics.moveTo(sx,sy);
        line.graphics.lineTo(gx,gy);
        addChild(line)
        addChild(tf);
        
        line.addEventListener(MouseEvent.MOUSE_OUT , outMouseOut);
    }
    
    public function outMouseOut(event:MouseEvent):void //マウスが離れたとき色を戻す
    {
      line = tmp;
      addChild(line);
      removeChild(tf);
    }
    
    
}



import flash.display.Sprite
import flash.filters.GlowFilter;

class Display  extends Sprite{ // 描画処理をまとめて行うクラス
    private var matrix:Array;
    private var arr:Array;
    
    function Display(m:Array,a:Array) { //コンストラクタ
        matrix = m;
        arr = a;
    }
    
    public function Draw():void // コレが呼び出されると描画を行う
    {
        
        var back:Sprite = new Sprite();
        back.graphics.beginFill(0x000000);
        back.graphics.drawRect(0, 0, 800, 800);
        back.graphics.endFill();
        addChild(back);
                            
        var status:Sprite = new Sprite();
        status.graphics.beginFill(0xFFFFFF);
        status.graphics.drawRect(0,0,80,40);
        status.graphics.endFill();
        addChild(status);
            
            
            
        
        
        for (var i:int = 0 ; i < arr.length ; i++) {     // ノードを配置
            var circle:Sprite = new Sprite();
            
            circle.filters = [new GlowFilter(0xFFFFFF)];
            
            circle.graphics.lineStyle(4.0, 0x000000);
            circle.graphics.beginFill(0xFFFFFF);
            circle.graphics.drawCircle(arr[i].getX(), arr[i].getY(), arr[i].getR());
            circle.graphics.endFill();

            addChild(circle);
            addChild(arr[i].getT());
        }
            
        
        
        
        for (var i:int = 0 ; i < arr.length ; i++) {     // エッジを配置
            for (var j:int = i+1 ; j < arr.length ; j++) {
                if (matrix[i][j] != 0) {
                    
                    var line:Sprite = new Sprite();
                    var ang:Number = Math.atan2(arr[i].getY() - arr[j].getY() , arr[i].getX() - arr[j].getX());
                    var sx:Number, sy:Number, gx:Number, gy:Number;
                    sx = arr[i].getX() - Math.cos(ang) * arr[i].getR();
                    sy = arr[i].getY() - Math.sin(ang) * arr[i].getR();
                    gx = arr[j].getX() + Math.cos(ang) * arr[j].getR();
                    gy = arr[j].getY() + Math.sin(ang) * arr[j].getR();
                    var edge:Edge = new Edge(sx, sy, gx, gy, matrix[i][j]);
                    edge.drawLine();
                    addChild(edge);

                }
            }
        }
        
    }
}