# Something wrong with my math

**URL:** <https://forum.kirupa.com/t/something-wrong-with-my-math/293482>\
**Category:** flash\
**Created:** [July 29, 2009, 5:43pm UTC](https://forum.kirupa.com/t/something-wrong-with-my-math/293482 "2009-07-29T17:43:26Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![rondog](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/rondog/32/2478_2.png) [@rondog](https://forum.kirupa.com/u/rondog)\
**Post date:** [July 29, 2009, 5:43pm UTC](https://forum.kirupa.com/t/something-wrong-with-my-math/293482/1 "2009-07-29T17:43:26Z")

</div>

I am making a circle countdown timer class. It works fine, however, the startAngle variable isn’t really working the way I wanted it to. It seems to start at 45 degrees even though I have it set to 0. I want it to start at the top and work it way around like a clock. So it would start at 12 and end at 12. Here is my class

```auto

// Create an instance of the class in an empty FLA
import com.ronnieswietek.utils.CircleTimer;

var counter:CircleTimer = new CircleTimer(15,0xff0000,0x000000);
counter.x = stage.stageWidth * 0.5;
counter.y = stage.stageHeight * 0.5;
addChild(counter);

// The class
package com.ronnieswietek.utils
{
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
	import flash.text.*;
	
	public class CircleTimer extends Sprite
	{
		private var timer :Timer;
		private var circle :Sprite;
		private var txt :TextField;
		private var format :TextFormat;
		private var duration	:Number;
		private var percent :Number;
		private var color :uint;
		private var textColor	:uint;
		
		public function CircleTimer(duration:Number = 20, color:uint = 0x000000, textColor:uint = 0xffffff)
		{
			addEventListener(Event.ADDED_TO_STAGE, initTimer);
			this.duration = duration;
			this.color = color;
			this.textColor = textColor;
		}
		
		private function initTimer(e:Event):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, initTimer);
			txt = new TextField();
			format	= new TextFormat();
			circle = new Sprite();
			timer = new Timer(1000);
			timer.addEventListener(TimerEvent.TIMER, updateTimer);
			timer.start();
			addChild(circle);
			createTextField();
		}
		
		private function createTextField():void
		{
			format.color = textColor;
			format.font = "Verdana";
			txt.defaultTextFormat = format;
			txt.text = String(duration);
			txt.autoSize = TextFieldAutoSize.CENTER;
			txt.x = 0 - (txt.width * 0.5);
			txt.y = 0 - (txt.height * 0.5);
			addChild(txt);
		}
		
		private function updateTimer(e:TimerEvent):void
		{
			percent = timer.currentCount / duration;
			txt.text = String(duration - timer.currentCount);
			txt.x = 0 - (txt.width * 0.5);
			txt.y = 0 - (txt.height * 0.5);
			if (timer.currentCount != duration)
			{
				circleLoader(circle,percent);
			}
			else
			{
				trace("end timer");
				circleLoader(circle,percent);
				timer.stop();
				timer.removeEventListener(TimerEvent.TIMER, updateTimer);
			}
		}
		
		private function circleLoader(who:Sprite, pct:Number):void
		{
			who.graphics.clear();
			var radius :Number = 25;
			var endAngle	:Number = (Math.PI * pct) * 2;
			var startAngle	:Number = 0;
			if (endAngle != startAngle)
			{
				who.graphics.beginFill(color,100);
				who.graphics.lineTo(radius,0);
				circleSegmentTo(who,0,0,startAngle,endAngle,radius,1);
				who.graphics.lineTo(0,0);
				who.graphics.endFill();
			}
		}
		
		private function circleSegmentTo(sp:Sprite, x:Number, y:Number, a1:Number, a2:Number, r:Number, dir:Number):void
		{
			var diff:Number = Math.abs(a2 - a1);
			var divs:Number = Math.floor(diff / (Math.PI / 4)) + 1;
			var span:Number = dir * diff / (2 * divs);
			var rc	:Number = r / Math.cos(span);
			
			sp.graphics.moveTo(x + Math.cos(a1) * r,y + Math.sin(a1) * r);
			
			for (var i:int = 0; i < divs; i++)
			{
				a2 = a1 + span;
				a1 = a2 + span;
				sp.graphics.curveTo(x + Math.cos(a2) * rc,y + Math.sin(a2) * rc,x + Math.cos(a1) * r,y + Math.sin(a1) * r);
			}
		}		
	}
}

```
