Pie Charts

by John_Blackburne
Pie Charts
http://johnblackburne.blogspot.com/2012/03/drawing-pie-chart.html
♥0 | Line 120 | Modified 2012-03-02 09:29:47 | MIT License
play

ActionScript3 source code

/**
 * Copyright John_Blackburne ( http://wonderfl.net/user/John_Blackburne )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/3qbe
 */

// This is something I wrote for the game I'm working on but removed a few days ago
// as I went in a different direction in the design. As the code is fairly self-contained
// I thought it might be of interest.

// The code generates a pie chart, entirely in code, though it could be easily used with art.
// It's designed to be dynamic so the chart can be re-drawn any time. Each chart is a BitmapData
// so easily added to the stage or drawn into another BitmapData.

package {
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
[SWF(width="465", height="465", backgroundColor="0", frameRate="30")]
    public class FlashTest extends Sprite {
        public var aPie:Vector.<Pie>;
        public var aCharts:Vector.<Bitmap>;

        public function FlashTest() {
            var base:Bitmap = new Bitmap(new BitmapData(465, 465, false, 0xff000000));
            addChild(base);
            
            // write as3 code here..
            aPie = new Vector.<Pie>(4);
            aCharts = new Vector.<Bitmap>(4);
            aPie[0] = new Pie(30);
            aPie[1] = new Pie(40);
            aPie[2] = new Pie(40);
            aPie[3] = new Pie(30);

            aCharts[0] = new Bitmap(aPie[0]);
            aCharts[1] = new Bitmap(aPie[1]);
            aCharts[2] = new Bitmap(aPie[2]);
            aCharts[3] = new Bitmap(aPie[3]);

            aCharts[0].x = aCharts[1].x = 20;
            aCharts[2].x = aCharts[3].x = 150;
            aCharts[0].y = aCharts[2].y = 20;
            aCharts[1].y = aCharts[3].y = 150;

            addChild(aCharts[0]);
            addChild(aCharts[1]);
            addChild(aCharts[2]);
            addChild(aCharts[3]);

            aPie[0].Update(0.33333);
            aPie[1].Update(0.45);
            aPie[2].Update(0.7);
            aPie[3].Update(0.9);
        }
    }

}

	import flash.display.BitmapData;
	import flash.display.BitmapDataChannel;
	import flash.display.Graphics;
	import flash.display.Shape;

	import flash.filters.GlowFilter;
	import flash.filters.BitmapFilterQuality;

	import flash.geom.Point;

    class Pie extends BitmapData {
		
		public var fRadius:Number;
		public var fDiam:Number;
		public var datCirc:BitmapData;
		public var p0:Point;
		
		public var fCurr:Number, fAngle:Number;
		
		function Pie(fSize:Number) {
			fRadius = fSize;
			fDiam = fRadius * 2;
			super(fDiam, fDiam, true, 0);
			Make();
		} 
		
		public function Make():void {
			var shape:Shape, g:Graphics;
		
			datCirc = new BitmapData(fDiam, fDiam, true, 0);
			
			shape = new Shape();
			g = shape.graphics;
			g.beginFill(0xff0000);
			g.drawCircle(fRadius, fRadius, fRadius - 3);
			
			p0 = new Point();

			datCirc.draw(shape);
			datCirc.applyFilter(datCirc, rect, p0, 
				new GlowFilter(0xffff00, 0.7, 2, 2, 2, BitmapFilterQuality.HIGH, false, false));
			datCirc.copyChannel(datCirc, rect, p0, 
					BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
			
			fCurr = 0;
		}
		
		public function Update(fFrac:Number):void {
			var  shape:Shape, g:Graphics;
			
			if (fFrac == fCurr) {
				return;
			}
			
			fCurr = fFrac;
			
			shape = new Shape();
			g = shape.graphics;

			fAngle = fCurr * 2 * Math.PI;
			var iOctant:int = fCurr * 8;
			g.beginFill(0xffffff);
			g.moveTo(fRadius, fRadius);
			g.lineTo(fRadius, 0);
			
			switch (iOctant) {
				case 0:
					g.lineTo((1 + Math.sin(fAngle)) * fRadius, 0);
					break;
				case 1:
				case 2:
					g.lineTo(fDiam, 0);
					g.lineTo(fDiam, (1 - Math.cos(fAngle)) * fRadius);
					break;
				case 3:
				case 4:
					g.lineTo(fDiam, 0);
					g.lineTo(fDiam, fDiam);
					g.lineTo((1 + Math.sin(fAngle)) * fRadius, 2 * fRadius);
					break;
				case 5:
				case 6:
					g.lineTo(fDiam, 0);
					g.lineTo(fDiam, fDiam);
					g.lineTo(0, fDiam);
					g.lineTo(0, (1 - Math.cos(fAngle)) * fRadius);
					break;
				case 7:
					g.lineTo(fDiam, 0);
					g.lineTo(fDiam, fDiam);
					g.lineTo(0, fDiam);
					g.lineTo(0, (1 - Math.cos(fAngle)) * fRadius);
					break;
			}
			
			g.lineTo(fRadius, fRadius);
			g.endFill();
			
			draw(shape);
			copyChannel(this, rect, p0, 
					BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
//			copyPixels(this, rect, p0, datCirc);
			copyPixels(datCirc, rect, p0, this);
			
			
		}
	}