flash on 2010-11-9
@author Simo Santavirta / (jac) EvoFlash (evo.bombsquad.org)
♥0 |
Line 90 |
Modified 2010-11-09 07:03:21 |
MIT License
archived:2017-03-20 02:06:28
ActionScript3 source code
/**
* Copyright h_sakurai ( http://wonderfl.net/user/h_sakurai )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/d2WY
*/
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.utils.getTimer;
/**
* @author Simo Santavirta / (jac) EvoFlash (evo.bombsquad.org)
*/
[SWF(backgroundColor="#000000", frameRate="60", quality="high", width="800", height="600")]
public class ZSortTest extends Sprite
{
private var count:int = 100000;
private var particles:Vector.<Particle3D>;
private var particleArray:Array;
private var first:Particle3D;
private var resultTf:TextField;
public function ZSortTest()
{
particleArray = new Array();
particles = new Vector.<Particle3D>(count);
var l:int = int(count-1);
var rnd:int = 43143141;
for(var i:int = l; i > -1; i--)
{
rnd = rnd * 4314141 + 43141433;
particleArray[i] = particles[i] = new Particle3D();
particles[i].x = 1//1000 * Math.random();
particles[i].y = 1//-500 + 1000*Math.random();
particles[i].z = rnd;//50000 - i//-500 + 1000*Math.random();
particles[i].i = i;
if(i < l) particles[i].next = particles[int(i+1)];
if(i < l) particles[int(i+1)].prev = particles[i];
}
first = particles[0];
resultTf = new TextField();
resultTf.textColor = 0xFFFFFF;
resultTf.width = 1024;
resultTf.height = 576;
resultTf.multiline = true;
resultTf.wordWrap = true;
resultTf.selectable = true;
this.addChild(resultTf);
this.addEventListener(Event.ENTER_FRAME, render);
stage.addEventListener(MouseEvent.CLICK, click);
}
private function click(event:MouseEvent):void
{
this.removeEventListener(Event.ENTER_FRAME, render);
}
private var time:int;
private var output:int;
private function render(event:Event):void
{
/*
time = getTimer();
particles.sort(sort);
for(var i:int = 0; i < count; i++)
{
output = particles[i].i;
}
resultTf.appendText("Vector sort: "+ (getTimer() - time) + "\n");
//*/
/*
time = getTimer();
shellSort(particles);
for(var i:int = 0; i < count; i++)
{
output = particles[i].i;
}
//trace("Vector shellShort method: ", (getTimer() - time));
resultTf.appendText("Vector shellShort method: "+ (getTimer() - time) + "\n");
//*/
/*
time = getTimer();
var n:int = count;
var inc:int = int(n/2 + 0.5);
var a:Particle3D, b:Particle3D;
var j:int, i:int;
var temp:Number;
while(inc)
{
for(i=inc; i<n; i++)
{
a = particles[i];
temp = a.z;
j = i;
b = particles[int(j - inc)];
while(j >= inc && b.z > temp)
{
a.z = b.z;
j = int(j - inc);
}
particles[j].z = temp
}
inc = int(inc / 2.2 + 0.5);
}
for(i = 0; i < count; i++)
{
output = particles[i].i;
}
//trace("Vector shellShort: ", (getTimer() - time));
resultTf.appendText("Vector shellShort: "+ (getTimer() - time) + "\n");
//*/
/*
time = getTimer();
particleArray.sort(sort);
for(var i:int = 0; i < count; i++)
{
output = particleArray[i].i;
}
//trace("Array sort: ", (getTimer() - time));
resultTf.appendText("Array sort: "+ (getTimer() - time) + "\n");
//*/
/*
time = getTimer();
particleArray.sortOn("z", Array.NUMERIC);
for(var i:int = 0; i < count; i++)
{
output = particleArray[i].i;
}
//trace("Array sortOn: ", (getTimer() - time));
resultTf.appendText("Array sortOn: "+ (getTimer() - time) + "\n");
//*/
/*
time = getTimer();
// Z-SORT
//
// Insertion sort by Michael Baczynski http://lab.polygonal.de/
// Only slightly modified.
//
// (simppafi: I cannot think of any other developer I've learned more then Michael Baczynski.)
//
// Jedi+Voodoo : 358
var f:Particle3D = first;
var n:Particle3D, j:Particle3D, p:Particle3D, c:Particle3D;
c = f.next;
while(c)
{
n = c.next;
p = c.prev;
if (c.z > p.z)
{
j = p;
while(j.prev)
{
if (c.z > j.prev.z)
{
j = j.prev;
}else{
break;
}
}
if (n) {
p.next = n;
n.prev = p;
} else {
p.next = null;
}
//n ? (p.next = n, (n.prev = p)) : p.next = null;
if (j == f) {
c.prev = null;
c.next = j;
j.prev = c;
f = c;
} else {
c.prev = j.prev;
j.prev.next = c;
c.next = j;
j.prev = c;
}
}
c = n;
}
first = f;
while(f)
{
output = f.i;
f = f.next;
}
//trace("Insertion sort + linked list: " + (getTimer() - time));
resultTf.appendText("Jedi+Voodoo : "+ (getTimer() - time) + "\n");
//*/
/*
time = getTimer();
// Z-SORT
//
// Linkedlist Radix sort by Rob Bateman http://www.infiniteturtles.co.uk
var q0:Vector.<Particle3D> = new Vector.<Particle3D>(256, true);
var q1:Vector.<Particle3D> = new Vector.<Particle3D>(256, true);
var i:int = 0;
var k:int;
var f:Particle3D = first;
var p:Particle3D, c:Particle3D;
c = f;
while (c) {
c.sort = q0[k = (255 & c.z)];
q0[k] = c;
c = c.next;
}
i = 256;
while (i--) {
c = q0[i];
while (c) {
p = c.sort;
c.sort = q1[k = (65280 & c.z) >> 8];
q1[k] = c;
c = p;
}
}
i = 0;
k = 0;
//trace("sorted----");
while (i < 255) {
c = q1[i];
while (c) {
output = c.z;
//trace(output);
c = c.sort;
}
i++;
}
//trace("Linkedlist Radix sort: " + (getTimer() - time));
resultTf.appendText("Linkedlist Radix sort: "+ (getTimer() - time) + "\n");
//*/
///*
time = getTimer();
// Z-SORT
//
// Radix sort by Rob Bateman http://www.infiniteturtles.co.uk
var q0:Vector.<int> = new Vector.<int>(256, true);
var q1:Vector.<int> = new Vector.<int>(256, true);
var np0:Vector.<int> = new Vector.<int>(particles.length + 1, true);
var np1:Vector.<int> = new Vector.<int>(particles.length + 1, true);
var data:Vector.<int> = new Vector.<int>(particles.length, true);
var p:Particle3D;
var length:int = particles.length;
var i:int = 0;
var j:int = 0;
var k:int;
while (i < length) {
p = particles[i];
np0[int(i+1)] = q0[k = (255 & (data[i] = p.z))];
q0[k] = int(++i);
}
i = 256;
while (i--) {
j = q0[i];
while (j) {
np1[j] = q1[k = (65280 & data[int(j-1)]) >> 8];
j = np0[q1[k] = j];
}
}
i = 0;
k = 0;
while (i < 255) {
j = q1[int(i++)];
while (j) {
p = particles[int(j-1)];
output = p.z;
j = np1[j];
}
}
//trace("Radix sort: " + (getTimer() - time));
resultTf.appendText("Radix sort: "+ (getTimer() - time) + "\n");
//*/
}
/**
* Modified code of Tuomas Artman http://www.artman.fi/
*/
final private function sort(a:Particle3D, b:Particle3D):int {
return (a.z==b.z ? 0 : (a.z < b.z) ? -1 : 1);
}
/**
* Modified from AS3 port of Tuomas Artman http://www.artman.fi/
*/
final private function shellSort(data:Vector.<Particle3D>):void {
var n:int = data.length;
var inc:int = int(n/2 + 0.5);
var a:Particle3D, b:Particle3D;
var j:int, i:int;
var temp:Number;
while(inc)
{
for(i=inc; i<n; i++)
{
a = data[i];
temp = a.z;
j = i;
b = data[int(j - inc)];
while(j >= inc && b.z > temp)
{
a.z = b.z;
j = int(j - inc);
}
data[j].z = temp
}
inc = int(inc / 2.2 + 0.5);
}
}
}
}
class Particle3D {
public var next:Particle3D;
public var prev:Particle3D;
public var x:Number;
public var y:Number;
public var z:Number;
public var i:int;
}