Найти в Дзене

Программирование на языке Python. Библиотека pillow, класс ImageDraw. Пример алгоритма рисования n-угольной звезды

Доброго времени суток, читатели, зрители моего канала 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 просто линия. Значение внешнего и внутреннего радиуса задаётся в программе, но вы всегда можете добавить ввод этих значений.

Текст программы см. ниже
Текст программы см. ниже
primer200.py

Примеры рисования звёзд см. ниже на рисунках 1 и 2.

Рисунок 1. Пятиконечная звезда
Рисунок 1. Пятиконечная звезда
Рисунок 2. 27-конечная звезда
Рисунок 2. 27-конечная звезда

Замечание
Лишний раз хотел бы отметить, что математика штука нужная и полезная. В нашем примере используется элементарная геометрия. Но не все программисты владеют даже такой. Стыдно за них, но в такое время живём.

Графика на Python | programmer's notes (python and more) | Дзен

Ну, пока всё!

Пишите свои предложения и замечания и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Программируете вы хорошо, а дизайнер из вас никакой
Программируете вы хорошо, а дизайнер из вас никакой