package { import flash.display.BitmapData; public class Polo { private var W:int private var H:int private var dimension:int private var radius:Number private var CX:int private var CY:int public var bitmapData:BitmapData; public function Polo( W:int, H:int ) { init( W, H ); } public function init( W:int, H:int ):void { //crée le bitmap bitmapData = new BitmapData( W, H, true, 0x00000000 ); //recupere largeur et hauteur this.W = W; this.H = H; //trouve le coté le plus court et deduis le rayon maximum dimension = ( W < H ) ? W : H; } public function process( image:BitmapData, resize:Boolean=false, rayon:Number=2 , offset:Number = 0 ):void { //position du centre if ( resize ) { CX = dimension >> 1; CY = dimension >> 1; }else{ CX = W >>1; CY = H >>1; } //rayon de la polarisation radius = dimension / rayon; //ints var DX:int, DY:int, cartesianX:int, cartesianY:int; // uints var color:uint; //numbers var hypothenuse:Number, radians:Number, degres:Number, inverseDegres:Number var Y:int = H while(Y--) { var X:int = W while(X--) { // prend la position de chaque pixel par rapport au centre DX = X - CX; DY = Y - CY; // calcule la distance pixel - centre hypothenuse = Math.sqrt( DX * DX + DY * DY ); // trouve l'angle radians = Math.atan2( DY, DX ); // passe en degres degres = radians * 180 / Math.PI + 90 + offset; // offset pour l'angle degres = (degres<0)?degres+360:(degres>360)?degres-360:degres; // angle complementaire inverseDegres = 360 - degres; // trouve les coordonnees du pixel dont on preleve la couleur // le truc que je n'avais pas compris dans mes precedentes tentatives if ( offset >= 0 ) { cartesianX = inverseDegres * W / 360 ; }else{ cartesianX = degres * W / 360 ; } cartesianY = hypothenuse * H / radius ; // rabat sur l'avant dernier pixel en hauteur ou en largeur lorsque // X OU Y atteignent ou depassent la largeur ou la hauteur if( cartesianX > W-1 ) cartesianX = W -1; if( cartesianY > H-1 ) cartesianY = H -1; //preleve color = image.getPixel32(cartesianX,cartesianY); //assigne une couleur arbitraire quand on depasse le cercle de centre CX / CY : if( hypothenuse > radius ) color = 0x00000000; //assigne la couleur prelevee au coordonnees X, Y bitmapData.setPixel32( X, Y, color ); } } } } }