package {
import flash.geom.Rectangle;
import flash.events.Event;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Sprite;
[SWF(width="512",height="512",frameRate="60",backgroundColor="0x000000")]
public class FlashTest extends Sprite {
private var first:Particle;
private var bmd:BitmapData;
private var bmp:Bitmap;
private var rect:Rectangle;
public function FlashTest() {
var g:Graphics=graphics;
g.lineStyle(1,0xffffff);
g.drawRect(0,0,256,256);
g.moveTo(128,0);
g.lineTo(128,120);
g.moveTo(128,136);
g.lineTo(128,256);
g.lineStyle(10,0xffffff);
g.moveTo(128,120);
g.lineTo(128,136);
var t:Number=Math.random()*2*Math.PI;
var s:Number=Math.random()*3.9+0.1;
first=new Particle(Math.random()*256<<0,Math.random()*256<<0,Math.cos(t)*s,Math.sin(t)*s);
var prev:Particle=first;
for(var i:int=1;i<10000;i++){
t=Math.random()*2*Math.PI;
s=Math.random()*3.9+0.1;
var next:Particle=new Particle(Math.random()*256<<0,Math.random()*256<<0,Math.cos(t)*s,Math.sin(t)*s);
prev.next=next;
prev=next;
}
bmd=new BitmapData(256,256,true,0);
bmp=new Bitmap(bmd);
rect=bmd.rect;
addChild(bmp);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onEnterFrame(e:Event):void{
var p:Particle=first;
bmd.lock();
bmd.fillRect(rect,0);
var d:Number;
while(p){
d=p.x;
var x:Number=p.x+=p.vx;
var y:Number=p.y+=p.vy;
if((d<128&&x>128)||(d>128&&x<128)){
if(!(Math.abs(y-128)<16&&((p.vx>0&&p.t>4)||(p.vx<0&&p.t<=4)))){
p.vx*=-1;
x=p.x+=p.vx;
}
}
if(x<0||x>=256)p.vx*=-1;
if(y<0||y>=256)p.vy*=-1;
bmd.setPixel32(x,y,p.c);
p=p.next;
}
bmd.unlock();
}
}
}
class Particle{
public var next:Particle;
public var x:Number;
public var y:Number;
public var vx:Number;
public var vy:Number;
public var t:Number;
public var c:uint;
public function Particle(x:Number,y:Number,vx:Number,vy:Number){
this.x=x;
this.y=y;
this.vx=vx;
this.vy=vy;
next=null;
t=vx*vx+vy*vy;
var r:Number=t*16>>0;
var b:Number=256-r;
c=0xff000000|((r>255?255:r)<<16)|(b>255?255:b);
}
}