// ------------------------------- // Proj: Chart // Author: Ēriks Krūze // ------------------------------- package { import flash.display.Sprite; import flash.display.Shape; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.text.AntiAliasType; import flash.text.GridFitType; import flash.geom.Matrix; import flash.text.TextField; import Math; import flash.display.LoaderInfo; //backgroundColor="#e9e9e9" [SWF(width="124", height="124", frameRate="1")] public class poll_percentage extends Sprite { public var radius : Number = 62; // radus of chart public function poll_percentage() { // read percents from flashvars //var flashvars:Object = LoaderInfo(this.root.loaderInfo).parameters; //this.click_tag_url = String(flashvars['clickTAG']); // print out all sectors var par_key:String; var par_val:Number; var rot_val:Number = 0; // how much rotate var par_col:Number; var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters; for (par_key in paramObj) { if (par_key == 'p1') par_col = 0xffffff; else if (par_key == 'p2') par_col = 0x000000; else if (par_key == 'p3') par_col = 0xff0000; else if (par_key == 'p4') par_col = 0x0000ff; par_val = Number(paramObj[par_key]); draw_sector(par_val, rot_val, par_col); rot_val -= par_val; } } public function draw_sector(percents:Number, rotation_percents:Number, circle_color:Number):void { var percents_reminder: Number = percents; // percents that stay when quarters ar drawn var x_cur: Number; // current position var y_cur: Number; var x_old: Number; // to save old pos var y_old: Number; var x_sign: Number; // in witch direction go var y_sign: Number; // create circle var circ:Shape = new Shape(); circ.graphics.beginFill(circle_color,1); circ.graphics.drawCircle(radius,radius,radius); circ.graphics.endFill(); // create sector mask for circle var cmask:Shape = new Shape(); cmask.graphics.beginFill( 0x000000, 1 ); x_cur = radius; y_cur = radius; cmask.graphics.moveTo( x_cur, y_cur ); x_cur = radius; y_cur = 2*radius; cmask.graphics.lineTo( x_cur, y_cur ); // draw quartes x_sign = 1; // for 1. quarter y_sign = 0; if (percents >= 25) { percents_reminder -= 25; x_old = x_cur; y_old = y_cur; x_cur = 2 * radius; y_cur = radius; cmask.graphics.curveTo(x_old + (x_sign * radius), y_old + (y_sign * radius), x_cur, y_cur ); // for 2. quarter x_sign = 0; y_sign = -1; } if (percents >= 50) { percents_reminder -= 25; x_old = x_cur; y_old = y_cur; x_cur = radius; y_cur = 0; cmask.graphics.curveTo(x_old + (x_sign * radius), y_old + (y_sign * radius), x_cur, y_cur ); // for 3. quarter x_sign = -1; y_sign = 0; } if (percents >= 75) { percents_reminder -= 25; x_old = x_cur; y_old = y_cur; x_cur = 0; y_cur = radius; cmask.graphics.curveTo(x_old + (x_sign * radius), y_old + (y_sign * radius), x_cur, y_cur ); // for 4. quarter x_sign = 0; y_sign = 1; } if (percents == 100) { percents_reminder -= 25; x_old = x_cur; y_old = y_cur; x_cur = radius; y_cur = 2*radius; cmask.graphics.curveTo(x_old + (x_sign * radius), y_old + (y_sign * radius), x_cur, y_cur ); } // draw reminder if (percents_reminder > 0) { var radians:Number = percents_reminder * ( (2 * Math.PI) / 100); // convert percents to radians var side_length:Number = Math.tan(radians) * radius; x_cur = x_cur + x_sign * (side_length); y_cur = y_cur + y_sign * (side_length); cmask.graphics.lineTo( x_cur, y_cur ); } // go back to center cmask.graphics.lineTo( radius, radius ); cmask.graphics.endFill(); // rotate sector rotate_around_center(cmask,radius,rotation_percents); circ.mask = cmask; addChild(circ); } // rotates circle sector in clockwise direction public function rotate_around_center (ob:Shape, radius:Number, rotation_percents:Number):void { var m:Matrix=ob.transform.matrix; m.tx -= radius; // set rotation center point m.ty -= radius; m.rotate (rotation_percents * ( (2 * Math.PI) / 100 )); m.tx += radius; m.ty += radius; ob.transform.matrix=m; } } }