陈童的博客's Archivers

From everyinch on 2011-10-04 20:12:35

Flash三维粒子——Lorenz 84

Lorenz 84有5个参数:A,B,C,D和dT
方程为:<img src="http://www.everyinch.net/wp-content/uploads/2011/10/lorenz_84_equation.gif" alt="" title="lorenz_84_equation" width="195" height="72" class="aligncenter size-full wp-image-498" />
通过ActionScript表示为:
Lorenz-84 Attractors
参数:a,b,f,g和d
公式: finalX = x+d(-ax-y*y-z*z+af)
finalY = y+d(-y+xy-bxz+g)
finalZ = z+d(-z+bxy+xz)
[code lang="as3"]
package{
import __AS3__.vec.Vector;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.PixelSnapping;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.geom.PerspectiveProjection;
import flash.geom.Rectangle;
import flash.geom.Vector3D;

import net.everyinch.geom.Particle;

[SWF(width="800",height="600",frameRate="32",backgroundColor="0x000000")]
public class ParticleShape2 extends Sprite{
private const MAX_PARTICLES:int = 1024*300;
private var bmpd:BitmapData = new BitmapData(800,600,false,0);
private var buffer:Vector. = new Vector.(800*600,true);
private var focalLength:Number;
private var matrix:Matrix3D = new Matrix3D();
private var particle:Particle;
private var targetX:Number = 0.0;
private var targetY:Number = 0.0;

public function ParticleShape2(){
init();
createParticles();
positionParticles();

addEventListener(Event.ENTER_FRAME,onEnterframe);
}

private function init():void{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.frameRate = 32;
stage.quality = StageQuality.LOW;
stage.fullScreenSourceRect = new Rectangle(0,0,550,400);

var perspectiveProjection:PerspectiveProjection = new PerspectiveProjection();
perspectiveProjection.fieldOfView = 60;
focalLength = perspectiveProjection.focalLength;

addChild(new Bitmap(bmpd,PixelSnapping.NEVER,false));
}

private function createParticles():void{
if(MAX_PARTICLES < 1) return;
particle = new Particle();
var p:Particle = particle;
var numbers:int = MAX_PARTICLES;
while(--numbers != 0){
p.next = new Particle();
p = p.next;
}
}

// Lorenz-84 Attractors
// 参数:a,b,f,g和d
// 公式: finalX = x+d(-ax-y*y-z*z+af)
// finalY = y+d(-y+xy-bxz+g)
// finalZ = z+d(-z+bxy+xz)
private function positionParticles():void{
var a:Number = 1.111;
var b:Number = 1.479;
var f:Number = 4.494;
var g:Number = 0.44;
var d:Number = 0.135;
var cx:Number = 1;
var cy:Number = 1;
var cz:Number = 1;
var mx:Number = 0;
var my:Number = 0;
var mz:Number = 0;

var scale:Number = 60;
var p:Particle = particle;
while(p != null){
mx = cx + d*(-a*cx-cy*cy-cz*cz+a*f);
my = cy + d*(-cy+cx*cy-b*cx*cz+g);
mz = cz + d*(-cz+b*cx*cy+cx*cz);
cx = mx;
cy = my;
cz = mz;
p.x = mx*scale;
p.y = my*scale;
p.z = mz*scale;
p = p.next;
}
}

private function onEnterframe(e:Event):void{
targetX += (mouseX - targetX)*0.1;
targetY += (mouseY - targetY)*0.1;

matrix.identity();
matrix.appendRotation(targetX,Vector3D.Y_AXIS);
matrix.appendRotation(targetY,Vector3D.X_AXIS);
matrix.appendTranslation(0,0,10);

var p:Particle = particle;
var x:Number;
var y:Number;
var z:Number;
var w:Number;
var pz:Number;
var ix:int;
var iy:int;

var p00:Number = matrix.rawData[0x0];
var p01:Number = matrix.rawData[0x1];
var p02:Number = matrix.rawData[0x2];
var p10:Number = matrix.rawData[0x4];
var p11:Number = matrix.rawData[0x5];
var p12:Number = matrix.rawData[0x6];
var p20:Number = matrix.rawData[0x8];
var p21:Number = matrix.rawData[0x9];
var p22:Number = matrix.rawData[0xa];
var p32:Number = matrix.rawData[0xe];

var width:int = 800;
var min:int = -1;
var max:int = buffer.length;
var i:int;
var b:Vector. = buffer;

var color:uint;
var increment:uint = 0x204444;
var colorMax:uint = 0xFFFFFF;

var cx:Number = 400.0;
var cy:Number = 300.0;
var minZ:Number = 0.0;

var n:int = max;
while(--n > -1){
b[n] = 0x000000;
}
do{
x = p.x;
y = p.y;
z = p.z;
pz = focalLength + x*p02 + y*p12 + z*p22 + p32
if(pz > minZ){
w = focalLength/pz;
ix = int(w*(x*p00+y*p10+z*p20)+cx);
iy = int(w*(x*p01+y*p11+z*p21)+cy);
i = int(ix+int(iy*width));
if(i > min && i < max){
color = b[i]+increment;
b[i] = color > colorMax ? colorMax : color;
}
}
p = p.next;
}while(p);
bmpd.lock();
bmpd.setVector(bmpd.rect,b);
bmpd.unlock(bmpd.rect);
}
}
}
[/code]
<img src="http://www.everyinch.net/wp-content/uploads/2011/10/ParticleShape2-300x266.jpg" alt="" title="ParticleShape2" width="300" height="266" class="aligncenter size-medium wp-image-481" />

查看完整版本: Flash三维粒子——Lorenz 84

Tags: Flash, Lorenz, 三维粒子


©陈童的博客