Как рассчитать угол между часовой и минутной стрелками?
Я пытаюсь решить эту проблему, но я все еще изо всех сил пытаюсь понять логику решения этой проблемы.
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 * минут.
умножьте часы на 60, что преобразует его в минуты. часа*60=минуты
-
теперь добавьте заданные минуты и преобразованные минуты.
заданные минуты + преобразованные мяты = всего минут
теперь разделите общее количество минут на 2, то есть найдите его среднее значение. общее количество минут / 2
теперь умножьте заданные минуты на 6. заданные минуты * 6
теперь вычесть пункт 3 из пункта 4.
С помощью этого метода вы получите точный ответ.
в следующем решении переменная m относится к минутам, а переменная h часов.
давайте разделим проблему на ее компоненты.
- найдите угол минутной стрелки от 12 часов.
- найти угол часовой стрелки от 12 часов.
- найти абсолютное значение их разности.
теперь давайте начнем решать каждый деталь.
- минутная стрелка делает полный цикл каждый час, или 60 минут. Таким образом, мы можем получить завершенный процент цикла минутной стрелки по
(m / 60)
. Поскольку есть 360 градусов, мы можем получить угол минутной стрелки от 12 часов(m / 60) * 360
. -
часовая стрелка делает полный цикл каждые 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
. -
теперь, когда у нас есть и угол минутной и часовой стрелки от 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