クラリネットメソッド

Pocket


[ソース表示]
bkzen氏の【問題】Graphics の drawCircle と drawRoundRect が壊れましたへの回答forkです。そのままでは面白くないので、Number、var、Math一式、代入/比較/乗除算、ループ関数を使わずに円を書いてみました。

public function drawCircle(g: Graphics, x: Number, y: Number, r: Number, color: uint): void
{
    function m(o:int, i:int, r:int) : int {
        return i?m(o<<1,i>>1,r+(o&(~((i&1)-1)))):r;
    }
    
    function d(o:int, i:int, r:int, t:int) : int {
        return t?d(o-(i-o-1>>>31?i:0),i>>1,(r+(i-o-1>>>31))<<1,t-1):r>>1;
    }
    
    function s(o:int, i:int, r:int) : int {
        return (r-o>>>31)?s(o,i+2,r+i):_s(o<<8,i<<7,0);
    }
    
    function _s(o:int, i:int, t:int) : int {
        return t?_s(o,i+d(o,i<<8,0,17)>>1,t-1):i;
    }
    
    function render(i:int, t:int) : int {
        g.drawRect(x-i+1,y-t+1,i+i-2,t+t-2);
        return (r-t>>>31)?0:render(s(-m(t,t,-m(r,r,0)),1,0)>>8,t+1);
    }
    
    g.lineStyle(1, color);
    render(r, 1);
}

概説;
加減算/シフト演算/3項演算子と再帰呼び出しのみを用いて、それぞれm()は乗算、d()は除算、s()は平方根を計算しています(除算は平方根の小数部を計算するためのもので、今回のように整数だけでよい場合は必要ありません)。
で、これらの3つの演算を用いてx=sqrt(y^2)を計算してrender()で円を塗りつぶしています。

Leave a Reply

Your email address will not be published. Required fields are marked *