Toggle navigation
Sign Up
Log In
Explore
Works
Folders
Tools
Collections
Artists
Groups
Groups
Topics
Tasks
Tasks
Jobs
Teams
Jobs
Recommendation
More Effects...
ActionScript
// forked from fumix's ドロネー図(分割) /** * BreakTime * @author Masayuki Komatsu / sekiryou.com * http://twitter.com/sekiryou_com */ package { import flash.display.*; import flash.events.*; import flash.text.*; import flash.geom.*; import flash.filters.GlowFilter; [SWF(width = 600, height = 600, backgroundColor = 0x0, frameRate = 30)] public class BreakTime extends Sprite { private const STAGE_WIDTH:uint = 600; private const STAGE_HEIGHT:uint = 600; private const STAGE_CENTER_X:Number = STAGE_WIDTH * 0.5; private const STAGE_CENTER_Y:Number = STAGE_HEIGHT * 0.5; private var projection:PerspectiveProjection; private var projectionMatrix3D:Matrix3D; private var mtx3D:Matrix3D = new Matrix3D(); private var world:Sprite; private var panels:Vector.
= new Vector.
(60, false); private var colons:Vector.
= new Vector.
(2, false); private var expTime:Vector.
= new Vector.
(6, false); private var expPosX:Vector.
= new Vector.
(8, false); private var expPosY:Number = -100; public function BreakTime() { addChild(new Bitmap (new BitmapData (STAGE_WIDTH, STAGE_HEIGHT, false, 0x000000))); projection = new PerspectiveProjection(); projection.fieldOfView = 60; projectionMatrix3D = projection.toMatrix3D(); imageGenerater(); world = new Sprite(); world.x = STAGE_CENTER_X; world.y = STAGE_CENTER_Y; addChild(world); const offset:uint = 60; expPosX = Vector.
([-340 - offset, -220 - offset, -60 - offset, 60 - offset, 220 - offset, 340 - offset, -140 - offset, 140 - offset]); expTime = digitDivide(); for (var i:int = 0; i < 6; i++) { for (var j:int = 0; j < 10; j++) { var tagNum:uint = i * 10 + j; panels[tagNum] = new Delaunay(60, 120, expPosX[i], expPosY, imgs[j]); world.addChild(panels[tagNum]); } tagNum = i * 10 + expTime[i]; panels[tagNum].show(); } for ( i = 0; i < 2; i++) { var colon:Delaunay = new Delaunay(60, 120, expPosX[i+6], expPosY, imgs[10]); world.addChild(colon); colon.show(); colons[i] = colon; } addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); } private var imgs:Vector.
; private function imageGenerater():void { imgs = new Vector.
(); var tf:TextFormat = new TextFormat(); tf.font = "Verdana"; tf.size = 160; tf.align = TextFormatAlign.CENTER; var txt:TextField = new TextField(); txt.defaultTextFormat = tf; txt.textColor = 0x0099CC; txt.type = TextFieldType.DYNAMIC; txt.autoSize = TextFieldAutoSize.LEFT; txt.filters = [new GlowFilter( 0x0099CC, 0.6, 4, 4, 2, 4 )]; for (var i:int = 0; i < 10; i++) { txt.text = String(i); var bmd:BitmapData = new BitmapData(txt.width, txt.height, true, 0x00000000); bmd.draw(txt); imgs.push(bmd); } txt.text = ":"; bmd = new BitmapData(txt.width, txt.height, true, 0x00000000); bmd.draw(txt); imgs.push(bmd); } private function digitDivide():Vector.
{ var nowDate:Date = new Date(); var hour:uint = nowDate.getHours(); var min:uint = nowDate.getMinutes(); var sec:uint = nowDate.getSeconds(); return Vector.
([int(hour / 10), hour - int(hour / 10) * 10, int(min / 10), min - int(min / 10) * 10, int(sec / 10), sec - int(sec / 10) * 10]); } private var cnt:Number = 1; private function onEnterFrameHandler(e:Event):void { var posX:Number = 0; var posY:Number = (Math.sin(cnt * 3) + 1) / 2 * 200 - 100; var posZ:Number = (Math.sin(cnt * -2) + 1) / 2 * 200; var rotX:Number = 0; var rotY:Number = Math.sin(cnt) * 60; var rotZ:Number = 0; cnt += 0.004; var offsetZ:Number = 880; mtx3D.identity(); mtx3D.appendRotation(rotX, Vector3D.X_AXIS); mtx3D.appendRotation(rotY, Vector3D.Y_AXIS); mtx3D.appendRotation(rotZ, Vector3D.Z_AXIS); mtx3D.appendTranslation(posX, posY, posZ + offsetZ); mtx3D.append(projectionMatrix3D); bugfix(mtx3D); var nds:Vector.
= digitDivide(); for (var i:int = 0; i < 6; i++) { var tagNum:uint = i * 10 + expTime[i]; if (expTime[i] != nds[i]) { panels[tagNum].preCrash(5-i, 12); expTime[i] = nds[i]; tagNum = i * 10 + expTime[i]; world.addChild(panels[tagNum]); panels[tagNum].show(); } for (var j:int = 0; j < 10; j++) { if (panels[int(i * 10 + j)].isVisible) { panels[int(i * 10 + j)].draw(mtx3D); } } } colons[0].draw(mtx3D); colons[1].draw(mtx3D); } private function bugfix(matrix:Matrix3D):void { var m1:Matrix3D = new Matrix3D(Vector.
([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0])); var m2:Matrix3D = new Matrix3D(Vector.
([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0])); m1.append( m2 ); if (m1.rawData[15] == 20) { var rawData:Vector.
= matrix.rawData; rawData[15] /= 20; matrix.rawData = rawData; } } } } /** 画面を適当にクリックすると3クリック以降、ポイントと線がひかれます。 線は交差すること無くひかれていきます 参照: ドロネー図 http://ja.wikipedia.org/wiki/ドロネー図 ドロネー図の作図方法 http://homepage3.nifty.com/endou/tips/04/tips33.htm 外接円 http://wonderfl.net/code/ad8b6c5010abdb44d3e34d3a7cd06a200b35175d .fla2「YuruYurer」(195P) http://www.amazon.co.jp/dp/4862670717 */ import flash.display.BitmapData; import flash.display.Graphics; import flash.display.Shape; import flash.events.Event; import flash.utils.getTimer; import flash.geom.*; class Delaunay extends Shape { //---------------------------------------- //VARIABLES //点群 private var _points:Vector.
= new Vector.
(); //三角形の集まり private var _triangles:Vector.
= new Vector.
(); private var _sx:Number; private var _sy:Number; private var _ox:Number; private var _oy:Number; private var _img:BitmapData; private var _isVisible:Boolean; public function get isVisible():Boolean { return _isVisible; } /* * コンストラクタ */ public function Delaunay(sx:Number, sy:Number, ox:Number, oy:Number, img:BitmapData) { _isVisible = false; _sx = sx; _sy = sy; _ox = ox; _oy = oy; _img = img; } public function show():void { _isVisible = true; _points = Vector.
([new Node(0, 0, 0), new Node(1, _sx, 0), new Node(2, _sx, _sy), new Node(3, 0, _sy)]); _triangles = Vector.
([new Triangle(_points[0], _points[1], _points[2]), new Triangle(_points[0], _points[2], _points[3])]); _triangles[0].px = _ox; _triangles[0].py = _oy; _triangles[1].px = _ox; _triangles[1].py = _oy; alpha = 0; addEventListener( Event.ENTER_FRAME, function():void { alpha += 0.05 if (alpha > 1) { removeEventListener(Event.ENTER_FRAME, arguments.callee); } } ); } private var waitTime:uint; private var startTime:Number; public function preCrash(wait:uint, partition:uint):void { waitTime = wait * 200; startTime = getTimer(); for (var k:int = 0; k < partition; k++) { _points.push(new Node(_points.length, Math.random() * _sx, Math.random() * _sy)); _interaction(); } addEventListener(Event.ENTER_FRAME, crash); } private function crash(e:Event = null):void { var vanishTime:Number = 2000; if (getTimer() - startTime > waitTime) { for (var i : int = 0; i < _triangles.length; i++) { var tri:Triangle = _triangles[i]; tri.rx += tri.tx; tri.ry += tri.ty; tri.rz += tri.tz; tri.vy += 0.4; tri.px += tri.vx; tri.py += tri.vy; tri.pz += tri.vz; } if (getTimer() - startTime > waitTime + vanishTime) { _isVisible = false; removeEventListener(Event.ENTER_FRAME, crash); parent.removeChild(this); } } } private var mtx3D:Matrix3D = new Matrix3D(); public function draw(display3D:Matrix3D):void { var panelVerts:Vector.
= new Vector.
(); var projectedVerts:Vector.
= new Vector.
(); var uvts:Vector.
= new Vector.
(); for (var i:int = 0; i < _triangles.length; i++) { var tri:Triangle = _triangles[i]; for (var j : int = 0; j < 3; j++) { var tmpNode:Node = tri["node" + j]; var tmpVector3D:Vector3D = new Vector3D(tmpNode.point.x, tmpNode.point.y, 0); mtx3D.identity(); mtx3D.appendTranslation( -tri.centerOfGravity.x, -tri.centerOfGravity.y, 0); mtx3D.appendRotation(tri.rx, Vector3D.X_AXIS); mtx3D.appendRotation(tri.ry, Vector3D.Y_AXIS); mtx3D.appendRotation(tri.rz, Vector3D.Z_AXIS); mtx3D.appendTranslation(tri.centerOfGravity.x, tri.centerOfGravity.y, 0); mtx3D.appendTranslation(tri.px, tri.py, tri.pz); bugfix(mtx3D); var newVector3D:Vector3D = mtx3D.transformVector(tmpVector3D); panelVerts.push(tmpNode.point.x + newVector3D.x, tmpNode.point.y + newVector3D.y, newVector3D.z); } uvts.push(tri.node0.point.x / _sx, tri.node0.point.y / _sy, null, tri.node1.point.x / _sx, tri.node1.point.y / _sy, null, tri.node2.point.x / _sx, tri.node2.point.y / _sy, null); } Utils3D.projectVectors(display3D, panelVerts, projectedVerts, uvts); var g:Graphics = graphics; g.clear(); g.beginBitmapFill(_img); g.drawTriangles(projectedVerts, null, uvts); g.endFill(); } private function bugfix(matrix:Matrix3D):void { var m1:Matrix3D = new Matrix3D(Vector.
([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0])); var m2:Matrix3D = new Matrix3D(Vector.
([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0])); m1.append( m2 ); if (m1.rawData[15] == 20) { var rawData:Vector.
= matrix.rawData; rawData[15] /= 20; matrix.rawData = rawData; } } /* * インタラクション */ private function _interaction() : void { //一時保持の三角形群 var localTriangles:Vector.
= new Vector.
(); //辺 var edges:Vector.
; //多角形 var polygon:Vector.
; //ポイント群ループ for (var k : int = 4;k < _points.length;k++) { var node : Node = _points[k]; localTriangles = new Vector.
(); edges = new Vector.
(); for (var i : String in _triangles) { //点が外接円 var tri : Triangle = _triangles[i]; tri.px = _ox; tri.py = _oy; if(inOuterCircle(node.point.x, node.point.y, tri)) { //*ポイントが外接円の中なら三角の辺を一時変数edgesへ代入*/ edges.push(new Edge(tri.node0, tri.node1)); edges.push(new Edge(tri.node1, tri.node2)); edges.push(new Edge(tri.node2, tri.node0)); } else { //*ポイントが外接円の外なら三角の辺を一時配列localTrianglesへ代入*/ localTriangles.push(tri); } } //edgesからpolygonを作る(重複辺の削除 polygon = new Vector.
(); for (i in edges) { var edge0 : Edge = edges[i]; //重複チェック0 var flg : Boolean = false; for (var j:String in polygon) { var edge1 : Edge = polygon[j]; if(judgeEdges(edge0, edge1)) { flg = true; polygon.splice(int(j), 1); break; } } //データが存在しない場合は追加 if(!flg) polygon.push(edges[i]); } //polygonから三角形を作って挿入 for (i in polygon) { var tri1:Triangle = new Triangle(polygon[i].node0, polygon[i].node1, node); tri1.px = _ox; tri1.py = _oy; localTriangles.push(tri1); } } if(localTriangles.length > 1) _triangles = localTriangles; } /* * 同じ辺かどうかの判定 */ private function judgeEdges(edge : Edge, edge0 : Edge) : Boolean { if(edge.node0.id == edge0.node0.id && edge.node1.id == edge0.node1.id) { return true; } if(edge.node1.id == edge0.node0.id && edge.node0.id == edge0.node1.id) { return true; } return false; } /* * 外接円の内か外か */ public static function inOuterCircle(x : Number,y : Number,tri : Triangle) : Boolean { var node0 : Node = tri.node0; var node1 : Node = tri.node1; var node2 : Node = tri.node2; var d : Number = (node0.point.x * node0.point.x + node0.point.y * node0.point.y - x * x - y * y) * ((node1.point.x - x) * (node2.point.y - y) - (node2.point.x - x) * (node1.point.y - y)) + (node1.point.x * node1.point.x + node1.point.y * node1.point.y - x * x - y * y) * ((node2.point.x - x) * (node0.point.y - y) - (node2.point.y - y) * (node0.point.x - x)) + (node2.point.x * node2.point.x + node2.point.y * node2.point.y - x * x - y * y) * ((node0.point.x - x) * (node1.point.y - y) - (node0.point.y - y) * (node1.point.x - x)); return ( (node1.point.x - node0.point.x) * (node2.point.y - node0.point.y) - (node1.point.y - node0.point.y) * (node2.point.x - node0.point.x) > 0 ) ? d > 0 : d <= 0; } } import flash.geom.Point; class Triangle { private var _node0 : Node; private var _node1 : Node; private var _node2 : Node; private var _centerOfGravity:Point; private var _px:Number = 0; private var _py:Number = 0; private var _pz:Number = 0; private var _vx:Number = Math.random() * 16.0 - 8.0; private var _vy:Number = Math.random() * 16.0 - 8.0; private var _vz:Number = Math.random() * 16.0 - 8.0; private var _rx:Number = 0; private var _ry:Number = 0; private var _rz:Number = 0; private var _tx:Number = Math.random() * 8.0 - 4.0; private var _ty:Number = Math.random() * 8.0 - 4.0; private var _tz:Number = Math.random() * 8.0 - 4.0; public function Triangle(node0:Node,node1:Node,node2:Node):void { _node0 = node0; _node1 = node1; _node2 = node2; centerOfGravity = new Point((node0.point.x + node1.point.x + node2.point.x) / 3, (node0.point.y + node1.point.y + node2.point.y) / 3); } public function get node0() : Node { return _node0; } public function get node1() : Node { return _node1; } public function get node2() : Node { return _node2; } public function get centerOfGravity():Point { return _centerOfGravity; } public function get px():Number { return _px; } public function get py():Number { return _py; } public function get pz():Number { return _pz; } public function get vx():Number { return _vx; } public function get vy():Number { return _vy; } public function get vz():Number { return _vz; } public function get rx():Number { return _rx; } public function get ry():Number { return _ry; } public function get rz():Number { return _rz; } public function get tx():Number { return _tx; } public function get ty():Number { return _ty; } public function get tz():Number { return _tz; } public function set centerOfGravity(value:Point):void { _centerOfGravity = value; } public function set px(value:Number):void { _px = value; } public function set py(value:Number):void { _py = value; } public function set pz(value:Number):void { _pz = value; } public function set vx(value:Number):void { _vx = value; } public function set vy(value:Number):void { _vy = value; } public function set vz(value:Number):void { _vz = value; } public function set rx(value:Number):void { _rx = value; } public function set ry(value:Number):void { _ry = value; } public function set rz(value:Number):void { _rz = value; } public function set tx(value:Number):void { _tx = value; } public function set ty(value:Number):void { _ty = value; } public function set tz(value:Number):void { _tz = value; } } import flash.geom.Point; class Node { private var _id : int; private var _point : Point; public function Node(id:int,x:Number,y:Number) { _id = id; _point = new Point(x,y); } public function get id() : int { return _id; } public function get point() : Point { return _point; } } class Edge { private var _node0 : Node; private var _node1 : Node; public function Edge(node0:Node,node1:Node):void { _node0 = node0; _node1 = node1; } public function get node0() : Node { return _node0; } public function get node1() : Node { return _node1; } }
Join Effecthub.com
Working with Global Gaming Artists and Developers!
Login
Sign Up
Or Login with Your Email Address:
Email
Password
Remember
Or Sign Up with Your Email Address:
Your Email
This field must contain a valid email
Set Password
Password should be at least 1 character
Stay informed via email