• [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         }
  • 相关阅读:
    无法与服务器建立安全链接
    OpenGL基础探究
    百度语音识别接入遇到的问题
    语音音频相关
    Gif动态图UIImage
    替换图像的某种色值
    错误
    各种须知分类等
    动画支持的一些keypath
    X pgAdmin4 重置布局 页面关不掉,要疯掉了
  • 原文地址:https://www.cnblogs.com/frost-yen/p/4789373.html
Copyright © 2020-2023  润新知