[ActionScript 3.0] AS3 绘制正二十面体(线条)

分析:  

      正二十面体共有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         }

 

posted on 2015-09-07 17:10  晏过留痕  阅读(601)  评论(0编辑  收藏  举报