分析:

正二十面体共有12个顶点、30条棱,其20个面都是正三角形。每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得。正二十面体的12个点按相对应的位置可以分为6对,把其中一对顶点置于Y轴上,此两点到坐标原点距离相等,则另外五对顶点皆呈倾斜状态,它们穿过坐标原点并环绕Y轴以72度递增旋转。根据这一点,可以先算好第一对倾斜顶点的坐标,然后让它绕Y轴以72度递增旋转4次得到另外四对顶点坐标,至此正二十面体的12个顶点坐标都已清楚,便可以创建模型了。

 package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Vector3D;
import flash.net.LocalConnection; /**
* @author Frost.Yen
* @E-mail 871979853@qq.com
* @create 2015-9-7 下午12:58:27
*
*/
[SWF(width="800",height="600")]
public class LineIcosahedron extends Sprite
{
private var _r:Number = 100;
private var _faceArr:Array = [];
private var _focus:Number = 400;
private var _container:Sprite;
private var _lineContainer:Sprite;
public function LineIcosahedron()
{
initViews();
initEventlisteners();
}
private function initViews():void
{
_container = new Sprite();
_lineContainer = new Sprite();
_container.x = _lineContainer.x = 400;
_container.y = _lineContainer.y = 300;
this.addChild(_container);
this.addChild(_lineContainer);
createFace();
}
private function initEventlisteners():void
{
this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
_lineContainer.graphics.clear(); _lineContainer.graphics.lineStyle(3,0x00ffff);
for(var i:int = 0;i<_faceArr.length;i++){
(_faceArr[i] as MovieClip).transform.matrix3D.appendRotation(-(mouseX-_container.x)/50,Vector3D.Y_AXIS);
(_faceArr[i] as MovieClip).transform.matrix3D.appendRotation((mouseY-_container.y)/50,Vector3D.X_AXIS);
//利用焦距实现透视
_faceArr[i].Z = (_faceArr[i] as MovieClip).transform.getRelativeMatrix3D(_container).position.z;
_faceArr[i].X = (_faceArr[i] as MovieClip).transform.getRelativeMatrix3D(_container).position.x*(_focus/(_focus+_faceArr[i].Z));
_faceArr[i].Y = (_faceArr[i] as MovieClip).transform.getRelativeMatrix3D(_container).position.y*(_focus/(_focus+_faceArr[i].Z));
} drawLine();
}
private function createFace():void
{
var angle:Number = 0.5*Math.PI - Math.acos(Math.sqrt(5)/5);
for(var i:int = 0;i<12;i++){
var mc:MovieClip = new MovieClip();
_container.addChild(mc);
_faceArr.push(mc);
if(i==0){
mc.x = 0;
mc.y = -_r;
mc.z = 0;
}else if(i==11){
mc.x = 0;
mc.y = _r;
mc.z = 0;
}else if(i<=5){
mc.x = _r*Math.cos(angle);
mc.y = -_r*Math.sin(angle);
mc.z = 0;
}else{
mc.x = -_r*Math.cos(angle);
mc.y = _r*Math.sin(angle);
mc.z = 0;
}
}
for(i = 1;i<11;i++){
(_faceArr[i] as MovieClip).transform.matrix3D.appendRotation(i*72,Vector3D.Y_AXIS);
}
}
private function drawLine():void
{
for(var i:int = 1;i<6;i++ ){
_lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y);
}
for(i=1;i<6;i++){
_lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y);
}
for(i = 6;i<11;i++){
_lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y);
_lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y);
}
for(i=6;i<11;i++){
_lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y);
} _lineContainer.graphics.moveTo(_faceArr[1].X,_faceArr[1].Y);
var id:int = 9;
for(i=0;i<9;i++){
_lineContainer.graphics.lineTo(_faceArr[id].X,_faceArr[id].Y);
if(i<3){
id = i+11-id;
}else{
id = i+6-id;
}
}
_lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y);
}
}
}

