Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://tadpolizemedia.blog118.fc2.com/tb.php/173-c6388482

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

「2次ベジェ曲線で円弧を描画する」を実装する(AS3.0+FlashDevelop)

AS3.0に円弧を描く関数がないことを知った時にはショックだったのですが、
どうしても作りたいと思いネットで調べていたところ、2次ベジェ曲線を
利用して円弧を描画する記事を見つけました。

[AS3.0][algorithm]2次ベジェ曲線で円弧を描画する
http://d.hatena.ne.jp/octech/20080328

このサイトに考え方のもとになるソースが書かれていたのですが、実用的では
なかったので、このページのソースを元に実装してみました。

私のソースは、パラメタのチェック等を行っていないので、強いソースには
なっていません。色や線等の属性も固定です。アルゴリズム的には難しくないので
利用したい方においては、より使えるソースになるよう手を入れていただきたいと思います。




package
{
import flash.display.Sprite;
import flash.events.Event;

[SWF(width="500", height="500", backgroundColor="#FFFFFF")]

/**
* DrawArc 円弧を作る
*
* 45度(Math.PI/4)を超える角度も扱えるようにする
*
* http://d.hatena.ne.jp/octech/20080328
* [AS3.0][algorithm]2次ベジェ曲線で円弧を描画する
* を元に改良
*
* 2012-02-04
*
* @author Matsushiro
*/

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);
// entry point

var poi:Sprite = new Sprite();
addChild(poi);

drawArc(poi, 125, 125, 100, 0.2, 4.0, 0); // 左上
drawArc(poi, 375, 125, 100, 0.2, 4.0, 1); // 右上
drawArc(poi, 125, 375, 100, -3.0, 3.0, 0); // 左下
drawArc(poi, 375, 375, 100, -3.0, 3.0, 1); // 右下
}

public function drawArc(sp:Sprite, centerX:Number, centerY:Number, R:int, theta0:Number, theta1:Number, nuri:int):void {

/**
* sp:Sprite Sprite
* centerX:Number  中心X座標
* centerY:Number  中心Y座標
* R:int 半径
* theta0:Number 始点角度(ラジアン)
* theta1:Number 終点角度(ラジアン)
* nuri:int 0: 塗りつぶさない 1:塗りつぶす
*/

var thetas:Number = Math.abs(theta1 - theta0);
var thetas_divided:Number = 0;

while (thetas != 0) {

if (thetas - Math.PI / 4 >= 0) {
thetas -= Math.PI / 4; // 残りの角度
thetas_divided = Math.PI / 4;
}
else {
thetas_divided = thetas;
thetas = 0;
}

// 変数名に大文字を使っていますが、
// 参照元ソースのイメージをできるだけ残すため、そのままにしています。

// コード#2
var A0X:Number = R * Math.cos( theta0 );
var A0Y:Number = R * Math.sin( theta0 );
var A1X:Number = R * Math.cos( theta0 + thetas_divided );
var A1Y:Number = R * Math.sin( theta0 + thetas_divided );

// コード#3
var RC:Number = R / Math.cos(thetas_divided/2);
var CX:Number = RC * Math.cos( theta0 + thetas_divided/2 );
var CY:Number = RC * Math.sin( theta0 + thetas_divided/2 );

// コード#1
sp.graphics.lineStyle(1, 0xABCDEF); // 線の太さ、色は固定です。パラメタ化して!

if(nuri == 1){ // nuri:1 塗りつぶし指定
sp.graphics.beginFill(0xABCDEF);  // 色は固定です。パラメタ化して!
}

sp.graphics.moveTo( centerX+A0X, centerY+A0Y );
sp.graphics.curveTo(centerX + CX, centerY + CY, centerX + A1X, centerY + A1Y);

if(nuri == 1){
sp.graphics.lineTo(centerX, centerY);
sp.graphics.endFill();
}

if(thetas != 0)
theta0 += Math.PI / 4;
}
}

}

}

どないでしょ。

スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://tadpolizemedia.blog118.fc2.com/tb.php/173-c6388482

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

 二代目松四郎

Author: 二代目松四郎


「カメラと動画(+スチル写真)」
「音響と音楽」
「プログラミング」
を主なテーマに活動しています。
映画館と美術館と音楽ホールと
古い街並みが私の学校。

宮城県仙台市在住。

カテゴリー

ブログ内検索

ブロとも申請フォーム

この人とブロともになる

Counter

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。