スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 単純挿入法によるソートの3D可視化

2008-01-19 | 15:45

こちらは単純挿入法によるソートのデモ。
前回のバブルソートとアルゴリズム的には大差がない。
クリックで開始されます。
(Papervision3D 2.0 GreatWhite使用)

バブルソートと同様にアルゴリズムは単純だが、ソート前のデータがある程度ソートされている場合はこちらの方が早い。
ただし、バブルソートもこちらも遅いアルゴリズムなので、データが大量にある場合にはむかない。

package {
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.*;
        
        import org.papervision3d.cameras.FreeCamera3D;
        import org.papervision3d.lights.PointLight3D;
        import org.papervision3d.materials.*;
        import org.papervision3d.materials.utils.MaterialsList;
        import org.papervision3d.materials.special.*;
        import org.papervision3d.materials.shadematerials.*;
        import org.papervision3d.objects.DisplayObject3D;
        import org.papervision3d.objects.primitives.Cube;
        import org.papervision3d.objects.primitives.Plane;
        import org.papervision3d.render.BasicRenderEngine;
        import org.papervision3d.scenes.Scene3D;
        import org.papervision3d.view.Viewport3D;
        
        import caurina.transitions.Tweener;
        
        [SWF(backgroundColor="0xffffff", width="500", height="400", frameRate="30")]
        public class Sort extends Sprite
        {
                private var renderer:BasicRenderEngine
                private var scene:Scene3D;
                private var camera:FreeCamera3D;
                private var viewport:Viewport3D;
                
                // 3d Objects
                private var pointLight:PointLight3D;
                
                private var planes:Array = [];
                private var processing:Boolean = false;
                
                private var temp:int;
                private var current:int;
                
                private var INTERVAL:int = 16;
                private var SIZE:int = 50;
                
                public function Sort()
                {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        
                        renderer = new BasicRenderEngine();
                        scene = new Scene3D();
                        camera = new FreeCamera3D();
                        viewport  = new Viewport3D(0, 0, true, false);
                        addChild(viewport);
                        
                        pointLight = new PointLight3D();
                        pointLight.x = pointLight.y = pointLight.z = 600;
                        pointLight.z = -100;
                        
                        init();
                        
                        stage.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
                }
                
                private function init():void{
                        for each(var c:Cube in planes){
                                scene.removeChild(c);
                        }
                        planes = [];
                        for(var i:int = 0 ; i < SIZE ; i++){
                                var r:Number = 400*Math.random()+50;
                                
                                var material:GouraudMaterial = new GouraudMaterial(pointLight);
                                
                                var cube:Cube =new Cube(new MaterialsList({all:material}),r,r,4,1,1,1);
                                cube.y = i*INTERVAL;
                                cube.name = r.toString();
                                scene.addChild(cube);
                                planes.push(cube);
                        }
                }
                
                private function handleEnterFrame(e:Event):void
                {
                        camera.x=camera.y=camera.z=0;
                        camera.yaw(.3);
                        camera.moveBackward(600);
                        camera.moveUp(450);
                        renderer.renderScene(scene, camera, viewport);
                }
                
                private function mouseDown(e:Event):void{
                        
                        if(processing)
                        return;
                        processing = true;
                        init();
                        
                        temp = current = 1;
                        simplesort();
                }
                
                private function simplesort() : void{
                        trace("current=" + current.toString());
                        trace("temp=" + temp.toString());
                        
                        if(current < SIZE){
                                var j:int = temp-1;
                                var c:Cube = planes[temp];
                                var n:Cube = planes[j];
                                if(Number(c.name) > Number(n.name)){
                                        
                                        Tweener.addTween(c, {y:j*INTERVAL, x:0,
                                                                                               _bezier:[{y:temp*INTERVAL, x:-400}, {y:j*INTERVAL, x:-400},],
                                                                                               time:0.3, transition:"linear"} );
                                        
                                        Tweener.addTween(n, {y:temp*INTERVAL, x:0,
                                                                 _bezier:[{y:j*INTERVAL, x:400}, {y:temp*INTERVAL, x:400},],
                                                                 time:0.3, transition:"linear",
                                                                 onComplete:function():void{simplesort()}});
                                        
                                        // 中身を並び替える
                                        planes[temp] = n;
                                        planes[j] = c;
                                        if(--temp <= 0){
                                                current++;
                                                temp = current;
                                        }
                                }else{
                                        current++;
                                        temp = current;
                                        simplesort();
                                }
                        }else
                        processing = false;
                }
        }
}

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。