下面是源代码中drawLine()函数的原型

 private function drawLine2():void
{
_lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y); _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[2].X,_faceArr[2].Y); _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[3].X,_faceArr[3].Y); _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[4].X,_faceArr[4].Y); _lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[5].X,_faceArr[5].Y); _lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y);
_lineContainer.graphics.lineTo(_faceArr[2].X,_faceArr[2].Y);
_lineContainer.graphics.lineTo(_faceArr[3].X,_faceArr[3].Y);
_lineContainer.graphics.lineTo(_faceArr[4].X,_faceArr[4].Y);
_lineContainer.graphics.lineTo(_faceArr[5].X,_faceArr[5].Y); _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y);
_lineContainer.graphics.lineTo(_faceArr[6].X,_faceArr[6].Y); _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y);
_lineContainer.graphics.lineTo(_faceArr[7].X,_faceArr[7].Y); _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y);
_lineContainer.graphics.lineTo(_faceArr[8].X,_faceArr[8].Y); _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y);
_lineContainer.graphics.lineTo(_faceArr[9].X,_faceArr[9].Y); _lineContainer.graphics.moveTo(_faceArr[11].X,_faceArr[11].Y);
_lineContainer.graphics.lineTo(_faceArr[10].X,_faceArr[10].Y); _lineContainer.graphics.lineTo(_faceArr[6].X,_faceArr[6].Y);
_lineContainer.graphics.lineTo(_faceArr[7].X,_faceArr[7].Y);
_lineContainer.graphics.lineTo(_faceArr[8].X,_faceArr[8].Y);
_lineContainer.graphics.lineTo(_faceArr[9].X,_faceArr[9].Y);
_lineContainer.graphics.lineTo(_faceArr[10].X,_faceArr[10].Y); _lineContainer.graphics.moveTo(_faceArr[1].X,_faceArr[1].Y);
_lineContainer.graphics.lineTo(_faceArr[9].X,_faceArr[9].Y);
_lineContainer.graphics.lineTo(_faceArr[2].X,_faceArr[2].Y);
_lineContainer.graphics.lineTo(_faceArr[10].X,_faceArr[10].Y);
_lineContainer.graphics.lineTo(_faceArr[3].X,_faceArr[3].Y);
_lineContainer.graphics.lineTo(_faceArr[6].X,_faceArr[6].Y);
_lineContainer.graphics.lineTo(_faceArr[4].X,_faceArr[4].Y);
_lineContainer.graphics.lineTo(_faceArr[7].X,_faceArr[7].Y);
_lineContainer.graphics.lineTo(_faceArr[5].X,_faceArr[5].Y);
_lineContainer.graphics.lineTo(_faceArr[8].X,_faceArr[8].Y);
_lineContainer.graphics.lineTo(_faceArr[1].X,_faceArr[1].Y);
}

[ActionScript 3.0] AS3 绘制正二十面体(线条)的更多相关文章

  1. [ActionScript 3.0] AS3 绘制正四面体(线条)

    package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; im ...

  2. [ActionScript 3.0] AS3 绘制正八面体(线条)

    分析: 将八面体置于3D坐标系中,其中心的坐标位于原点(0,0,0),让八面体的六个顶点恰好位于3D坐标系的x轴.y轴和z轴上,则从八面体的中心到这六个顶点的距离是相等的.我们可以假设这个距离为r,则 ...

  3. [ActionScript 3.0] AS3 绘制星形

    package { import flash.display.Sprite; import flash.events.Event; /** * @author Frost.Yen * @E-mail ...

  4. [ActionScript 3.0] AS3 绘制12面体

    package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; im ...

  5. [ActionScript 3.0] AS3 绘制立方体

    package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Vector3D; import ...

  6. [ActionScript 3.0] AS3 绘制任意三角形任意顶点到对边的高

    注:顶点坐标可以点击 package { import flash.display.Shape; import flash.display.Sprite; import flash.events.Mo ...

  7. [ActionScript 3.0] as3处理xml的功能和遍历节点

    as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式. XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据.将数据加载到 XML 对象 ...

  8. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  9. [ActionScript 3.0] AS3虚线绘制方法

    import flash.geom.Point; import flash.display.MovieClip; import flash.display.Graphics; var mc:Movie ...

随机推荐

  1. window.parent与window.openner

    window.parent与window.openner区别介绍 作者: 字体:[增加 减小] 类型:转载 今天总结一下js中几个对象的区别和用法,对这几个概念混淆的朋友可以看看 今天总结一下js中几 ...

  2. hibernate--HQL语法与详细解释

    HQL查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hi ...

  3. paas-openshift

    https://www.openshift.com/pricing/index.htmlOpenShift是红帽的云开发平台即服务(PaaS).自由和开放源码的云计算平台使开发人员能够创建.测试和运行 ...

  4. js添加事件通用方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 前端js上传文件 到后端接收文件

    下面是前端js代码: <html> <head> <meta http-equiv="Content-Type" content="text ...

  6. rsync实现免密码操作的一种实现方式

    rsync是远程文件同步协议,在linux系统下,操作服务器之间的文件同步,是非常方便高效的. 但是,简单的rsync操作,往往需要和用户交互,需要用户输入密码,这个对于结合应用系统使用,比如Java ...

  7. bzoj1201: [HNOI2005]数三角形

    Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...

  8. bzoj1015 星球大战

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  9. 在 Perl 中使用 Getopt::Long 模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参数 ...

  10. 一. JVM发展史,运行时数据区域,四大引用

    一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...