‘wonderfl’ タグのついている投稿

curveToの仕組みと1日1Wonderfl

2009 年 11 月 16 日 月曜日 by key

BOW新メンバーのgupon君に聞かれたので、curveToの仕組みについてまとめてみます。

curveToの仕組み

「点Aから点Bへ向けてスタートし、点Cへ到達する曲線」をASでは

  1. graphics.moveTo(a.x, a.y);
  2. graphics.curveTo(b.x, b.y, c.x, c.y);

と書くことができます。

では、この曲線はどのようなルールで描かれているのでしょうか?

この曲線が通過する点は、以下のルールを満たします。

線分ABを t : (1-t) に内分する点をD、
線分BCを t : (1-t) に内分する点をE としたとき、
線分DEを t : (1-t) に内分する点 (ただし、0 ≦ t ≦ 1 です)

実際に見てみましょう。

flash on 2009-11-16 - wonderfl build flash online

上記のルールで描いた丸が、ちょうど曲線の上に重なっています。

では、この仕組みを覚えると何に役立つでしょうか。

(more…)

「AS3で半径小さい円を描いて拡大したらつぶれていて~」の原因を検証

2009 年 1 月 2 日 金曜日 by key

先日nitoyonさんの AS3で半径小さい円を描いて拡大したらいびつになってる にコメント書かせてもらったのですが、推測のままだったので検証してみました。

「drawCircle内部で行われている描画の各座標が1twipで丸められている」という仮説なので、drawCircleのコードを見て丸めてやれば良いのでは…と思ったんですがdrawCircleのコードが見れないですね。はいはい書きます書きます。

  1. /**
  2. * flash.display.Graphics#drawCircle再実装
  3. * コードは推測。でも合っているっぽい
  4. */
  5. private function drawCircle(graphics:Graphics, x:Number, y:Number, radius:Number):void {
  6.     var cradius:Number = radius * CONTROLPOINT_RADIUS;
  7.     graphics.moveTo(x + radius, y);
  8.     for (var i:uint=0; i<8; i++) {
  9.         var ca:Number = (i + 0.5) / 8 * Math.PI * 2;
  10.         var aa:Number = (i +   1) / 8 * Math.PI * 2;
  11.         graphics.curveTo(
  12.             x + Math.cos(ca) * cradius, y + Math.sin(ca) * cradius,
  13.             x + Math.cos(aa) * radius, y + Math.sin(aa) * radius
  14.         );
  15.     }
  16. }

この内部で使われているmoveToとcurveToに渡す座標を、拡大後の0.05pixelに相当する大きさで丸めて同じ表示になれば成功。

コード全体と結果はwonderflで。