Saturday, October 16, 2004

Finding the angle between two clock hands

 

I had come across an URL couple of days back: http://www.karrels.org/Ed/ACM/ec97/prob_2.html where this problem of finding the angle between two clock hands was mentioned. I wrote the following C# code yesterday. This seems to work (at least for the test inputs posted on the page). Do let me know if there's a bug.

    1 using System;

    2 

    3 public class ClockProblem

    4 {

    5     #region Public Methods

    6 

    7     public static void Main(string[] args)

    8     {

    9         if (args.Length != 1)

   10         {

   11             Console.WriteLine("Usage: ClockProblem 12:00");

   12             return;

   13         }

   14         string[] time = args[0].Split(':');

   15         var hr = Convert.ToInt32(time[0]);

   16         var min = Convert.ToInt32(time[1]);

   17         var clock = new ClockProblem();

   18         Console.WriteLine(

   19             "Angle between two hands at hour {0} min {1} is {2}",

   20             time[0],

   21             time[1],

   22             clock.FindAngleBetweenHands(hr, min)

   23         );

   24     }

   25 

   26     public float FindAngleBetweenHands(int hour, int minute)

   27     {

   28         float minuteHandAngle, hourHandAngle, angle;

   29 

   30         //If it's 12 hour consider it 0 if(hour == 12) hour = 0;

   31         //Whole clock face has 360 degrees and hence for each minute,

   32         //the minute hand must move 6 degrees in clockwise direction

   33         minuteHandAngle = minute * 6;

   34 

   35         //A hour hand moves 30 degrees in an hour.

   36         //Hence (hour * 30) gives us the number of degrees it moves.

   37         //Also, the hour hand must move 0-30 degrees in accordance with

   38         //the number of minutes the minute hand is showing.

   39         //the hour hand moves 0.5f degrees per minute.

   40         //Adjust hour angle accordingly.

   41         hourHandAngle = (hour * 30) + (minute * 0.5f) ;

   42         angle = Math.Abs(hourHandAngle - minuteHandAngle);

   43 

   44         //The degrees must always be within 180 degrees meaning

   45         //3:00 & 9:00 PM both show 90 degrees. if(angle > 180)

   46         angle = 360 - angle;

   47         return angle;

   48     }

   49 

   50     #endregion

   51 }