forked from: メビウスの輪っぽいの

by sem__alter forked from メビウスの輪っぽいの (diff: 2)
メビウスの輪っぽく並べる。
HSBtoRGB()ってのは、HSBからRGBに変換する関数です。
♥0 | Line 114 | Modified 2009-07-15 20:20:40 | MIT License
play

ActionScript3 source code

/**
 * Copyright sem__alter ( http://wonderfl.net/user/sem__alter )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/6Rwt
 */

// forked from sake's メビウスの輪っぽいの
/*
    メビウスの輪っぽく並べる。
     HSBtoRGB()ってのは、HSBからRGBに変換する関数です。
*/

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.geom.Matrix3D;

	[SWF(width="465", height="465", backgroundColor="0xFFFFFF", frameRate="40")]

	public class Mobius extends Sprite
	{
		private var container:Sprite;
		private var planeN:Number;

		public function Mobius()
		{
			container=new Sprite();
			container.x=465 / 2;
			container.y=465 / 2;
			addChild(container);

			planeN=0;
			var a:int=120;
			var xxx:Number;
			var yyy:Number;
			var zzz:Number;

			for(var i:Number=0; i <= 2 * Math.PI; i+=0.1)
			{
				for(var j:Number=-0.4; j <= 0.4; j+=0.1)
				{

					var sp:Sprite=new Sprite();
					sp.graphics.beginFill(HSBtoRGB(planeN / 255, 1, 1), 0.7);
					sp.graphics.drawCircle(0, 0, 2);
					sp.graphics.endFill();
					sp.x=a * (Math.cos(i) + j * Math.cos(i * 2) * Math.cos(i+a));
					sp.y=a * (Math.sin(i) + j * Math.cos(i / 2) * Math.sin(i));
					sp.z=a * j * Math.sin(i / 2);
					sp.name="sp" + planeN.toString();
					planeN++;
					container.addChild(sp);
				}
			}

			addEventListener(Event.ENTER_FRAME, onFrame);
		}

		private function onFrame(e:Event):void
		{
			container.rotationY++;
			container.rotationX++;

			var array:Array=[];

			for(var i:int=0; i < planeN; i++)
			{
				var sp:Sprite=container.getChildByName("sp" + i.toString())as Sprite;
				var mat:Matrix3D=sp.transform.getRelativeMatrix3D(this);
				array.push({sp:sp, z:mat.position.z});
			}

			array.sortOn("z", Array.NUMERIC | Array.DESCENDING);

			for(var i:int=0; i < planeN; i++)
			{
				var sp:Sprite=array[i].sp as Sprite;
				container.setChildIndex(sp, i);

				var b:Number=(array[i].z as Number) / 14;
				sp.filters=(b > 4) ? [new BlurFilter(b, b, 3)] : [];
			}
		}

		private function HSBtoRGB(hue:Number, saturation:Number, brightness:Number):uint
		{
			var r:int=0;
			var g:int=0;
			var b:int=0;
			if (saturation == 0)
			{
				r=g=b=brightness * 255.0 + 0.5;
			}
			else
			{
				var h:Number=(hue - Math.floor(hue)) * 6.0;
				var f:Number=h - Math.floor(h);
				var p:Number=brightness * (1.0 - saturation);
				var q:Number=brightness * (1.0 - saturation * f);
				var t:Number=brightness * (1.0 - (saturation * (1.0 - f)));
				switch(int(h))
				{
					case 0:
						r=brightness * 255.0 + 0.5;
						g=t * 255.0 + 0.5;
						b=p * 255.0 + 0.5;
						break;
					case 1:
						r=q * 255.0 + 0.5;
						g=brightness * 255.0 + 0.5;
						b=p * 255.0 + 0.5;
						break;
					case 2:
						r=p * 255.0 + 0.5;
						g=brightness * 255.0 + 0.5;
						b=t * 255.0 + 0.5;
						break;
					case 3:
						r=p * 255.0 + 0.5;
						g=q * 255.0 + 0.5;
						b=brightness * 255.0 + 0.5;
						break;
					case 4:
						r=t * 255.0 + 0.5;
						g=p * 255.0 + 0.5;
						b=brightness * 255.0 + 0.5;
						break;
					case 5:
						r=brightness * 255.0 + 0.5;
						g=p * 255.0 + 0.5;
						b=q * 255.0 + 0.5;
						break;
				}
			}
			return (r << 16) | (g << 8) | (b << 0);
		}
	}
}