/**
* 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);
}
}
}
}
}