Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Рисуем n-угольную звезду, используя объект ImageDraw
Сегодня захватим сразу две подборки моего канала: Графику и Алгоритмы. Задача интересная. Здесь и алгоритмы и геометрия, ну и графика, конечно. Звезда, как известно состоит из лучей, их можно назвать внешними лучами и лучей вовнутрь звезды. В сущности это ломанная линия. А если это ломанная линия и если мы будем знать координаты всех вершин звезды, то мы построим эту ломанную линию, например с помощью метода ImageDraw.polygon().
И так, первое, что нужно для себя решить. Оси координат, которые поддерживает библиотека pillow имеют центр в левом верхнем угле. Ось X идёт вправо, ось Y идёт вниз. А строить звезду надо бы в середине холста и в обычной системе координат. Следовательно сразу нужно понять, что понадобиться преобразование координат. Если центр новой системы координат имеет координаты в старой (от pillow) x и y, то координаты в pillow (xp, yp) точки будут связаны с координатами точки в новой системе координат (xn, yn) следующим образом
xp = x + xn
yp = x - yn
Вот и всё. Ниже в программе мы используем эти формулы.
Теперь второе. Как как быть с внутренними и внешними вершинами звезды. Можно представить себе, что внешние вершины лежат на окружности с радиусом r1, внутренние вершина на окружности радиуса r2, т.е. r2 < r1. Значение длин радиусов на ваше усмотрение.
Внешние и внутренние вершины отстоят от соседних вершин на одинаковый угол, равный (2*ПИ) /n, где n количество вершин звезды. При этом внутренняя вершина отстоит от ближайшей внешней вершины на угол равный половине указанного выше угла (ПИ/n).
И вот теперь самое главное. Зная угол и радиус окружности мы легко вычислим координаты вершин звезды в новой системе координат (через радиус и тригонометрические функции), а потом преобразуем их в координаты системы координат pillow. Получив все координаты, мы составим из них список для метода ImageDraw.polygon().
Программа ниже запрашивает количество вершин звезды (больше 2) и создает картину star.png. Впрочем, для n=2 получится ромб, а для n=1 просто линия. Значение внешнего и внутреннего радиуса задаётся в программе, но вы всегда можете добавить ввод этих значений.
Примеры рисования звёзд см. ниже на рисунках 1 и 2.
Замечание
Лишний раз хотел бы отметить, что математика штука нужная и полезная. В нашем примере используется элементарная геометрия. Но не все программисты владеют даже такой. Стыдно за них, но в такое время живём.
Ну, пока всё!
Пишите свои предложения и замечания и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.