Найти угол между часовой и минутной стрелками в аналоговых часах - PullRequest
33 голосов
/ 01 мая 2010

Мне недавно задали этот вопрос:

Учитывая 12-часовые аналоговые часы, рассчитайте в градусах меньший угол между часовой и минутной стрелками. Будьте как можно точнее.

Мне интересно, какой самый простой, самый читаемый, самый точный алгоритм. Решение на любом языке приветствуется (но объясните это немного, если считаете, что это необходимо).

Ответы [ 9 ]

42 голосов
/ 01 мая 2010

Оказывается, у Википедии лучший ответ:

// h = 1..12, m = 0..59
static double angle(int h, int m) {
    double hAngle = 0.5D * (h * 60 + m);
    double mAngle = 6 * m;
    double angle = Math.abs(hAngle - mAngle);
    angle = Math.min(angle, 360 - angle);
    return angle;
}

В основном:

  • Часовая стрелка движется со скоростью 0.5 градусов в минуту
  • Минутная стрелка движется со скоростью 6 градусов в минуту

Проблема решена.


И точность не имеет значения, потому что дробная часть равна либо .0, либо .5, а в диапазоне 0..360 все эти значения точно представлены в double.

8 голосов
/ 09 марта 2012

Для нахождения угла между стрелками часов есть,

30 * [HRS - (MIN/5)] + (MIN/2) 
5 голосов
/ 01 декабря 2011

Java-код, что полигенубриканты похожи на мой. Давайте предположим, что часы - 12 часов вместо 24.

Если это 24 часа, тогда это другая история. Также, еще одно предположение, предположим, остановились ли часы, пока мы вычисляем это.

Один тактовый цикл составляет 360 градусов.

  1. Сколько градусов может запускать минутная стрелка в минуту? 360/60 = 6 градусов в минуту.

  2. Сколько градусов может работать часовая стрелка в час? 360/12 = 30 градусов в час (поскольку часовая стрелка работает медленнее, чем минута)

Так как в единицах "минуты" легче вычислить, давайте получим

«На сколько градусов может работать часовая стрелка в минуту»?

30/60 = 0,5 градуса в минуту.

Итак, если вы знаете, как получить эти числа, проблема в значительной степени решена с помощью решения.

1 голос
/ 10 августа 2017
    **php code for find angle via time (minutes and hour's)**

    echo calcAngle(3,70);

function calcAngle($h, $m)
{
    // validate the input
    if ($h <0 || $m < 0 || $h >12 || $m > 60)
      {
       return "Wrong input";
      }
      else {

    if ($h == 12) $h = 0;
    if ($m == 60) $m = 0;

    $hour_angle = 0.5 * ($h*60 + $m);
    $minute_angle = 6*$m;
    $angle = abs($hour_angle - $minute_angle);
    $angle = min(360-$angle, $angle);

    return $angle;
}
}
1 голос
/ 02 октября 2015

Минутный угол (от 12 часов) : 360 * минут / 60

Часовой угол (от 12 часов) : 360 * (час% 12) / 12 + 360 * (минут / 60) * (1/12)

Угол между часами и минутами : (часовой угол - минутный угол)% 360 По простой арифметике это сокращает до 30 * часов - 5,5 * минут.

1 голос
/ 16 августа 2013

Попробуйте этот код:

import java.util.Scanner;

class Clock{

    public static void main(String args[]){
        int hours,mins;

    System.out.println("Enter the Time(hours) : ");
        Scanner dx = new Scanner(System.in);
        hours = dx.nextInt();

    System.out.println("Enter the time(mins) : ");
        Scanner fx = new Scanner(System.in);
        mins = fx.nextInt();

    if(hours>=0 && hours<=12){

        if(mins>=0 && mins<=59){
            double hDegrees = (hours * 30) + (mins * 0.5);
                    double mDegrees = mins * 6;
                    double diff  = Math.abs(hDegrees - mDegrees);

        System.out.println("The angle between sticks is (degrees) : "+diff);
                if (diff > 180){ 

                diff = 360 - diff;
        System.out.println("The angle between sticks is (degrees) : "+diff);
                }

        }

    }

    else{
        System.out.println("Wrong input ");
    }


}

}
0 голосов
/ 31 мая 2017

Это одно решение (C #). Это очень простое решение, которое игнорирует точность. Надеюсь, что решение само за себя.

public static double GetAngle(int hourHand, int minuteHand)
    {
        double oneMinuteAngle = (360 / 60);
        double oneHourAngle = (360 / 12);

        double hourAngle = oneHourAngle * hourHand;
        double minuteAngle = oneMinuteAngle * minuteHand;

        return (Math.Abs(hourAngle - minuteAngle));
    }
0 голосов
/ 09 марта 2014

для нахождения угла между часовой стрелкой и минутной стрелкой

angle=(hour*5-min)*6
0 голосов
/ 01 мая 2010

Не знаю, правда ли, что-то вроде этого?

//m*360/60 - (h*360/24)+(m*360/(24*60)) ->
t = abs(25*m - 60*h)/4
t = min(t,360-t)
...