てっく煮ブログ

2008年12月30日

AS3で半径小さい円を描いて拡大したらいびつになってる

題のまま。1×1の範囲に図形を描画して、あとで倍率変更してステージ全体に広げるコードを書いていたらうまく描画されずに悩んでしまった。

円を描画するのはそこそこコストがかかる処理なので、半径が小さいときにはパス数を減らす最適化をしているんだろう。

(追記)Flash 内部で 1/20 ピクセル以下の座標は切り捨てられているらしい。コメント欄で教えてもらいました。ありがとうございます。

適度に 100×100 などの領域に描画するのがよさそう。逆に、1000×1000のような領域に図形を描画してから縮小して使うと、描画効率が悪くなると予想される。

以下、実証コード。wonderfl にも置いた

package{   
import flash.display.Sprite;   
public class GunyaGunya extends Sprite{   
    public function GunyaGunya(){   
        var s:Sprite = new Sprite();   
        s.graphics.beginFill(0xff0000);   
        s.graphics.drawCircle(0, 0, 0.1);   
        s.graphics.endFill();   
        s.scaleX = s.scaleY = 200;   
        s.x = s.y = 100;   
        addChild(s);   
  
        s = new Sprite();   
        s.graphics.beginFill(0x0000ff);   
        s.graphics.drawCircle(0, 0, 0.2);   
        s.graphics.endFill();   
        s.scaleX = s.scaleY = 100;   
        s.x = s.y = 200;   
        addChild(s);   
  
        s = new Sprite();   
        s.graphics.beginFill(0x006600);   
        s.graphics.drawCircle(0, 0, 0.25);   
        s.graphics.endFill();   
        s.scaleX = s.scaleY = 100;   
        s.x = 240; s.y = 80;   
        addChild(s);   
    }   
}   
}  

fladdictfladdict 2008/12/30 21:25 パス数を減らしてるんじゃなくて、FlashのDisplayObjectの座標が小数点で下ウン桁でまるまっちゃってるんだと思う。

keykey 2008/12/31 01:16 ですね。各コントロールポイントとアンカーポイントの座標が1twip = 0.05pixelで丸まってると思います。

nitoyonnitoyon 2008/12/31 03:07 なるほどー。勉強になりました!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証