Spark project 勉強会#6でお話した「曲線の公式を使って図形を描いたりするライブラリ」について。
各曲線の数学的公式を1つ1つのクラスとして用意し、ごそごそ座標計算をするライブラリです。
Spark project/CurveLib
http://www.libspark.org/wiki/e_s_jp/CurveLib
ICurveFormulaインタフェースを実装した曲線の公式定義クラスと、その公式定義をいろいろ計算するCurvePointクラスがいらっしゃいます。
それだけでは、見た目に楽しくないので CurveGraphicsクラスというgraphics.lineTo()して曲線を描画するクラスもあったりします。
CurveLibを使ってどんな曲線が描けて、また公式定義クラスの引数確認用にサンプルサイトを作ったので見てみてください。
CurveLib
http://violentcoding.com/content/curvelib/上記のCurveLibサイトと同じものSWF置き場(ローカルFlashPlayerの方が描画が早いのでこちらをおすすめ)
http://www.libspark.org/svn/as3/CurveLib/trunk/doc/fp9/formulaSWF/
それでは、CurveLib概要。
CurvePointクラス
- 曲線の公式を使った計算
- 半径を1.0として計算
ICurveFormulaインタフェース
- 曲線公式の定義
- 半径を1.0として定義
今用意している曲線は以下のようなものです。
- Botanic Curve
- Rhodonea(バラ曲線)
- Epitrochoid(外トロコイド)
- Hypotrochoid(内トロコイド)
- Starr Rose
※半径を1.0で計算し、また始点から終点への周回数計算が楽なため公式定義の引数に分母と分子を設定するとか数学的公式とは違ってクセがあります。
クラス図としては以下になります。一応公式クラスを追加しても、まぁ良い感じになるように学習してみました。
// 参考コード // CurveGraphicsの抽象的クラス var curve : CurveGraphicsBase; // 公式の計算をするCurvePointクラスを用意 var curvePoint : CurvePoint = new CurvePoint( new BotanicCurveFormula( 5, 4, 1, 5 ) ); // 半径200でCurveGraphicsクラスを用意 curve = new CurveGraphics( 200, curvePoint ); // 計算系の設定 curve.stepSize = 1 ; curve.startAngle = 0; curve.isClockWise = !true; curve.isLoop = !true; // 配置座標(曲線の中心が0,0) curve.x = 250; curve.y = 250; addChild( curve ); // 描画の線設定 curve.lineStyle( 0, 0x000000 ); // 描画の塗り設定 curve.beginFill( 0xFF0000, 0.25 ); // 曲線の描画 curve.lineCurve( true );
CurveLibの主要となるのはCurvePointクラス。
CurvePointクラスのメソッドとしては、
- 指定角度でのXY座標を取得:getAnglePoint( angle )
- 曲線上の計算する点の数を取得:getPointCount()
- タイマー計算:startCurvePoint( delay, isClose )
- タイマー計算の制御:startTick()・stopTick()・resetTick()
- タイマー計算時イベント:start・stop・tick・complete・loop イベント
CurvePointクラスのプロパティとしては、
- formulaプロパティ:使用する公式(ICurveFormula)
- 何度ごとに計算するか:stepSizeプロパティ
- 開始角度の指定:startAngleプロパティ
- 時計周りに計算するかどうか:isClockWiseプロパティ
- ループさせるか:isLoopプロパティ
を用意しましたので、それらを駆使して曲線上の座標値でゴソゴソします。
またCurvePointクラスを使用して曲線をgraphics.lineTo()するCurveGraphicsクラスでも数種類の曲線描画ができたりします。
CurveGraphicsクラス
- CurvePointクラスと「曲線の半径」を指定する
- graphics.lineTo()などする
- for文で一気に描画するパターン
- タイマーで描画するパターン
- 曲線の中心点が( x=0, y=0 )
- graphics.endFill()のtrue/falseを指定して連続描画
CurveGraphicsクラスでの描画パターン(1)for文で一気に描くタイプ
- 線・塗りで曲線を描画:lineCurve( isEndFill )
- 曲線上の点を円で描画:chipCurve( chipRadius, isChipFill )
- 曲線上の点Pと指定角度をずらした点Qを結んだ線を描画:lineAngleBetween( angleBetween )
サンプルは以下
http://www.libspark.org/svn/as3/CurveLib/trunk/samples/fp9/samples/
のSample01.fla・src/Sample01.asが該当です。
CurveGraphicsクラスでの描画パターン(2)タイマーでチクチク描くタイプ
- 線・塗りで曲線をタイマー描画:tickLineCurve( delay, isEndFill )
- 曲線上の点を円でタイマー描画:tickChipCurve( delay, chipRadius, isChipFill )
- 曲線上の点Pと指定角度をずらした点Qを結んだ線をタイマー描画:tickLineAngleBetween( delay, angleBetween )
サンプルは以下
http://www.libspark.org/svn/as3/CurveLib/trunk/samples/fp9/samples/
のSample02.fla・src/Sample02.asが該当です。
また、塗りの設定で以下の違いがでます。
CurveGraphicsクラスでの描画 引数「isEndFill」== trueの場合
- 線の描画の最後でgraphics.endFill()を実行
- 次の描画ではあらためてbeginFill()にて色を設定する必要がある。
CurveGraphicsクラスでの描画 引数「isEndFill」== falseの場合
- 線の描画の最後でもgraphics.endFill()をしない
- endFill()、beginFill()をしないので、塗りが閉じられずにそのまま次の描画に続く。
サンプルは以下
http://www.libspark.org/svn/as3/CurveLib/trunk/samples/fp9/samples/
のSample03.fla・src/Sample03.as、Sample04.fla・src/Smaple04.asが該当です。
また、ASDocコメント記述の学習もしてみたので、その他については以下を参照してください。
CurveLib ASDoc
http://www.libspark.org/svn/as3/CurveLib/trunk/doc/fp9/asdoc-output/
