// write as3 code here..
//3Dの実験ですね。
//つたないスクリプトで申し訳ないですね。
package
{
import flash.display.*;
import flash.events.*;
import flash.ui.Mouse;
import flash.utils.*;
import flash.geom.*;
import net.hires.debug.Stats;
[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="60")]
public class conv extends MovieClip
{
public var centerPt:Point = new Point(stage.stageWidth/2,stage.stageHeight/2);
public var handle:Number = 180;
public var paraAry:Array = [
[ 0,0,handle,0],
[ 1,handle*Math.cos( 0*Math.PI/180)*Math.cos(30*Math.PI/180), handle*Math.sin(30*Math.PI/180),handle*Math.sin( 0*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 2,handle*Math.cos( 72*Math.PI/180)*Math.cos(30*Math.PI/180), handle*Math.sin(30*Math.PI/180),handle*Math.sin( 72*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 3,handle*Math.cos(144*Math.PI/180)*Math.cos(30*Math.PI/180), handle*Math.sin(30*Math.PI/180),handle*Math.sin(144*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 4,handle*Math.cos(216*Math.PI/180)*Math.cos(30*Math.PI/180), handle*Math.sin(30*Math.PI/180),handle*Math.sin(216*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 5,handle*Math.cos(288*Math.PI/180)*Math.cos(30*Math.PI/180), handle*Math.sin(30*Math.PI/180),handle*Math.sin(288*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 6,handle*Math.cos( 36*Math.PI/180)*Math.cos(30*Math.PI/180),-handle*Math.sin(30*Math.PI/180),handle*Math.sin( 36*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 7,handle*Math.cos(108*Math.PI/180)*Math.cos(30*Math.PI/180),-handle*Math.sin(30*Math.PI/180),handle*Math.sin(108*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 8,handle*Math.cos(180*Math.PI/180)*Math.cos(30*Math.PI/180),-handle*Math.sin(30*Math.PI/180),handle*Math.sin(180*Math.PI/180)*Math.cos(30*Math.PI/180)],
[ 9,handle*Math.cos(252*Math.PI/180)*Math.cos(30*Math.PI/180),-handle*Math.sin(30*Math.PI/180),handle*Math.sin(252*Math.PI/180)*Math.cos(30*Math.PI/180)],
[10,handle*Math.cos(324*Math.PI/180)*Math.cos(30*Math.PI/180),-handle*Math.sin(30*Math.PI/180),handle*Math.sin(324*Math.PI/180)*Math.cos(30*Math.PI/180)],
[11,0,-handle,0]
];
public var sortAry:Array = new Array
public var accessAry:Array = new Array();
public var roteX:Number;
public var roteY:Number;
public var roteZ:Number;
public var cx:Number;
public var cy:Number;
public var cz:Number;
public var screenLength:Number=100;
public var scale:Number;
public var oldX:Number;
public var oldY:Number;
public var MOUSE_MC_DEPTH:Number=200;
public var renderTimer:Timer = new Timer(30);
public function conv():void
{
this.addChild(new Stats());
cx=0;
cy=0;
cz=1000;
scale=10;
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
function onDown(evt:MouseEvent):void
{
oldX = stage.mouseX;
oldY = stage.mouseY;
renderTimer.start();
}
stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
function onUp(evt:MouseEvent):void
{
renderTimer.stop();
renderTimer.reset();
}
renderTimer.addEventListener(TimerEvent.TIMER,onRender,false,0,true);
for(var i:int = 0;i<paraAry.length;i++)
{
var apex:node = new node(paraAry[i][0],paraAry[i][1],paraAry[i][2],paraAry[i][3]);
accessAry.push(apex);
accessAry[i].addChild(accessAry[i].sp);
addChild(accessAry[i]);
}
setPositionObject()
setSortObject();
}
public function onRender(evt:TimerEvent):void
{
var nextX:Number=stage.mouseX;
var nextY:Number=stage.mouseY;
var rotX:Number=-Math.PI*(nextY-oldY)/400;
var rotY:Number=Math.PI*(nextX-oldX)/400;
rotateX(rotX);
rotateY(rotY);
oldX=stage.mouseX;
oldY=stage.mouseY;
sortAry = new Array();
for(var i:int = 0;i<accessAry.length;i++)
{
var size:Number=50;
var sX:Number=getScreenX(accessAry[i].myX,accessAry[i].myY,accessAry[i].myZ,size);
var sY:Number=getScreenY(accessAry[i].myX,accessAry[i].myY,accessAry[i].myZ,size);
var sSize:Number=getScreenSize(accessAry[i].myX,accessAry[i].myY,accessAry[i].myZ,size);
accessAry[i].myDrawing(sX+centerPt.x,sY+centerPt.y,sSize);
sortAry.push(accessAry[i].myZ);
}
sortAry = sortAry.sort(Array.NUMERIC|Array.RETURNINDEXEDARRAY|Array.DESCENDING);
var aryLength:int = sortAry.length;
for(var i:int = 0;i<aryLength;i++)
{
var z:int = sortAry[i];
setChildIndex(accessAry[z],0);
}
}
public function setSortObject():void
{
sortAry = sortAry.sort(Array.NUMERIC|Array.RETURNINDEXEDARRAY|Array.DESCENDING);
var aryLength:int = sortAry.length;
for(var i:int = 0;i<aryLength;i++)
{
var z:int = sortAry[i];
setChildIndex(accessAry[z],0);
}
}
public function setPositionObject():void
{
sortAry = new Array();
for(var i:int = 0;i<accessAry.length;i++)
{
var size:Number=50;
var sX:Number=getScreenX(accessAry[i].myX,accessAry[i].myY,accessAry[i].myZ,size);
var sY:Number=getScreenY(accessAry[i].myX,accessAry[i].myY,accessAry[i].myZ,size);
var sSize:Number=getScreenSize(accessAry[i].myX,accessAry[i].myY,accessAry[i].myZ,size);
accessAry[i].myDrawing(sX+centerPt.x,sY+centerPt.y,sSize);
sortAry.push(accessAry[i].myZ);
}
}
public function getScreenX(camX:Number,camY:Number,camZ:Number,camSize:Number):Number
{
return scale*(camX-cx)*screenLength/(camZ-cz);
}
public function getScreenY(camX:Number,camY:Number,camZ:Number,camSize:Number):Number
{
return scale*(camY-cy)*screenLength/(camZ-cz);
}
public function getScreenSize(camX:Number,camY:Number,camZ:Number,camSize:Number):Number
{
return Math.abs(Math.floor((scale*camSize*screenLength/(camZ-cz))))/100;
}
public function rotateX(theta:Number):void
{
for(var i:int=0;i<accessAry.length;i++)
{
var old_x:Number=accessAry[i].myX;
var old_y:Number=accessAry[i].myY;
var old_z:Number=accessAry[i].myZ;
var new_x:Number=old_x;
var new_y:Number=old_y*Math.cos(theta)+old_z*Math.sin(theta);
var new_z:Number=-old_y*Math.sin(theta)+old_z*Math.cos(theta);
setPointPosition(i,new_x,new_y,new_z);
}
}
public function rotateY(theta:Number):void
{
for(var i:int=0;i<accessAry.length;i++)
{
var old_x:Number=accessAry[i].myX;
var old_y:Number=accessAry[i].myY;
var old_z:Number=accessAry[i].myZ;
var new_x:Number=old_x*Math.cos(theta)-old_z*Math.sin(theta);
var new_y:Number=old_y;
var new_z:Number=old_x*Math.sin(theta)+old_z*Math.cos(theta);
setPointPosition(i,new_x,new_y,new_z);
}
}
public function rotateZ(theta:Number):void
{
for(var i:int=0;i<accessAry.length;i++)
{
var old_x:Number=accessAry[i].myX;
var old_y:Number=accessAry[i].myY;
var old_z:Number=accessAry[i].myZ;
var new_x:Number=old_x*Math.cos(theta)+old_y*Math.sin(theta);
var new_y:Number=-old_x*Math.sin(theta)+old_y*Math.cos(theta);
var new_z:Number=old_z;
setPointPosition(i,new_x,new_y,new_z);
}
}
public function setPointPosition(index:Number,setX:Number,setY:Number,setZ:Number):void
{
accessAry[index].myX=setX;
accessAry[index].myY=setY;
accessAry[index].myZ=setZ;
}
}
}
import flash.display.*;
class node extends Sprite
{
public var sp:Sprite = new Sprite();
public var spG:Graphics = sp.graphics;
public var myNum:Number;
public var myX:Number;
public var myY:Number;
public var myZ:Number;
public function node(Num:Number,X:Number,Y:Number,Z:Number):void
{
myNum = Num;
myX = X;
myY = Y;
myZ = Z;
spG.lineStyle(1,0xffffff,1);
spG.beginFill(0xffffff,1);
spG.drawCircle(-25,-25,50);
spG.endFill();
addChild(sp);
}
public function myDrawing(drawX:Number,drawY:Number,drawSize:Number):void
{
this.x = drawX;
this.y = drawY;
this.alpha = drawSize;
this.scaleX = drawSize;
this.scaleY = this.scaleX;
}
}