ActionScript Learning 110630

6.30.2011

2次ベジェ曲線で円を描く。

FlashのcurveToを使って2次ベジェ曲線で円を描く。コントロールポイントをドラッグすると変形します。調整すれば楕円も描けるはず。

curveToで描画する際に始点と終点を違和感無くつなげるのに工夫が必要だった。

SAMPLE VIEW CODE


package {
	
	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;

	public class NMain extends MovieClip {
		
		//-------------------------------------------------------------------------------- Properties
		
		private var _this:*;
		private var _stage:Stage;
		

		
		
		//-------------------------------------------------------------------------------- Constractor
		
		public function NMain() {
			
			_this = this;
			_stage = stage;
			
			_stage.scaleMode = StageScaleMode.NO_SCALE;
			_stage.align = StageAlign.TOP_LEFT;		
			
			Init();
		}
		
		
		//-------------------------------------------------------------------------------- Function
		 
		 
		/**
		 * initialize
		 */
		public function Init():void {
			
			setup();
		}

		/**
		 * setup
		 */
		private var _main:MovieClip;
		
		private function setup():void {
			
			_main = new MovieClip();
			_main.x = Math.round(_stage.stageWidth / 2);
			_main.y = Math.round(_stage.stageHeight / 2);			
			_this.addChild(_main);
			
			setup_pntsarr();
			
			drawaction();
		}
		
		/**
		 * setup pntsarr
		 */
        private var pntsleng:int;
        private var pntsarr:Array;
		
		private function setup_pntsarr():void {
			
			pntsleng = 8;
			
			var radius = 200;
			var angle = 360 / pntsleng;
			
			pntsarr = [];
			
			for (var i = 0; i < pntsleng; i++) {
				
				pntsarr.push(dot);
				
				pntsarr[i].x = radius * Math.cos(i * angle * (Math.PI / 180));
				pntsarr[i].y = radius * Math.sin(i * angle * (Math.PI / 180));
				
				_main.addChild(pntsarr[i]);
			}
		}
		
		/**
		 * draw action
		 */		
		private function drawaction():void {
			
			_main.graphics.clear();
			
			drawline();			
			drawcurve();
		}
		//
		private function drawline():void {
			
			var g = _main.graphics;

			g.lineStyle(1, 0xCCCCCC, .4);
			
			g.moveTo(pntsarr[0].x, pntsarr[0].y);
			
			for (var i = 1; i < pntsleng + 1; i++) {
				
				var pnum = i;
				if(pnum > pntsleng - 1) pnum -= pntsleng;
				
				g.lineTo(pntsarr[pnum].x, pntsarr[pnum].y);
			}
		}
		//
		private function drawcurve():void{
			
			var g = _main.graphics;
			
			g.lineStyle(2, 0x00FFFF, .5);
			
			g.moveTo((pntsarr[0].x + pntsarr[1].x) / 2, (pntsarr[0].y + pntsarr[1].y) / 2);
			
			for (var i = 1; i < pntsleng + 2; i++){
				
				var pnum = i;
				if(pnum > pntsleng - 1) pnum -= pntsleng;				

				var nextpnum = pnum + 1;
				if(nextpnum > pntsleng - 1) nextpnum -= pntsleng;				
				
				var cntx = pntsarr[pnum].x;
				var cnty = pntsarr[pnum].y;				
				
				var ancx = (pntsarr[pnum].x + pntsarr[nextpnum].x) / 2;
				var ancy = (pntsarr[pnum].y + pntsarr[nextpnum].y) / 2;				
				
				g.curveTo(cntx, cnty, ancx, ancy);
			}
		}

        
		/**
		 * dot
		 */
		private function get dot():Sprite {
		
			var _dot = new Sprite();
			
			var g = _dot.graphics;
			g.beginFill(0xFF00FF, .4);
			g.drawCircle(0, 0, 4);
			
			_dot.buttonMode = true;
			
			_dot.addEventListener(MouseEvent.MOUSE_DOWN, dot_mousedown);

			return _dot;
		}
		//
		private var _dot:Sprite;
		
		private function dot_mousedown(eo:* = null):void {
			
			_dot = eo.currentTarget;
			
			_dot.startDrag();
			_dot.addEventListener(MouseEvent.MOUSE_MOVE, dot_onmousemove);
			
			_stage.addEventListener(MouseEvent.MOUSE_UP, dot_onmouseup);			
			_stage.addEventListener(Event.ENTER_FRAME, dot_enterframe);
		}
		//
		private function dot_onmousemove(eo:* = null):void {
			
			eo.updateAfterEvent();
		}
		//
		private function dot_onmouseup(eo:* = null):void{
			
			_dot.removeEventListener(MouseEvent.MOUSE_MOVE, dot_onmousemove);
			_dot.stopDrag();
			
			_stage.removeEventListener(Event.ENTER_FRAME, dot_enterframe);
		}
		//
		private function dot_enterframe(eo:* = null):void {
			
			drawaction();
		}
        
    }
}





category : ActionScript / Flash

Demonstrations

Feature Samples

Author

虹村 マキオウ (nizimura makiou)

猫と太極拳を愛する横浜在住のフリーランスクリエイターです。

logo

Demo and Sample

Category