[ActionScript 3.0] AS3 绘制12面体

 

  1 package
  2 {
  3     import flash.display.Sprite;
  4     import flash.events.Event;
  5     import flash.events.MouseEvent;
  6     import flash.geom.Point;
  7     import flash.geom.Vector3D;
  8     
  9     /**
 10      * @author Frost.Yen
 11      * @E-mail 871979853@qq.com
 12      * @create 2015-9-1 下午2:32:43
 13      *
 14      */
 15     [SWF(width="800",height="600")]
 16     public class Dodecahedron extends Sprite
 17     {
 18         private var _faceArr:Array = [];//存放每个面的数组
 19         private var _radius:Number = 60;//五边形半径
 20         private var _dis:Number;//中心点到五边形顶点的距离,可根据五边形半径计算
 21         private var _angle:Number=Math.acos(-1/Math.sqrt(5))*180/Math.PI;//12面体相邻面之间的夹角
 22         private var _container:Sprite;
 23         public function Dodecahedron()
 24         {
 25             initViews();
 26             initEventListeners();
 27         }
 28         private function initViews():void
 29         {
 30             _container = new Sprite();
 31             _container.x = stage.stageWidth*0.5;
 32             _container.y = stage.stageHeight*0.5;
 33             
 34             this.addChild(_container);
 35             creatDodecahedron();
 36         }
 37         private function initEventListeners():void
 38         {
 39             this.addEventListener(Event.ENTER_FRAME,onMove);
 40         }
 41         private function onMove(e:Event):void
 42         {
 43             for(var i:int = 0;i<_faceArr.length;i++){
 44                 _faceArr[i].transform.matrix3D.appendRotation(-(mouseX-stage.stageWidth*0.5)/10,Vector3D.Y_AXIS);
 45                 _faceArr[i].transform.matrix3D.appendRotation((mouseY-stage.stageHeight*0.5)/10,Vector3D.X_AXIS);
 46             }
 47             _faceArr.sortOn("z",18);//如果为 options 参数指定值 8 或 Array.RETURNINDEXEDARRAY,则返回反映排序结果的数组并且不修改数组。
 48             for(i=0;i<_faceArr.length;i++){
 49                 _container.setChildIndex(_faceArr[i],i);
 50             }
 51             
 52         }
 53         private function creatDodecahedron():void
 54         {
 55             var b:Number = Math.sqrt(_radius*_radius*2-2*_radius*_radius*Math.cos(360/6 * Math.PI/180));//五边形的边长
 56             var h1:Number = Math.sqrt(_radius*_radius-b*b/4);//五边形中心点到任意边的高
 57             //var h:Number = h1 * Math.tan((180-116.56505)*0.5*Math.PI / 180);//12面体中心点到五边形中心点的距离
 58             _dis = h1 / Math.sin((180-116.56505)*0.5*Math.PI / 180);//12面体中心点到五边形顶点的距离
 59 
 60             for(var i:int = 0;i<12;i++){
 61                 var pentagon:Sprite = drawPentagon(_radius,Math.random()*0xFFFFFF);
 62                 pentagon.z = -Math.sqrt(_dis*_dis-_radius*_radius);
 63                 _container.addChild(pentagon);
 64                 _faceArr.push(pentagon);
 65             }
 66             _faceArr[6].transform.matrix3D.appendRotation(180,Vector3D.Y_AXIS);
 67             for(i=1;i<=5;i++){
 68                 //12面体相邻面的夹角arccos(-1/√5)*180/π=116.56505
 69                 //trace(Math.acos(-1/Math.sqrt(5))*180/Math.PI);
 70                 _faceArr[i].transform.matrix3D.appendRotation(_angle,Vector3D.Y_AXIS);
 71                 //绕z轴分布;
 72                 _faceArr[i].transform.matrix3D.appendRotation(36-(i-1)*72,Vector3D.Z_AXIS);
 73                 _faceArr[i + 6].transform.matrix3D.appendRotation(180+_angle,Vector3D.Y_AXIS);
 74                 _faceArr[i + 6].transform.matrix3D.appendRotation(36-(i-1)*72,Vector3D.Z_AXIS);
 75             }
 76         }
 77         /**
 78          * 绘制五边形
 79          * @param    r
 80          * @param    color
 81          * @return
 82          */
 83         private function drawPentagon(r:Number = 60,color:uint = 0xff00ff):Sprite
 84         {
 85             var pointArr:Array = [];
 86             for(var i:int = 0;i<5;i++){
 87                 pointArr.push(new Point(r*Math.cos(i*Math.PI*2/5),r*Math.sin(i*Math.PI*2/5)));
 88             }
 89             var pentagon:Sprite = new Sprite();
 90             pentagon.graphics.lineStyle(0,0);
 91             pentagon.graphics.beginFill(color,0.9);
 92             pentagon.graphics.moveTo(pointArr[0].x,pointArr[0].y);
 93             for(i = 1;i<=5;i++){
 94                 pentagon.graphics.lineTo(pointArr[i%5].x,pointArr[i%5].y);
 95             }
 96             pentagon.graphics.endFill();
 97             return pentagon;
 98         }
 99     }
100 }

 

posted on 2015-09-02 15:08  晏过留痕  阅读(384)  评论(0编辑  收藏  举报