分析:
正二十面体共有12个顶点、30条棱,其20个面都是正三角形。每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得。正二十面体的12个点按相对应的位置可以分为6对,把其中一对顶点置于Y轴上,此两点到坐标原点距离相等,则另外五对顶点皆呈倾斜状态,它们穿过坐标原点并环绕Y轴以72度递增旋转。根据这一点,可以先算好第一对倾斜顶点的坐标,然后让它绕Y轴以72度递增旋转4次得到另外四对顶点坐标,至此正二十面体的12个顶点坐标都已清楚,便可以创建模型了。
1 package 2 { 3 import flash.display.MovieClip; 4 import flash.display.Sprite; 5 import flash.events.Event; 6 import flash.geom.Vector3D; 7 import flash.net.LocalConnection; 8 9 /** 10 * @author Frost.Yen 11 * @E-mail 871979853@qq.com 12 * @create 2015-9-7 下午12:58:27 13 * 14 */ 15 [SWF(width="800",height="600")] 16 public class LineIcosahedron extends Sprite 17 { 18 private var _r:Number = 100; 19 private var _faceArr:Array = []; 20 private var _focus:Number = 400; 21 private var _container:Sprite; 22 private var _lineContainer:Sprite; 23 public function LineIcosahedron() 24 { 25 initViews(); 26 initEventlisteners(); 27 } 28 private function initViews():void 29 { 30 _container = new Sprite(); 31 _lineContainer = new Sprite(); 32 _container.x = _lineContainer.x = 400; 33 _container.y = _lineContainer.y = 300; 34 this.addChild(_container); 35 this.addChild(_lineContainer); 36 createFace(); 37 } 38 private function initEventlisteners():void 39 { 40 this.addEventListener(Event.ENTER_FRAME,onEnterFrame); 41 } 42 private function onEnterFrame(e:Event):void 43 { 44 _lineContainer.graphics.clear(); 45 _lineContainer.graphics.lineStyle(3,0x00ffff); 46 for(var i:int = 0;i<_faceArr.length;i++){ 47 (_faceArr[i] as MovieClip).transform.matrix3D.appendRotation(-(mouseX-_container.x)/50,Vector3D.Y_AXIS); 48 (_faceArr[i] as MovieClip).transform.matrix3D.appendRotation((mouseY-_container.y)/50,Vector3D.X_AXIS); 49 //利用焦距实现透视 50 _faceArr[i].Z = (_faceArr[i] as MovieClip).transform.getRelativeMatrix3D(_container).position.z; 51 _faceArr[i].X = (_faceArr[i] as MovieClip).transform.getRelativeMatrix3D(_container).position.x*(_focus/(_focus+_faceArr[i].Z)); 52 _faceArr[i].Y = (_faceArr[i] as MovieClip).transform.getRelativeMatrix3D(_container).position.y*(_focus/(_focus+_faceArr[i].Z)); 53 } 54 55 drawLine(); 56 } 57 private function createFace():void 58 { 59 var angle:Number = 0.5*Math.PI - Math.acos(Math.sqrt(5)/5); 60 for(var i:int = 0;i<12;i++){ 61 var mc:MovieClip = new MovieClip(); 62 _container.addChild(mc); 63 _faceArr.push(mc); 64 if(i==0){ 65 mc.x = 0; 66 mc.y = -_r; 67 mc.z = 0; 68 }else if(i==11){ 69 mc.x = 0; 70 mc.y = _r; 71 mc.z = 0; 72 }else if(i<=5){ 73 mc.x = _r*Math.cos(angle); 74 mc.y = -_r*Math.sin(angle); 75 mc.z = 0; 76 }else{ 77 mc.x = -_r*Math.cos(angle); 78 mc.y = _r*Math.sin(angle); 79 mc.z = 0; 80 } 81 } 82 for(i = 1;i<11;i++){ 83 (_faceArr[i] as MovieClip).transform.matrix3D.appendRotation(i*72,Vector3D.Y_AXIS); 84 } 85 } 86 private function drawLine():void 87 { 88 for(var i:int = 1;i<6;i++ ){ 89 _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y); 90 _lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y); 91 } 92 for(i=1;i<6;i++){ 93 _lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y); 94 } 95 for(i = 6;i<11;i++){ 96 _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y); 97 _lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y); 98 } 99 for(i=6;i<11;i++){ 100 _lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y); 101 } 102 103 _lineContainer.graphics.moveTo(_faceArr[1].X,_faceArr[1].Y); 104 var id:int = 9; 105 for(i=0;i<9;i++){ 106 _lineContainer.graphics.lineTo(_faceArr[id].X,_faceArr[id].Y); 107 if(i<3){ 108 id = i+11-id; 109 }else{ 110 id = i+6-id; 111 } 112 } 113 _lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y); 114 } 115 } 116 }
下面是源代码中drawLine()函数的原型
1 private function drawLine2():void 2 { 3 _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y); 4 _lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y); 5 6 _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y); 7 _lineContainer.graphics.lineTo(_faceArr[2].X,_faceArr[2].Y); 8 9 _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y); 10 _lineContainer.graphics.lineTo(_faceArr[3].X,_faceArr[3].Y); 11 12 _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y); 13 _lineContainer.graphics.lineTo(_faceArr[4].X,_faceArr[4].Y); 14 15 _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y); 16 _lineContainer.graphics.lineTo(_faceArr[5].X,_faceArr[5].Y); 17 18 _lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y); 19 _lineContainer.graphics.lineTo(_faceArr[2].X,_faceArr[2].Y); 20 _lineContainer.graphics.lineTo(_faceArr[3].X,_faceArr[3].Y); 21 _lineContainer.graphics.lineTo(_faceArr[4].X,_faceArr[4].Y); 22 _lineContainer.graphics.lineTo(_faceArr[5].X,_faceArr[5].Y); 23 24 _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y); 25 _lineContainer.graphics.lineTo(_faceArr[6].X,_faceArr[6].Y); 26 27 _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y); 28 _lineContainer.graphics.lineTo(_faceArr[7].X,_faceArr[7].Y); 29 30 _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y); 31 _lineContainer.graphics.lineTo(_faceArr[8].X,_faceArr[8].Y); 32 33 _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y); 34 _lineContainer.graphics.lineTo(_faceArr[9].X,_faceArr[9].Y); 35 36 _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y); 37 _lineContainer.graphics.lineTo(_faceArr[10].X,_faceArr[10].Y); 38 39 _lineContainer.graphics.lineTo(_faceArr[6].X,_faceArr[6].Y); 40 _lineContainer.graphics.lineTo(_faceArr[7].X,_faceArr[7].Y); 41 _lineContainer.graphics.lineTo(_faceArr[8].X,_faceArr[8].Y); 42 _lineContainer.graphics.lineTo(_faceArr[9].X,_faceArr[9].Y); 43 _lineContainer.graphics.lineTo(_faceArr[10].X,_faceArr[10].Y); 44 45 _lineContainer.graphics.moveTo(_faceArr[1].X,_faceArr[1].Y); 46 _lineContainer.graphics.lineTo(_faceArr[9].X,_faceArr[9].Y); 47 _lineContainer.graphics.lineTo(_faceArr[2].X,_faceArr[2].Y); 48 _lineContainer.graphics.lineTo(_faceArr[10].X,_faceArr[10].Y); 49 _lineContainer.graphics.lineTo(_faceArr[3].X,_faceArr[3].Y); 50 _lineContainer.graphics.lineTo(_faceArr[6].X,_faceArr[6].Y); 51 _lineContainer.graphics.lineTo(_faceArr[4].X,_faceArr[4].Y); 52 _lineContainer.graphics.lineTo(_faceArr[7].X,_faceArr[7].Y); 53 _lineContainer.graphics.lineTo(_faceArr[5].X,_faceArr[5].Y); 54 _lineContainer.graphics.lineTo(_faceArr[8].X,_faceArr[8].Y); 55 _lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y); 56 }