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

raderChart

ActionScript 3.0 によるレーダーチャート Ver.0.2
Copyright (C) 2009/2/26 有限会社ずばぴたテック 根岸智幸
http://www.zubapita.jp/
フリーウェアです。 好きなようにご利用ください。

項目数は可変。目盛は1〜5。小数点も可。
ステージのサイズは、Flash側で設定してください。
Get Adobe Flash player
by hacker_gcv15_bo 09 May 2010
    Embed
/**
 * Copyright hacker_gcv15_bo ( http://wonderfl.net/user/hacker_gcv15_bo )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/3Als
 */

/*
	ActionScript 3.0 によるレーダーチャート Ver.0.2
	Copyright (C) 2009/2/26 有限会社ずばぴたテック 根岸智幸
	http://www.zubapita.jp/
	フリーウェアです。 好きなようにご利用ください。
	
	項目数は可変。目盛は1〜5。小数点も可。
	ステージのサイズは、Flash側で設定してください。

*/
package {

import flash.display.Sprite;
import flash.display.Graphics;
import flash.text.*;

public class raderChart extends Sprite {

	// 項目名
	var labe:Array = ["引きの強さ", "振込阻止率", "上がり役の大きさ", "テンパイ率","トップ率", "好かれる打ち方"];
	// 各項目の値
	var ratings:Array = [3, 3, 1, 3, 2, 1];
	// 各項目の軸の角度。値は、のちほど項目数から算出
	var angles = new Array();

	var unitLength:Number = 20;
	// FlashではX=1,Y=0(右横)が0度。そこから右回りに増えるので、Y=1,X=0(真上)は270度になる。
	var startAngle:int = 270;
	
	// 原点はステージの中央
	var originX:Number = stage.stageWidth / 2;
	var originY:Number = stage.stageHeight / 2;


// コンストラクタ もしくは メインルーチン
public function raderChart():void {

	// 真上(270度)から、(360/項目数)度ずつ、足して各項目の軸の角度を求める。
	// 360度を超えても、Flashが自動的に修正してくれる(賢い!)
	var angle:int = startAngle;
	var step:int = 360 / labe.length;
	for(var i:int=0;i<labe.length;i++) {
		angles[i] = angle;
		angle += step; 
	}
	
	// ガイドを引く
	drawGuide();
	// チャートを塗りつぶす
	drawRatings();

}

// ガイドを引く
function drawGuide() {
	var sp:Sprite = new Sprite();
	addChild(sp);
	var g:Graphics = sp.graphics;
	
	g.lineStyle(1, 0x0000ff);
	var x:Number = 0;
	var y:Number = 0;

	// フォント設定
	var label = new Array();
	var textFmt:TextFormat = new TextFormat();
	textFmt.font = "Verdana";
	textFmt.align = "center";
	textFmt.color = "0x000000";
	textFmt.size = 10;
	textFmt.leading = 0;
	textFmt.leftMargin = textFmt.rightMargin = 1;
	textFmt.indent = 0;

	// 軸とラベルを描画
	for(var key in angles) {
		var angle:Number = Number(angles[key]);
		var radian:Number = deg2rad(angle);
		// 目盛の最大値 = 5
		x = originX + getX(radian, 5);
		y = originY + getY(radian, 5);
		drawLine(g, originX, originY, x, y);

		label[key] = new TextField();
		label[key].autoSize = TextFieldAutoSize.CENTER;
		// 目盛5の外側にラベルを表示するから、距離は6
		label[key].x = originX + getX(radian, 6);
		label[key].y = originY + getY(radian, 6) - 10; // -10はY位置の補正
		label[key].defaultTextFormat = textFmt;
		this.addChild(label[key]);
		label[key].text = labe[key]; 

	}

	// 目盛を描画
	drawScale(g);

}

// ガイドに目盛を引く
function drawScale(g:Graphics) {
	// 最後の点から最初の点へ線を引く準備...*1
	angles.push(angles[0]);
	
	// 目盛1から5の線を順に描く
	for(var i=1;i<=5;i++) {
		var x:Number = 0;
		var y:Number = 0;
		var oldX:Number = 0;
		var oldY:Number = 0;
		for(var key in angles) {
			var angle:Number = Number(angles[key]);
			var radian:Number = deg2rad(angle);
			x = originX + getX(radian, i);
			y = originY + getY(radian, i);
			// ループ1週目だけ moveTo、あとはすべてlineTo
			if(oldX==0 && oldY==0) {
				g.moveTo(x, y);
			}  else {
				g.lineTo(x, y);
			}
			oldX = x;
			oldY = y;
		}
	}
	
	// *1の後始末
	angles.pop();
}

// チャートを塗りつぶす
function drawRatings() {
	// 最後の点から最初の点へ線を引く準備...*2
	ratings.push(ratings[0]);
	angles.push(angles[0]);
	
	var sp:Sprite = new Sprite();
	addChild(sp);
	var g:Graphics = sp.graphics;

	var x:Number = 0;
	var y:Number = 0;
	var oldX:Number = 0;
	var oldY:Number = 0;

	// 描画
	g.lineStyle(1, 0xff0000);
	g.beginFill(0xff0000, 0.4);
	for(var key in ratings) {
		var rating:Number = Number(ratings[key]);
		var angle:Number = Number(angles[key]);
		var radian:Number = deg2rad(angle);
		x = originX + getX(radian, rating);
		y = originY + getY(radian, rating);
		// ループ1週目だけ moveTo、あとはすべてlineTo
		if(oldX==0 && oldY==0) {
			g.moveTo(x, y);
		} else {
			g.lineTo(x, y);
		}
		oldX = x;
		oldY = y;
	}
	g.endFill();
	
	// *2の後始末
	ratings.pop();
	angles.pop();
}

/*
 ユーティリティたち
 */

// 単純に(連続しない)直線を描く
function drawLine(g:Graphics, startX:Number, startY:Number, endX:Number, endY:Number) {
	g.moveTo(startX, startY);
	g.lineTo(endX ,endY);
}

// 角度(ラジアン)と長さからYの位置を得る
function getX(radian:Number, length:Number) {
	return unitLength * length * Math.cos(radian);
}

// 角度(ラジアン)と長さからXの位置を得る
function getY(radian:Number, length:Number) {
	return unitLength * length * Math.sin(radian);
}

// 度をラジアンに変換
function deg2rad(deg:Number):Number {
	return deg * (Math.PI / 180);
}


} // end of class raderChart

} // end of Package