分析:

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

 package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.geom.Vector3D; /**
* @author Frost.Yen
* @E-mail 871979853@qq.com
* @create 2015-9-7 下午5:10:05
*
*/
[SWF(width="800",height="600")]
public class LineOctahedron extends Sprite
{
private var _faceArr:Array = [];
private var _r:Number = 100;//中心到顶点的距离
private var _focus:Number = 200;//焦距
private var _lineContainer:Sprite;
private var _container:Sprite;
private var _vertexArr:Array = [{x:0,y:_r,z:0},{x:-_r,y:0,z:0},{x:0,y:0,z:_r},{x:_r,y:0,z:0},{x:0,y:0,z:-_r},{x:0,y:-_r,z:0}];
public function LineOctahedron()
{
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
{
for (var i:int=0; i<_faceArr.length; i++)
{
_faceArr[i].transform.matrix3D.appendRotation((mouseX-_lineContainer.x)/50,Vector3D.Y_AXIS);
_faceArr[i].transform.matrix3D.appendRotation((mouseY-_lineContainer.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));
//利用焦距实现透视
}
_lineContainer.graphics.clear();
_lineContainer.graphics.lineStyle(3,0x00ffff);
for(i = 1;i<=4;i++){
//从上面连到四周;
_lineContainer.graphics.moveTo(_faceArr[0].X,_faceArr[0].Y);
_lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y);
//从下面连到四周;
_lineContainer.graphics.moveTo(_faceArr[5].X,_faceArr[5].Y);
_lineContainer.graphics.lineTo(_faceArr[i].X,_faceArr[i].Y);
//四周顶点互连;
_lineContainer.graphics.moveTo(_faceArr[i].X,_faceArr[i].Y);
_lineContainer.graphics.lineTo(_faceArr[i!=4?i+1:1].X,_faceArr[i!=4?i+1:1].Y);
}
}
private function createFace():void
{
for(var i:int = 0;i<6;i++){
var mc:MovieClip = new MovieClip();
_container.addChild(mc);
_faceArr.push(mc);
mc.x = _vertexArr[i].x;
mc.y = _vertexArr[i].y;
mc.z = _vertexArr[i].z;
}
}
}
}

[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 绘制正二十面体(线条)

    分析: 正二十面体共有12个顶点.30条棱,其20个面都是正三角形.每条棱所对应的弧度值为1.1071487177940904弧度,这个弧度值可通过求Math.sqrt(5)/5的反余弦值求得.正二十 ...

  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. linux工具之putty

    http://blog.csdn.net/qk_zhu/article/details/6272247 对于putty,似乎很多人只知道下载回来之后,双击,输入ip,然后登陆使用.其实putty有很多 ...

  2. Openjudge计算概论-奇数单增序列

    /*===================================== 奇数单增序列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列 ...

  3. 学习Python遇到的那些坑

    1. 初始化一个类,这个方法名必须为”__init__(object)“.顺便提一下,两边的下划线是均是2个 2. 每个程序块都要使用冒号!!!! 3. 如果程序中使用了非英文字符,需要在Python ...

  4. java读写文件大全

     java读写文件大全 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int o ...

  5. DIV+CSS命名规范-转载2

    一.CSS文件及样式命名1.CSS文件命名规范 全局样式:global.css: 框架布局:layout.css: 字体样式:font.css: 链接样式:link.css: 打印样式:print.c ...

  6. HackerRank "Minimum Average Waiting Time" !

    Something to learn: http://blog.csdn.net/yuwenshi/article/details/36666453 Shortest Job First Algori ...

  7. SPOJ #752. Power it!

    By property of mod operations , we can simply use Divide and Conquer + Recursion to solve it. Refere ...

  8. android学习笔记八——SeekBar

    SeekBar——拖动条 拖动条(SeekBar)组件与ProgressBar水平形式的显示进度条类似,不过其最大的区别在于,拖动条可以由用户自己进行手工的调节,例如当用户需要调整播放器音量或者电影的 ...

  9. [tty与uart]3.tty驱动分析

    转自:http://www.wowotech.net/linux_kenrel/183.html 目录: 1 首先分析设备驱动的注册 1.1 uart_register_driver分析 1.2 tt ...

  10. 【转】c#实现文件下载

    需求:点击SAVE,去ajax去后台下载文件,完成后出现保存对话框,然后直接下载. 解决方案:下载完成后用JS转到向到另一个页面,在这页面Page_Load里用C#Response对象直接下载. 下载 ...