| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| \x3a\x6f\x29 Registriert seit: Apr 2004 Ort: paris
Beiträge: 806
| Lorenz attractor spectrum ![]() Das ganze kann man sich auch einfach live anschauen. Hier der Code. Übrigens im LorenzPlotter kann ich n auch getrost auf 80.000 setzen ![]() Code: package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BlendMode;
import flash.display.Sprite;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.media.Sound;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[SWF(width='640',height='480',frameRate='255',backgroundColor='0x000000')]
public class LorenzSpectrum extends Sprite
{
[Embed(source='/assets/pal.png')]
private const COLOR_MAP: Class;
private const origin: Point = new Point;
private const reg: Point = new Point( 320, 240 );
private var palette: Array;
private var screen: BitmapData;
private var buffer: BitmapData;
private var plotter: LorenzPlotter;
private var t: Number;
private var colorFx: Matrix;
private const roto: Matrix = new Matrix;
private var colorDamp: ColorTransform;
private var spectrum: ByteArray;
public function LorenzSpectrum()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.LOW;
var colorMap: BitmapData = Bitmap( new COLOR_MAP ).bitmapData;
palette = new Array( 0x100 );
for ( var i: int = 0; i < 0x100; ++i )
palette[ i ] = colorMap.getPixel( i, 0 );
palette[ 0 ] = 0;
t = 0;
var scl: Number = .25;
colorFx = new Matrix;
colorFx.a = ( 500 + scl ) / 500;
colorFx.d = ( 500 + scl ) / 500;
colorFx.tx = -scl;
colorDamp = new ColorTransform( .87, .71, .86 );
screen = new BitmapData( stage.stageWidth, stage.stageHeight, false, 0 )
buffer = screen.clone();
buffer.lock();
plotter = new LorenzPlotter( buffer );
addChild( new Bitmap( screen ) );
spectrum = new ByteArray;
var sound: Sound = new Sound( new URLRequest( 'sound.mp3' ) );
sound.play();
addEventListener( Event.ENTER_FRAME, enterFrame );
}
private function enterFrame( event: Event ): void
{
var i: int, a: Number, b: Number, c: Number;
SoundMixer.computeSpectrum( spectrum, true );
t += .1;
plotter.reset();
for ( i = 0, a =0 ; i < 0x20; ++i )
a += spectrum.readFloat();
spectrum.position = 0x100 * 4;
for ( i = 0; i < 0x20; ++i )
a += spectrum.readFloat();
a *= ( 1 / 0x40 );
if ( a > .32 )
{
plotter.scaleX += 6;
plotter.scaleY += 6;
}
plotter.scaleX -= ( plotter.scaleX - 4 ) * .5;
plotter.scaleY -= ( plotter.scaleY - 4 ) * .5;
spectrum.position = 0x40 * 4;
for ( i = 0, a = 0; i < 0x80; ++i )
a += spectrum.readFloat();
a *= ( 1 / 0x20 );
c = b = a;
plotter.a = 10 - 10 * a;
spectrum.position = 0x140 * 4;
for ( i = 0, a = 0; i < 0x80; ++i )
a += spectrum.readFloat();
a *= ( 1 / 0x20 );
b += a;
plotter.b = 20 + 8 * a;
plotter.c += b * ( 5 / 2 );
plotter.c -= ( plotter.c - ( 8 / 3 ) ) * .5;
b = -a;
SoundMixer.computeSpectrum(spectrum);
for( i = 0, a = 0; i < 0x200; ++i )
a += Math.abs( spectrum.readFloat() );
plotter.h -= ( plotter.h - ( .002 + ( .02 - .002 ) * ( a / 0x80 ) ) ) * .125;
plotter.render();
colorDamp.greenMultiplier = .71 + Math.sin( t ) * .2;
screen.draw( screen, colorFx, colorDamp, BlendMode.NORMAL );
screen.applyFilter( screen, screen.rect, origin, new BlurFilter( 8, 8, 3 ) );
buffer.paletteMap( buffer, buffer.rect, origin, null, null, palette );
roto.identity();
roto.rotate( c * 1.25 );
roto.rotate( b * 1.25 );
var offset: Point = reg.subtract( roto.transformPoint( reg ) );
roto.tx = offset.x;
roto.ty = offset.y;
screen.draw( buffer, roto, null, BlendMode.ADD );
}
}
}
import flash.display.BitmapData;
class LorenzPlotter
{
private const n: int = 8000;
public var h: Number;
public var a: Number;
public var b: Number;
public var c: Number;
public var scaleX: Number;
public var scaleY: Number;
private var x0: Number;
private var y0: Number;
private var z0: Number;
private var x1: Number;
private var y1: Number;
private var z1: Number;
private var i: int;
private var output: BitmapData;
public function LorenzPlotter( output: BitmapData )
{
this.output = output;
scaleX = scaleY = 8;
h = .01;
a = 10;
b = 28;
c = 8/3;
reset();
}
public function reset(): void
{
x0 = 0,
y0 = 2,
z0 = 12;
output.fillRect( output.rect, 0 );
}
public function render(): void
{
i = 0;
while ( i < n )
{
x1 = x0 + h * a * ( y0 - x0 ),
y1 = y0 + h * ( x0 * ( b - z0 ) - y0 ),
z1 = z0 + h * ( x0 * y0 - c * z0 );
x0 = x1,
y0 = y1,
z0 = z1;
x1 *= scaleX,
y1 *= scaleY;
x1 += 320,
y1 += 240;
z1 = z1 * 8;
if ( z1 < 0 ) z1 = -z1;
if ( x1 < 0 || x1 > 640 || y1 < 0 || y1 > 480 )
{
++i;
continue;
}
if ( z1 > 0xff )
z1 = 0xff;
output.setPixel( x1, y1, z1 );
++i;
}
}
} |
| | |
| | #4 (permalink) |
| ................ Registriert seit: Jun 2004
Beiträge: 15.888
|
Jau - hübsch. Habe mich aber sowas von erschrocken, als da ohne Vorwarnung die Mukke losgeballert hat...
__________________ ternärer Konditionaloperator +++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++ |
| | |
| | #5 (permalink) |
| experience++; Registriert seit: Jul 2002 Ort: Düsseldorf
Beiträge: 11.305
|
gut schauts aus.. super performant! grüße, sal
__________________
Chuck Norris hat den Flash Player für alle mobilen Betriebssysteme! |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |