flash on 2010-11-9

by h_sakurai
@author Simo Santavirta / (jac) EvoFlash (evo.bombsquad.org)
♥0 | Line 90 | Modified 2010-11-09 07:03:21 | MIT License
play

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;
}