Как рассчитать угол между часовой и минутной стрелками?

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

hour degree = 360 / 12 = 30
minutes degree = 360 / 12 / 60 = 0.5

Итак, согласно этому, я думал, что могу сформулировать следующую функцию в python:

def clockangles(hour, min):
    return (hour * 30) + (min * 0.5)

в течение часа он работает нормально, поскольку он, похоже, имеет отображение 1=1. Но на данный момент есть, по крайней мере, одна проблема. Когда это 0 минут, минутная стрелка указывает на 12.

например:

7pm: руки, указывающие на 7 вечера, и минуты указывает на 12

Как правильно рассчитать минуты? Пожалуйста, помогите мне понять формулу.

EDIT: например, если я вызываю функцию выше с 7pm, e.g clockangles (7,0) я получаю значение 210. Однако, согласно этой ссылке угол в 7:00 составляет 150

9 ответов


ОК. Вы пытаетесь найти угол между двумя руками. Потом это:

minutes degree = 360 / 12 / 60 = 0.5

это просто количество градусов час рука движется в минуту. Подумайте об этом-минутная стрелка перемещается на 360 каждый час. Поэтому в полной революции всего 60 минут. 360/60 = 6 градусов в минуту для минутной стрелки.

Итак, вам нужно найти разницу между часовой и минутной стрелкой. Таким образом, функция теперь выглядит например:

def clockangles(hour, minute):
    return (hour * 30 + minute * 0.5) - (minute * 6)

теперь, это действительно, так что мы могли бы остановиться здесь. Однако я должен объяснить, что это может дать как ответы больше 180 градусов, так и отрицательные углы. Если вы не хотите этих вещей (и из ваших комментариев кажется, что вы этого не хотите), исправьте их.

def clockangles(hour, minute):
    return abs((hour * 30 + minute * 0.5) - (minute * 6))

теперь никаких отрицательных углов.

def clockangles(hour, minute):
    ans = abs((hour * 30 + minute * 0.5) - (minute * 6))
    return min(360-ans,ans)

теперь, короткий из двух углов, образованных путем измерения по часовой стрелке и против часовой стрелки.


это не так уж сложно, если подумать. Давайте сначала рассмотрим каждую руку отдельно. Минутная стрелка часов вращается на 360 градусов за 60 минут, поэтому каждая минута составляет 6 градусов. Часовая стрелка часов вращается на 360 градусов за 12 часов, поэтому мы знаем, что она перемещается в общей сложности на 30 градусов после каждого часа, но вам нужно учитывать продвижение часовой стрелки между часами. т. е. в 3:30 минутная стрелка находится на 6, а часовая стрелка прошла мимо 3. Мы можем рассчитайте это продвижение просто (минут / 60) * 30 градусов, что эквивалентно минутам/2. Поэтому, как только мы узнаем степени каждой руки, мы просто находим разницу. И формула будет как

 degrees = Math.Abs(((hour*30.0 + minute/2.0) - minute*6.0) % 360)

используйте алгоритм:

1.Минутный угол = 360 * минут / 60

2.Часовой угол = [ 360 * (час % 12) / 12 ] + [ 360 * (минуты / 60) * (1 / 12) ]

3.Угол между часом и минутой = (часовой угол - минутный угол) % 360

этой уменьшается to 30 * ч - 5.5 * минут.


  1. умножьте часы на 60, что преобразует его в минуты. часа*60=минуты

  2. теперь добавьте заданные минуты и преобразованные минуты.

    заданные минуты + преобразованные мяты = всего минут

  3. теперь разделите общее количество минут на 2, то есть найдите его среднее значение. общее количество минут / 2

  4. теперь умножьте заданные минуты на 6. заданные минуты * 6

  5. теперь вычесть пункт 3 из пункта 4.

С помощью этого метода вы получите точный ответ.


в следующем решении переменная m относится к минутам, а переменная h часов.

