• [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 }
  • 相关阅读:
    威尔逊置信区间
    mysql函数
    python操作mysql之pymysql
    oracle 表分区
    Python连接sqlserver数据库之pymssql
    python-subprocess
    python-shutil
    python+logging
    公钥加密-DES-RSA
    python-Web-flask-蓝图和单元测试
  • 原文地址:https://www.cnblogs.com/frost-yen/p/4778655.html
Copyright © 2020-2023  润新知