Энтузиаст Джон Грэм-Камминг представил часы, которые помогают понять, когда и какие отходы нужно готовить к утилизации.
Автор разработки отмечает, что иногда сложно запомнить дни, когда нужно выбрасывать пластик, металл, бумагу и стекло. Ранее разработчики уже предлагали свои решения проблемы, как, например, это сделал Даррен Тарбард, выпустивший устройство «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/
Добавить комментарий