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();
}
}
}