Любитель создал часы для отслеживания сортировки мусора

от автора

Энтузиаст Джон Грэм-Камминг представил часы, которые помогают понять, когда и какие отходы нужно готовить к утилизации. 

Автор разработки отмечает, что иногда сложно запомнить дни, когда нужно выбрасывать пластик, металл, бумагу и стекло. Ранее разработчики уже предлагали свои решения проблемы, как, например, это сделал Даррен Тарбард, выпустивший устройство «Bindicator». Оно показывает, какой мусор пора выносить, с помощью разных цветовых индикаторов.

Грэм-Камминг решил предложить свою разработку, но сделать её менее технологичной. Он разработал циферблат часов, используя дешёвые часовые механизмы. В нём есть стрелка, которая совершает оборот за семь дней.

Затем он написал код для создания SVG (а также PDF и PNG) для циферблата. Цвета и текст определяются переменными schd и bins. Код должен легко настраиваться, он поддерживает до двух разных типов мусорных баков в день. 

 bins = {         "none": ["white", ""],         "lixo": ["#72859E", "Lixo"],         "papl": ["#255FC9", "Papel"],         "embl": ["#DED044", "Embalagens"],     }      days = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"]     schd = [["none"],             ["lixo"],             ["papl", "embl"],             ["lixo"],             ["papl"],             ["lixo", "embl"],             ["papl"]]

Единственный интересный фрагмент кода — это генерация кривых для семи ежедневных сегментов. Для этого есть функция path:

def getXY(p, r, s):         a = 2.0 * math.pi * (p * pps + rot)         return s % (r * math.cos(a),                     r * math.sin(a))      def path(p, r):         s = " %.2f %.2f "         pa = "M"         pa += getXY(p, r, s)         pa += "A %.2f %.2f 0 0 1" % (r, r)         pa += getXY((p+1), r, s)         return pa

Функция принимает два параметра: p — число от нуля до шести, представляющее семь дневных сегментов, необходимых на часах; r — радиус дуги. Функция использует getXY для поиска положения точки на дуге. Она делает это дважды, чтобы найти начальную и конечную точки.

Таким образом, path в конечном итоге возвращает что-то вроде M x0 y0 A r r 0 0 1 x1 y1, где x0, y0, x1, y1 — вычисленные конечные точки дуги, а r — радиус дуги. M x0 y0 означает «перейти к (x0, y0)». A r r 0 0 1 x1 y1 означает «нарисовать дугу радиусом r до точки (x1, y1)». 0 0 1 в середине соответствуют трём параметрам: вращение вокруг оси x, флаг большой дуги и флаг развёртки.

Последняя часть элемента SVG path, L 0 0, добавляется в другом месте кода. Она устанавливает центр дуги в (0, 0). Энтузиаст использовал атрибут viewBox SVG, чтобы геометрия SVG находилась между (-1, -1) и (1, 1), таким образом создавая центр изображения (0, 0).

print('<svg xmlns="http://www.w3.org/2000/svg" viewBox="-1 -1 2 2" width="%s" height="%s">' % (wh, wh))

Циферблат встроен в обычную деревянную рамку для картины.

Часы работают от батарейки.


ссылка на оригинал статьи https://habr.com/ru/articles/846810/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *