In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: クラリネットメソッド

ドが壊れれば,レとミとファとソとラとシも壊れるものです.
【壊れ物リスト】
- Number, Math 一式
- var
- 乗算/除算
- 比較演算子
- ループ関数
- d, _s
解説してみようとおもったらd, _sの存在意義がわからなかったので消しました。
Get Adobe Flash player
by uwi 04 Dec 2009
  • Forked from keim_at_Si's クラリネットメソッド
  • Diff: 22
  • Related works: 2
  • Talk

    keim_at_Si at 05 Dec 2009 10:16
    _sとdで平方根の小数部分を計算するんですがこの例だと完全に冗長ですね.途中で気付いたんですが実装時間の大半をそこに費やしてて消すのが忍びなかったのでそのまま残しました.あと,Forkして頂いたバージョンだと_sにiを渡す部分が間違ってます→i<<7
    Embed
/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/7vqR
 */

// forked from keim_at_Si's クラリネットメソッド
// forked from bkzen's 【問題】Graphics の drawCircle と drawRoundRect が壊れました
//
// ドが壊れれば,レとミとファとソとラとシも壊れるものです.
// 【壊れ物リスト】
// - Number, Math 一式
// - var
// - 乗算/除算
// - 比較演算子
// - ループ関数
// - d, _s
// 解説してみようとおもったらd, _sの存在意義がわからなかったので消しました。
package 
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	
	/**
	 * Graphics.drawCircle と drawRoundRect が壊れました。
	 * 別の方法で、半径 CIRCLE_RADIUS の 円を書きなさい。
	 * @mxmlc -o bin/CircleTest.swf -load-config+=obj\Alltest3Config.xml
	 * @author jc at bk-zen.com
	 */
	public class CircleTest extends Sprite
	{
		private const ANSWER_COLOR: uint = 0x003366;
		private const COLOR: uint = 0x3399CC;
		private const CIRCLE_RADIUS: Number = 50;
		
		public function CircleTest() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e: Event = null): void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//
			var centerX: Number = (stage.stageWidth - CIRCLE_RADIUS) / 2;
			var centerY: Number = (stage.stageHeight - CIRCLE_RADIUS) / 2;
			var g: Graphics = graphics;
			// 差を見るために解答として先に半径+1 の円を描いておきます。
			g.beginFill(ANSWER_COLOR); g.drawCircle(centerX, centerY, CIRCLE_RADIUS + 1);
			
			// 
			drawCircle(g, centerX, centerY, CIRCLE_RADIUS, COLOR);
		}
		
		/**
		 * これを作る。
		 * @param	g
		 * @param	x
		 * @param	y
		 * @param	r
		 * @param	color
		 */
		public function drawCircle(g: Graphics, x: Number, y: Number, r: Number, color: uint): void
		{
                        // intの範囲内でr+o*iを計算
                        // iの2進数の各桁毎にoを倍ったものをrにたしていってる
                        // o&(~(x-1))= 0 (x=0), o(x=1)
			function m(o:int, i:int, r:int=0) : int {
				return i?m(o<<1,i>>1,r+(o&(~((i&1)-1)))):r;
			}
			
//                        // i-o-1>>>31 === (i <= o ? 1 : 0)
                        // oの、(iの最高位-t)桁目以上の桁の部分を抜き出す??
                        /*
 			function d(o:int, i:int, r:int=0, t:int=17) : int { 
				return t?d(o-(i-o-1>>>31?i:0),i>>1,(r+(i-o-1>>>31))<<1,t-1):r>>1;
			}
*/
			
                        // oの平方根を求める。
                        // 架空の変数tを1からインクリメントして、平方数rがoをこえたら何か返す。
                        // マイナスの場合何を返しているのか不明
                        // i=2t-1
                        // r=(t-1)^2
			function s(o:int, i:int=1, r:int=0) : int { 
				return (r-o>>>31)?s(o,i+2,r+i):(i>>>1);
//				return (r-o>>>31)?s(o,i+2,r+i):_s(o<<8,i<<8)>>8;
			}
			
/*
			function _s(o:int, n:int, i:int=8) : int {
				return i?_s(o,n+d(o,n<<8)>>1,i-1):n;
			}
*/
			
			function render(i:int, t:int=1) : int {
				g.moveTo(x-i, y-t+1);
				g.lineTo(x+i, y-t+1);
				g.moveTo(x-i, y+t-1);
				g.lineTo(x+i, y+t-1);
                                // renderの第1引数はsqr(r^2-t^2)にならなければいけないので、
                                // mは乗算、sは平方根を求める関数だろうとあたりをつける。
				return (r-t>>>31)?0:render(s(-m(t,t,-m(r,r))),t+1);
			}
			
			g.lineStyle(1, color);
			render(r);
		}
		
	}

}