CPCT
♥0 |
Line 139 |
Modified 2016-08-03 12:30:48 |
MIT License
archived:2017-03-20 11:40:44
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);
}
}
}