forked from: メビウスの輪っぽいの
forked from メビウスの輪っぽいの (diff: 2)
メビウスの輪っぽく並べる。 HSBtoRGB()ってのは、HSBからRGBに変換する関数です。
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);
}
}
}