In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

BezierSegment3D

Get Adobe Flash player
by mas 17 Jan 2010
/**
 * Copyright mas ( http://wonderfl.net/user/mas )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/1XUQ
 */

package {
	import flash.display.*;
	import flash.events.Event;
	import flash.geom.*;
	[SWF (width = "480", height = "480", backgroundColor = "0xffffff", framerate = "60")]
    public class Bezier3D extends Sprite {
		private var _seqment:BezierSegment3D;
		
		private var _startIdx:int;
		private var _endIdx:int;
		
		private var _d:Vector3D;
		
		private var _dx:Number, _dy:Number;
		private var _numCopy:int;
		
		public var verts:Vector.<Number>;
		public var tVerts:Vector.<Number>;
		public var pVerts:Vector.<Number>;
		public var uvt:Vector.<Number>;
		private var _colors:Vector.<int>;
		
		private var _m:Matrix3D;
		private var _proj:Matrix3D;
		
		private var rot:Number;
		
		private var _container:Sprite;
		
        	public function Bezier3D() {
            // write as3 code here..
			verts = new Vector.<Number>;
			tVerts = new Vector.<Number>;
			pVerts = new Vector.<Number>;
			uvt = new Vector.<Number>;
			_colors = new Vector.<int>;
			
			_d = new Vector3D;
			
			initialize();
			
			_m = new Matrix3D;
			var perspective:PerspectiveProjection = new PerspectiveProjection;
			perspective.fieldOfView = 60;
			_proj = perspective.toMatrix3D();
			
			_container = new Sprite;
			_container.x = stage.stageWidth / 2;
			_container.y = stage.stageHeight / 2;
			addChild(_container);
			
			_dx = 0;
			_dy = 0;
			
			var i:int;
			var c:int;
			for (i = 0; i <= 50; i++)
			{
				c = 100 + i * 3;
				_colors.push(c << 16 | c * 0.6 << 8 | (255 - c * 0.6));
			}
			
			addEventListener(Event.ENTER_FRAME, update);
        }
		
		private function initialize():void
		{
			_startIdx=0;
			_endIdx = 0;
			
			_numCopy = 3 + int(7 * Math.random());
			
			var func:Function = function():Number
			{
				return (Math.random() - 0.5) * 0.4;
			};
			
			var a:Vector3D = _d;
			var b:Vector3D = new Vector3D(func(), func(), func());
			var c:Vector3D = new Vector3D(func(), func(), func());
			_d = new Vector3D(func(), func(), func());
			
			_seqment = new BezierSegment3D(a, b, c, _d);
			
			verts.length = 0;
			
			var i:int;
			var v:Vector3D;
			for (i = 0; i <= 50; i++)
			{
				v = _seqment.getValue(i / 50);
				verts.push(v.x, v.y, v.z);
			}
		}
		
		private function update(e:Event):void
		{
			_dx += (-stage.mouseX - _dx) * 0.1;
			_dy += (-stage.mouseY - _dy) * 0.1;
				
			_container.graphics.clear();
			
			var j:int;
			for (j = 0; j < _numCopy; j++)
			{
				_m.identity();
				_m.appendRotation(j * 360 / _numCopy, Vector3D.Z_AXIS);
				_m.appendRotation(_dy, Vector3D.X_AXIS);
				_m.appendRotation(_dx, Vector3D.Y_AXIS);
				_m.appendTranslation(0, 0, 0.5);
				_m.transformVectors(verts, tVerts);
				Utils3D.projectVectors(_proj, tVerts, pVerts, uvt);
				
				var i:int;
				var len:int = pVerts.length / 2;
				
				for (i = _startIdx; i < _endIdx - 1; i++)
				{
					_container.graphics.lineStyle(10, _colors[i], 0.8, false, "normal", CapsStyle.NONE);
					_container.graphics.moveTo(pVerts[i * 2], pVerts[i * 2 + 1]);
					_container.graphics.lineTo(pVerts[(i + 1) * 2 + 0], pVerts[(i + 1) * 2 + 1]);
				}
			}
			
			if (_endIdx != len)
			{
				_endIdx++;
			}
			else
			{
				_startIdx++;
				if (_startIdx == len - 1)	initialize();
			}
		}
    }
}
import flash.geom.Vector3D;
class BezierSegment3D
{
	public var a:Vector3D;
	public var b:Vector3D;
	public var c:Vector3D;
	public var d:Vector3D;
		
	public function BezierSegment3D($a:Vector3D, $b:Vector3D, $c:Vector3D, $d:Vector3D) 
	{
		a = $a;
		b = $b;
		c = $c;
		d = $d;
	}
		
	public function getValue($t:Number):Vector3D
	{
		var t:Number = $t;
		var ret:Vector3D = new Vector3D;
		ret.x = a.x * Math.pow((1 - t), 3) + 3 * b.x * t * Math.pow((1 - t), 2) + 3 * c.x * Math.pow(t, 2) * (1 - t) + d.x * Math.pow(t, 3);
		ret.y = a.y * Math.pow((1 - t), 3) + 3 * b.y * t * Math.pow((1 - t), 2) + 3 * c.y * Math.pow(t, 2) * (1 - t) + d.y * Math.pow(t, 3);
		ret.z = a.z * Math.pow((1 - t), 3) + 3 * b.z * t * Math.pow((1 - t), 2) + 3 * c.z * Math.pow(t, 2) * (1 - t) + d.z * Math.pow(t, 3);
			
		return ret;
	}
}