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 }