flash on 2014-12-24

by Cheshir
let's do this http://www.flashandmath.com/advanced/simple3d/
♥0 | Line 89 | Modified 2014-12-24 20:51:54 | MIT License
play

ActionScript3 source code

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

package {
    import flash.geom.Point;
    import flash.events.Event;
    import flash.text.TextField;
    // let's do this http://www.flashandmath.com/advanced/simple3d/
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        private var canvas:Sprite = new Sprite();
        
        private var vertexArray:Array = [new Point3D(50,50,50), new Point3D(50,-50,50), new Point3D(-50,50,50), new Point3D(-50,-50,50),
                                        new Point3D(50,50,-50), new Point3D(50,-50,-50), new Point3D(-50,50,-50), new Point3D(-50,-50,-50)];
        private var facesArray:Array = [[0,1,2],[2,3,1],[0,4,6],[0,4,5],[3,5,1]];
        
        public function FlashTest() {
            drawGrid();    // I need more time... 15 minutes I did not get
            
            addChild(canvas);
            stage.addEventListener(Event.ENTER_FRAME, rotate);
        }
        private function rotate(e:Event):void{
            theta+=0.01;
            phi+=0.005;
            canvas.graphics.clear();
            for(var i:int=0; i<vertexArray.length; i++){
                drawPoint(vertexArray[i]);    
            }
            for(i=0; i<facesArray.length; i++){
                drawFace(facesArray[i]);
            }
        }

        public function drawGrid():void{
            var w:Number = stage.stageWidth;
            var h:Number = stage.stageHeight;
            this.graphics.beginFill(0xcccccc);
            this.graphics.drawRect(0,0,w,h);
            this.graphics.endFill();
            this.graphics.lineStyle(1);
            this.graphics.moveTo(w/2, h-30);
            this.graphics.lineTo(w/2, 30);
            createSignature(w/2+10, h-50, "Y");
            this.graphics.moveTo(30, h/2);
            this.graphics.lineTo(w-30, h/2);
            createSignature(w-40, h/2, "Z");
            this.graphics.moveTo(w/1.5,h/3);
            this.graphics.lineTo(90,h-90);
            createSignature(90,h-90, "X");
            canvas.x = w/2; canvas.y = h/2;
        }
        private function createSignature(x:Number,y:Number,signature:String,scale:Number = 1.5):void{
            var sig:TextField = new TextField();
            sig.text = signature;
            sig.textColor = 0xdd3333;
            sig.scaleX = sig.scaleY = scale;
            sig.x = x;
            sig.y = y;
            addChild(sig);
        }
        
        private var theta:Number = 0;
        private var phi:Number = 0;
        private function drawPoint(p:Point3D):void{
            canvas.graphics.beginFill(0x33dd33+p.z*0xdd);    // I can draw point, but I need calculate offset before;
            // похоже, что это позволяет производить сещение для осей Y и Z и это выглядит правильно, но ось Х у меня выпадает
            p.calcVisual(theta,phi);
           
            canvas.graphics.drawCircle(p.visualX, p.visualY, 3);
            canvas.graphics.endFill();
        }
        private function drawFace(face:Array):void{
            canvas.graphics.beginFill(0x33dd33,0.4);
            canvas.graphics.lineStyle(1,0x33dd33);
            canvas.graphics.moveTo(vertexArray[face[0]].visualX, vertexArray[face[0]].visualY);
            canvas.graphics.lineTo(vertexArray[face[1]].visualX, vertexArray[face[1]].visualY);
            canvas.graphics.lineTo(vertexArray[face[2]].visualX, vertexArray[face[2]].visualY);
            canvas.graphics.endFill();
        }
        /*
        private function createPlane():Object{
            var p_0:Point3D = new Point3D(0,0,0);
            var p_1:Point3D = new Point3D(25,0,0);
            var p_2:Point3D = new Point3D(25,25,0);
            var p_3:Point3D = new Point3D(0,25,0);
            var plane:Object = {points:[p_0,p_1,p_2,p_3], conect:[0,1,3]};
            return plane;
        } */
    }
}
import flash.geom.Point;

Class {
    class Point3D extends Point{
        public var visualX:Number;
        public var visualY:Number;
        public var z:Number;
        public var color:uint;
        public function Point3D(x:Number=0, y:Number=0, z:Number=0, color:uint=0xdd3333){
            this.x = x; this.color = color;
            this.y = y;
            this.z = z;
        }
        public function calcVisual(theta:Number, phi:Number):void{
            this.visualX = x*Math.cos(theta)*Math.sin(phi) + y*Math.sin(theta)*Math.sin(phi) + z*Math.cos(phi);
            this.visualY = -x*Math.sin(theta)+y*Math.cos(theta);
        }
    }
}

Forked