[ff]: Pie surface

by bradsedito forked from Pie surface (diff: 139)
♥0 | Line 151 | Modified 2012-08-16 05:10:14 | MIT License
play

ActionScript3 source code

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





package 
{
    import flash.display.*
    import flash.events.*
    import flash.geom.*


    public class Main extends Sprite 
    {
        public  const   divider   :Number  =  18
        public  const   dist      :Number  =  600
        public  var     tolerance :Number  =  6
        public  var     faces     :Array;
        public  var     array     :Array;
        public  var     adds      :Array;
        public  var     core      :Sprite;
        
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
               
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // ENTRY POINT:

            this.x = 465 / 2;
            this.y = 465 / 2;
            this.z = 0; 

            core = new Sprite();
            core.y =  tolerance/2;   // (100 + tolerance) / 2;
            core.rotationX = -40;
            this.addChild(core);
            
            array = [];
            adds  = [];

//            
            for (var it:int = 0; it < 360 / divider; it++) 
            {
                var points:Array = [];
                var adders:Array = [];

                for (var dit:int = 0; dit < 20; dit++) 
                {
                    points.push(1 + Math.floor(Math.random() * tolerance) - tolerance / 2);
                    //points.push(100 + Math.floor(Math.random() * tolerance) - tolerance / 20);
                    adders.push((Math.random() * 10 - 5) / 1000);
                    //adders.push((Math.random() * 100 - 50) / 100);
                }
                
                array.push(points);
                adds.push(adders);
            }
            
            setTriangles();

            this.addEventListener(Event.ENTER_FRAME, piesurface);
        }
            
        public function setTriangles():void 
        {
            faces = [];

            for (var ind:int = 0; ind < array.length; ind++) 
            {
                
                for (var dind:int = 0; dind < array[ind].length - 1; dind++) 
                {

                    if (ind < array.length - 1) 
                    {
                        addNewTriangle(new Vector3D(Math.cos(ind * divider * Math.PI / 180) * dind * 10, -array[ind][dind], Math.sin(ind * divider * Math.PI / 180) * dind * 10),
                                        new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * dind * 10, -array[(ind + 1)][dind], Math.sin((ind + 1) * divider * Math.PI / 180) * dind * 10),
                                        new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (dind + 1) * 10, -array[ind][(dind + 1)], Math.sin(ind * divider * Math.PI / 180) * (dind + 1) * 10)
                                        );                        

                        addNewTriangle(new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * dind * 10, -array[(ind + 1)][dind], Math.sin((ind + 1) * divider * Math.PI / 180) * dind * 10),
                                        new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (dind + 1) * 10, -array[ind][(dind + 1)], Math.sin(ind * divider * Math.PI / 180) * (dind + 1) * 10),
                                        new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (dind + 1) * 10, -array[(ind + 1)][(dind + 1)], Math.sin((ind + 1) * divider * Math.PI / 180) * (dind + 1) * 10)
                                        );

                    }
                    else 
                    {
                        addNewTriangle(new Vector3D(Math.cos((array.length - 1) * divider * Math.PI / 180) * dind * 10, -array[(array.length - 1)][dind], Math.sin((array.length - 1) * divider * Math.PI / 180) * dind * 10),
                                        new Vector3D(Math.cos(0 * divider * Math.PI / 180) * dind * 10, -array[0][dind], Math.sin(0 * divider * Math.PI / 180) * dind * 10),
                                        new Vector3D(Math.cos((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10, -array[(array.length - 1)][(dind + 1)], Math.sin((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10)
                                        );                       

                        addNewTriangle(new Vector3D(Math.cos(0 * divider * Math.PI / 180) * dind * 10, -array[0][dind], Math.sin(0 * divider * Math.PI / 180) * dind * 10),
                                        new Vector3D(Math.cos((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10, -array[(array.length - 1)][(dind + 1)], Math.sin((array.length - 1) * divider * Math.PI / 180) * (dind + 1) * 10),
                                        new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (dind + 1) * 10, -array[0][(dind + 1)], Math.sin(0 * divider * Math.PI / 180) * (dind + 1) * 10)
                                        );
                    }
                }
                
                if (ind < array.length - 1) 
                {
                    addNewTriangle(new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, -array[ind][array[ind].length - 1], Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),
                                    new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10, -array[(ind + 1)][array[(ind + 1)].length - 1], Math.sin((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10),

                                    new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10)

                                    );

                                    

                    addNewTriangle(new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10, -array[(ind + 1)][array[(ind + 1)].length - 1], Math.sin((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10),

                                    new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),

                                    new Vector3D(Math.cos((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10, 0, Math.sin((ind + 1) * divider * Math.PI / 180) * (array[(ind + 1)].length - 1) * 10)

                                    );

                } else {

                    addNewTriangle(new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, -array[ind][array[ind].length - 1], Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),

                                    new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10, -array[0][array[0].length - 1], Math.sin(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10),

                                    new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10)

                                    );

                                    

                    addNewTriangle(new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10, -array[0][array[0].length - 1], Math.sin(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10),

                                    new Vector3D(Math.cos(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10, 0, Math.sin(ind * divider * Math.PI / 180) * (array[ind].length - 1) * 10),

                                    new Vector3D(Math.cos(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10, 0, Math.sin(0 * divider * Math.PI / 180) * (array[0].length - 1) * 10)

                                    );

                }

            }

        }

        

        public function addNewTriangle(v1:Vector3D, v2:Vector3D, v3:Vector3D):void {

            faces.push( { v1:v1, v2:v2, v3:v3, vc:new Vector3D((v1.x + v2.x + v3.x) / 3, (v1.y + v2.y + v3.y) / 3, (v1.z + v2.z + v3.z) / 3) } );

        }

        

        public function piesurface(e:Event):void {

            for (var i:int = 0; i < array.length; i++) {

                for (var di:int = 0; di < array[i].length; di++) {

                    array[i][di]  +=  adds[i][di];
                    adds [i][di]  +=  (Math.random() * 10 - 5) / 10;
                    //adds[i][di] += (Math.random() * 100 - 50) / 100;

                    if (array[i][di] > 100 + tolerance * 2) 
                    {
                        array[i][di] = 100 + tolerance * 2;
                        adds[i][di] = -Math.abs(adds[i][di]);
                    }

                    if (array[i][di] < 100 - tolerance * 2) {

                        array[i][di] = 100 - tolerance * 2;

                        adds[i][di] = Math.abs(adds[i][di]);

                    }

                }

            }

            

            setTriangles();

            

            // drawing the things out

            

            core.rotationY = -mouseX;

            core.rotationX = mouseY;

            

            this.graphics.clear();

            

            var sorted:Array = [];

            

            for (var ind:int = 0; ind < faces.length; ind++) {

                var v1:Vector3D = faces[ind].v1.clone();

                var v2:Vector3D = faces[ind].v2.clone();

                var v3:Vector3D = faces[ind].v3.clone();

                var vc:Vector3D = faces[ind].vc.clone();

                

                v1 = core.transform.matrix3D.transformVector(v1);

                v2 = core.transform.matrix3D.transformVector(v2);

                v3 = core.transform.matrix3D.transformVector(v3);

                vc = core.transform.matrix3D.transformVector(vc);

                

                v1.w = (v1.z + dist) / dist;

                v2.w = (v2.z + dist) / dist;

                v3.w = (v3.z + dist) / dist;

                

                v1.project();

                v2.project();

                v3.project();

                

                sorted.push( { v1:v1, v2:v2, v3:v3, z:vc.z } );

            }

            

            sorted.sortOn("z", Array.NUMERIC | Array.DESCENDING);

            

            for (var dind:int = 0; dind < sorted.length; dind++) {

                this.graphics.beginFill((0xFFFFFF*Math.random())+Math.abs(sorted[dind].z), 1);
                //this.graphics.beginFill(Math.abs(sorted[dind].z), 1);
                this.graphics.moveTo(sorted[dind].v1.x, sorted[dind].v1.y);

                this.graphics.lineTo(sorted[dind].v2.x, sorted[dind].v2.y);

                this.graphics.lineTo(sorted[dind].v3.x, sorted[dind].v3.y);

                this.graphics.lineTo(sorted[dind].v1.x, sorted[dind].v1.y);
 
                this.graphics.endFill();

            }

        }

        

    }

    

}