Бложественная комедия:)
Бложественная комедия:)

2018

15

Ноября

ЗАДНИМ ЧИСЛОМ


Программируем стрелочные часы

Самый простой пример использования тригонометрии. Итак, мы хотим нарисовать на экране часы со стрелками, чтобы они показывали текущее время. Стрелки – это отрезки. Один конец отрезка находится в центре часов, другой показывает время.

Начнем с часовой стрелки. Чтобы вычислить, куда она должна показывать концом, рассчитаем угол, на который она поворачивается каждый час. Всего у нее 12 положений, а в круге 360⁰. Значит, один час равен 30⁰. Как же нам повернуть стрелку на 30⁰? Очень просто, надо задать координаты конца отрезка равными косинусу 30⁰ и синусу 30⁰. Мы получим стрелку, показывающую на 1 час. Чтобы показать 2 часа, нужно удвоить угол, то есть, берем косинус и синус угла 2*30⁰. Чтобы показать, допустим, 7 часов, берем угол 7*30⁰. Когда стрелка обошла круг, ей нужно снова показать на 12. Она туда показывает дважды в сутки, в 0 часов и в 12. А у нас в программе она будет показывать 0⁰ и 360⁰. А в 13 часов она покажет угол 390⁰. Можно на калькуляторе убедиться, что синус и косинус углов 30⁰ и 390⁰ те же самые. И стрелка будет показывать в том же направлении, то есть 390⁰ она изобразит, как 360⁰ + 30⁰, указав на 30⁰, и только мы с вами и наша программа будем в курсе, что стрелка показывает на 13*30 = 390⁰, а конечный пользователь увидит 1 час дня.

Тут у проницательного программиста возникнет недоумение: часовая стрелка обычных часов не перескакивает с одной цифры на другую, и в полвторого показывает на середину между 1 и 2. Это решается невероятно легко. Мы умножали количество полных часов на 30⁰, но нам ничто не мешает умножить на 30⁰ и количество неполных часов. Часовая стрелка в полвторого покажет на 1,5 * 30⁰ =  45⁰,  а в 10 минут третьего (десять минут – это одна шестая часа)– на (2 + 1/6) * 30⁰ = 65⁰. Таким образом, мы присваиваем координаты конца часовой стрелки в соответствии с количеством часов в данный момент с дробной частью.

Минутная стрелка задается не сильно сложнее. Тут возможны два варианта: либо взять количество минут с начала часа и умножить на 6⁰ (угол, на который стрелка поворачивается за одну минуту), либо взять количество часов, целую и дробную часть и умножить это число на 360⁰ (угол, на который минутная стрелка поворачивается за час). Таким образом, программа посчитает, допустим, 7 часов 31 минута – это 7 целых часов плюс половина часа плюс одна шестидесятая часа, то есть дробь 7 целых и 31/60, и умножит это дело на 360⁰, получив 2706⁰, возьмет от этого числа синус и косинус и точно расположит стрелку, где нужно.

Теперь секундная стрелка. Ее тоже можно разными способами рассчитать. Можно взять число секунд с начала минуты и умножить на 6⁰, можно взять число минут и умножить на 360⁰, а можно взять количество часов и умножить на 21600⁰, так как за час секундная стрелка делает 60 оборотов, а это как раз дает 60 * 360⁰ = 21600⁰.

В программе, конечно, все будет выглядеть по-другому. Обычно функция, типа ВРЕМЯ (в разных языках программирования она может называться по-разному, поэтому ничего страшного, что я ее по-русски назвал) выдает некое число, которое означает либо количество секунд, прошедшее с начала суток, либо количество миллисекунд. Это число может быть с дробной частью или целое. Чтобы правильно отобразить время на наших часах, мы должны выяснить, что за число эта функция выдает. Допустим, мы получаем количество миллисекунд с начала суток. Всего в сутках 86 400 000 миллисекунд. Часовая стрелка за это время поворачивается на два полных оборота, то есть, на 720⁰, минутная – на 24 оборота, то есть, на 8640⁰, а секундная – на 1440 оборотов, то есть, на 518400⁰. Нам все эти градусы не нужны. Мы присваиваем каждой стрелке атрибут – количество оборотов в сутки. Часовая стрелка заходит в нашу процедуру с атрибутом, равным 2, минутная – с 24, а секундная – с 1440. Процедура делит количество миллисекунд с начала суток на общее количество миллисекунд в сутках, полученную дробь делит на атрибут стрелки, обозначающий количество оборотов и получает количество оборотов в виде дроби, где целая часть – количество полных оборотов с начала суток, ее можно сразу отбросить, а дробная часть, умноженная на 360⁰, даст нам нужный угол.

Проверяем. Допустим, сейчас 14 часов, 15 минут и 27 секунд и 158 тысячных секунды. В миллисекундах это будет 51 327 158. Делим это страшное число на общее число миллисекунд в сутках, получаем 0,594064329. Часовая стрелка умножает это число на 2, получает 1,188, минутная умножает на 24, получает 14,258, секундная на 1440, получает 855,453. Отбрасываем целые части и умножаем на 360⁰. Целые части можно и не отбрасывать, на время выполнения программы это не повлияет, программа не будет отсчитывать целые круги, ей все равно нужны только синус и косинус. Получаем для часовой 67,73⁰, для минутной 92,72⁰, для секундной 162,95⁰. Считаем к этим углам синусы и косинусы, получаем соответственно 0,38 и 0,92, -0,05 и 0,99, -0,96 и 0,29. Это готовые координаты. Строим отрезки. Получаем:

clock2

Я для наглядности укоротил часовую стрелку и удлинил секундную.

26 июня 2013 в 14:15

3 комментария на «“Программируем стрелочные часы”»

  1. Sign specialis online overnightt secondhand use an interest and tremor sanctioned how for in in injections.

  2. This planned a various trial for the cialis for sale vancouver end style.

Добавить комментарий