CPCT

by hemingway
♥0 | Line 139 | Modified 2016-08-03 12:30:48 | MIT License
play

ActionScript3 source code

/**
 * Copyright hemingway ( http://wonderfl.net/user/hemingway )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/gh1D
 */

package {
    import flash.events.Event;
    import flash.display.Bitmap;
    import flash.display.Sprite;
    import flash.display.BitmapData;
    import flash.text.TextField;
    import flash.utils.*;
    
    [SWF(frameRate=60, width=465, height=465)]
    public class CPCT extends Sprite {
        private var _canvas:Bitmap;
        private var _canvasData:BitmapData;
        private var _pixels:Vector.<Vector.<int>>;
        private var _text:TextField;
        
        public function CPCT() {
            this._canvasData = new BitmapData(465, 465, false, 0x000000);
            this._canvas = new Bitmap(this._canvasData);
            this._text = new TextField();

            this.addEventListener(Event.ADDED_TO_STAGE, this.addedToStageHandler);
        }
        
        private function addedToStageHandler($event:Event):void {
            this.removeEventListener(Event.ADDED_TO_STAGE, this.addedToStageHandler);
            
            this.addChild(this._canvas);
            this.initScene();
            
            //this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler);
        }
        
        private function initScene():void {
            this._text.x = 25;
            this._text.y = 25;
            this._text.width = 300;
            this._text.height = 100;
            this._text.textColor = 0xffffff;
            this.addChild(this._text);
            
            var $bitApproxBench:Number = benchmark(function():uint {
                var $dx:int = 25;
                var $dy:int = 25;
                var $min:uint;
                var $max:uint;
                
                if ($dx < 0) $dx = -$dx;
                if ($dy < 0) $dy = -$dy;
                
                if ($dx < $dy) {
                    $min = $dx;
                    $max = $dy;
                } else {
                    $min = $dy;
                    $max = $dx;
                }
    
                return ((($max << 8) + ($max << 3) - ($max << 4) - ($max << 1) + 
                         ($min << 7) - ($min << 5) + ($min << 3) - ($min << 1)) >> 8);
            }, 1000000) / 1000000;
            
            var $approxBench:Number = benchmark(function():uint {
                var $dx:int = 25;
                var $dy:int = 25;
                var $min:uint;
                var $max:uint;
                var $approx:uint;
            
                if ($dx < 0) $dx = -$dx;
                if ($dy < 0) $dy = -$dy;
                
                if ($dx < $dy) {
                    $min = $dx;
                    $max = $dy;
                } else {
                    $min = $dy;
                    $max = $dx;
                }
                
                $approx = ($max * 1007) + ($min * 441);
                if ($max < ($min << 4))
                    $approx -= ($max * 40);
            
                // add 512 for proper rounding
                return(($approx + 512) >> 10);
            }, 1000000) / 1000000;
            
            var $euclidBench:Number = benchmark(function():uint {
                var $dx:int = 25;
                var $dy:int = 25;
                return Math.sqrt($dx*$dx+$dy*$dy);
            }, 1000000) / 1000000;

            
            this._text.text = "Bit Approximate Distance: " + this.getBitApproxDistance() + " ... " + $bitApproxBench + "ms" +  
                "\nApproximate Distance: " + this.getApproxDistance() + " ... " + $approxBench + "ms" +
                "\nEuclidian Distance: " + this.getEuclidDistance() + " ... " + $euclidBench + "ms";
        }
    
        private function getBitApproxDistance():uint {
            var $dx:int = 25;
            var $dy:int = 25;
            var $min:uint;
            var $max:uint;
            
            if ($dx < 0) $dx = -$dx;
            if ($dy < 0) $dy = -$dy;
            
            if ($dx < $dy) {
                $min = $dx;
                $max = $dy;
            } else {
                $min = $dy;
                $max = $dx;
            }

            return ((($max << 8) + ($max << 3) - ($max << 4) - ($max << 1) + 
                     ($min << 7) - ($min << 5) + ($min << 3) - ($min << 1)) >> 8);
        }
        
        private function getFirstDistance():uint {
            var $dx:int = 23;
            var $dy:int = 22;
            var $min:uint;
            var $max:uint;
            
            if ($dx < 0) $dx = -$dx;
            if ($dy < 0) $dy = -$dy;
            
            if ($dx < $dy) {
                $min = $dx;
                $max = $dy;
            }

            return ((~$dx^$dy*31)>>31);
        }

        
        private function getApproxDistance():uint {
           var $dx:int = 25;
           var $dy:int = 25;
           var $min:uint;
           var $max:uint;
           var $approx:uint;
        
           if ($dx < 0) $dx = -$dx;
           if ($dy < 0) $dy = -$dy;
            
           if ($dx < $dy) {
               $min = $dx;
               $max = $dy;
           } else {
               $min = $dy;
               $max = $dx;
           }
            
           $approx = ($max * 1007) + ($min * 441);
           if ($max < ($min << 4))
              $approx -= ($max * 40);
        
           // add 512 for proper rounding
           return(($approx + 512) >> 10);
        }
        
        private function getEuclidDistance():Number {
            var $dx:int = 25;
            var $dy:int = 25;
            return Math.sqrt($dx*$dx+$dy*$dy);
        }


        private function benchmark($f:Function, $r:int = 10):Number {
            var $t:Number = getTimer();
            while(--$r >= 0) $f();
            return(getTimer() - $t);
        }
 
    }
}