давайте разделим проблему на ее компоненты.

  1. найдите угол минутной стрелки от 12 часов.
  2. найти угол часовой стрелки от 12 часов.
  3. найти абсолютное значение их разности.

теперь давайте начнем решать каждый деталь.

  1. минутная стрелка делает полный цикл каждый час, или 60 минут. Таким образом, мы можем получить завершенный процент цикла минутной стрелки по (m / 60). Поскольку есть 360 градусов, мы можем получить угол минутной стрелки от 12 часов (m / 60) * 360.
  2. часовая стрелка делает полный цикл каждые 12 часов. Поскольку в сутках 24 часа, нам нужно нормализовать час до 12 часов. Это достигается (h % 12), которым возвращает оставшуюся часть значения часа, деленную на 12.

    теперь, когда минутная стрелка делает свой цикл, часовая стрелка не просто остается на точном значении (h % 12). На самом деле, он перемещается на 30 градусов между (h % 12) и (h % 12) + 1. Количество, на которое часовая стрелка отклоняется от (h % 12) можно рассчитать, добавив в (h % 12) завершенный процент цикла минутной стрелки, который является (m / 60). В целом, это дает нам (h % 12) + (m / 60).

    теперь у нас есть точные положение часовой стрелки, нам нужно получить завершенный процент цикла часовой стрелки, который мы можем получить по ((h % 12) + (m / 60)) / 12. Поскольку есть 360 градусов, мы можем получить угол часовой стрелки от 12 часов (((h % 12) + (m / 60)) / 12) * 360.

  3. теперь, когда у нас есть и угол минутной и часовой стрелки от 12 часов, нам просто нужно найти разницу между двумя значениями и взять абсолютное значение (так как разница может быть отрицательной).

    так в целом, у нас есть abs(((((h % 12) + (m / 60)) / 12) - (m / 60)) * 360).

Ниже приведена функция python, которая вычисляет это значение. Он вернет любое значение угла, которое является самым коротким.

def find_angle(h, m):
    if abs(((((m/60)+(h%12))/12)-(m/60))*360) > 180:
        return 360 - abs(((((h % 12) + (m / 60)) / 12) - (m / 60)) * 360)
    return abs(((((h % 12) + (m / 60)) / 12) - (m / 60)) * 360)

Я работал над этой проблемой и создали уравнение:

(hr*30)+(min/2)-(min*6) 

или

(min*6)-(hr*30)-(min/2) 

h = int(input())
m = int(input())
angle = float(abs(11 /2 * m - 30 * h))
print(" {}:{} makes the following angle {}°".format(h, m, angle))

Примечание :

60min = 360deg

1min = 6deg

например:- рассматривайте время как 2:20 (т. е. 2ч 20мин)

abs ((2ч*5) мин - (20)мин) = 10мин

angle_1 = 10min x 6deg = 60deg

angle_2 = 360deg-60deg = 300deg (означает угол с другой стороны)

таким образом, из двух углов angle_1 мал.

следовательно, min_angle = 60 град

def min_angle_bet_hr_min(hr, min):

    angle_1 = (hr*5 - min)*6
    angle_2 = 360 - angle_1

    if angle_1 < angle_2:
        min_angle = angle_1
    elif angle_1 > angle_2:
        min_angle = angle_2
    else:
        min_angle = 0

    return abs(min_angle)

  def clock_angle(time):
    constH = 360 / 12
    constM = 360 / 60
    if ":" in time:
        clock = time.split(":")
        c1 = int(clock[0])
        c2 = int(clock[1])
        if c1 >= 12:
            c1 -= 12
        rc1 = c1*constH + constH*(c2/60)
        rc2 = c2*constM
        if rc1 > rc2:
            result = (rc1-rc2)
            angle2 = 360-rc1+rc2
        else:
            result = (rc2-rc1)
            angle2 = 360-rc2+rc1
        if angle2 < result:
            result = angle2
        return result
    return 0