package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite import flash.text.TextField; import flash.text.TextFormat; import flash.utils.Timer import flash.events.TimerEvent import flash.events.MouseEvent public class Lorenz { private var a:Number = 20;//constantes établies par Lorenz private var b:Number = 28; private var c:Number = 8/3; private var h:Number;//vitesse private var i:Number;//compteur private var n:Number;//total itérations private var x:Number;// positions private var y:Number; private var z:Number; private var scaler:Number;//facteur d'échelle private var scene:Sprite;//ressources de la scene private var timer:Timer; public var log:TextField public var bmp:Bitmap //ressources de dessin public var bmpd:BitmapData public var onOff:Boolean = false// on / off public function Lorenz( p:Sprite ) { scene = new Sprite(); scene.blendMode = 'add'; p.addChild( scene ); log= new TextField(); log.width = 200; log.height = 100; log.selectable = false; log.wordWrap = true log.text = "Bonjour, je suis un attracteur de Lorenz, je vais te bouffer toutes tes ressources des que tu m'auras clicke dessus. Au click, promis, j'arrete"; var tf:TextFormat = new TextFormat( 'Verdana' , 10, 0xFFFFFF ); log.setTextFormat( tf ); p.addChild(log) timer = new Timer( 1 ,0 ) timer.addEventListener( TimerEvent.TIMER, lorenz); p.addEventListener( MouseEvent.MOUSE_DOWN, startStop ) } public function reset():void { timer.stop(); if ( bmpd ) bmpd.dispose() bmpd = new BitmapData( 500, 500, true, 0xFF000000 ) bmp = new Bitmap( bmpd, "auto", false) scene.addChild( bmp ) //un facteur de redimension scaler = 4; //réinitialise les variables de boucle h = 0.005 i = 0 n = 4000 //initialise les variables de position x = ( Math.random() * 50 - 25 ) /2; y = ( Math.random() * 50 - 25 ) /2; z = ( Math.random() * 50 - 25 ) /2 timer.start(); } public function startStop( m:MouseEvent ):void { onOff = (onOff == false) ? true : false; if (onOff==true) { reset() }else{ timer.stop() } } public function lorenz( t:TimerEvent ):void { //calcul des positions x += h * a * (y - x); y += h * (x * (b - z) - y); z += h * (x * y - c * z); scene.graphics.lineStyle( 1, 0xFFFFFF, .05) //remplissage ... bof... // scene.graphics.beginFill( 0xFFFFFF, .001) //dessine un cercle de diamètre z scene.graphics.drawCircle( 250+ x*scaler, 250+y*scaler, z) // et un autre de diamètre z² / scale² scene.graphics.drawCircle( 250+ x*scaler, 250+y*scaler, ( z * z ) / (scaler * scaler) ) //copie le dessin dans le bitmpadata puis efface la scène pour économiser les resources bmpd.draw(scene) scene.graphics.clear() //dessine le centre du cercle à même le bitmapdata bmpd.setPixel( 250+x*scaler, 250 +y*scaler, 0xFFFFFF) //affichage compteur log.text= 'reste : '+ (n-i); var tf:TextFormat = new TextFormat( 'Verdana' , 10, 0xFFFFFF ); log.setTextFormat( tf ); if (i++ == n) { //dernière itération atteinte timer.stop() // en boucle //reset() } } } }