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

FillArc 塗りつぶし円弧描画処理

塗りつぶし円弧を描画する処理
Get Adobe Flash player
by okoi 18 Mar 2010
    Embed
/**
 * Copyright okoi ( http://wonderfl.net/user/okoi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/tiaA
 */

//
//	塗りつぶし円弧を描画する処理
//
package 
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	
	/**
	 * @author okoi
	 */
	public class Main extends Sprite 
	{
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// 適当に何個か出します。
			for ( var i:int = 0; i < 50; i++ )
			{
				var posX:int = int(Math.random() * stage.stageWidth);
				var posY:int = int(Math.random() * stage.stageHeight);
				var w:Number = Math.random() * 200;
				var h:Number = Math.random() * 200;
				var sA:Number = Math.random() * 360;
				var aA:Number = Math.random() * 360;
				var color:uint = uint(Math.random() * 0xFFFFFF);
				FillArc( this.graphics, posX, posY, w, h, sA, aA, color );
			}
		}
		
		/**
		 * 円弧を描画する(width,height指定バージョン。楕円もいける)
		 * 指定する座標は円の左上の位置になるので中心を指定したい場合はまた別の関数を作ればおk
		 * @param	g			描画対象オブジェクトのGraphics
		 * @param	_x			描画座標(左上位置
		 * @param	_y			描画座標(左上位置
		 * @param	_w			円を描いた場合の円の幅
		 * @param	_h			円を描いた場合の円の高さ
		 * @param	startAngle
		 * @param	arcAngle
		 */
		private function FillArc( g:Graphics, _x:Number, _y:Number, _w:Number, _h:Number, startAngle:Number, arcAngle:Number, color:uint = 0x00000000 ) : void {
			
			var	startRadian:Number = startAngle * Math.PI / 180;
			var	rX:Number = _w/2;
			var rY:Number = _h/2;
			
			//	中心点を求める
			var	centerX:Number = _x + _w/2;
			var centerY:Number = _y + _h/2;
			
			//	始点位置を求める
			var	x:Number = Math.cos( startRadian )*rX + centerX;
			var y:Number = Math.sin( startRadian )*rY*-1 + centerY;
			
			
			
			//	1周以上しても意味がないので
			if( Math.abs( arcAngle ) > 360 )	arcAngle = 360;
			
			var	segs:Number 	= Math.ceil( Math.abs(arcAngle)/45);
			var	segAngle:Number = arcAngle/segs;
			var	theta:Number = -(segAngle/180)*Math.PI;
			var	angle:Number = -(startAngle/180)*Math.PI;
			var	ax:Number = x-Math.cos(angle)*rX;
			var ay:Number = y-Math.sin(angle)*rY;
			
			g.beginFill( color );
			g.moveTo( x, y );
						
			if( segs > 0 )
			{
				for( var i:uint = 0; i < segs; i++ )
				{
					angle += theta;	
					var	angleMid:Number = angle - (theta/2);
					var bx:Number = ax+Math.cos(angle)*rX;
					var by:Number = ay+Math.sin(angle)*rY;
					var cx:Number = ax+Math.cos(angleMid)*(rX/Math.cos(theta/2));
					var cy:Number = ay+Math.sin(angleMid)*(rY/Math.cos(theta/2));
					g.curveTo(cx,cy,bx,by);
				}		
			}
			
			//	円じゃない場合、中心とかにもパスを通す
			if( arcAngle < 360 )
			{
				g.lineTo( centerX, centerY );	
				g.lineTo( x, y );
			}
			
			g.endFill();
		}
		
		
	}
	
	
}