Построение правильных многоугольников и неправильных звезд

Многоугольники и звезды

Скоро Новый Год! Давайте создавать уже праздничное настроение и запасаться шампанским! Самое время порисовать праздничные звезды )))

Правильный многоугольник

Правильный многоугольник — выпуклый многоугольник, у которого равны все стороны и все углы между смежными сторонами.

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

Рис.1. Правильный пятиугольник (шестиугольник, треугольник)

В рисовании многоугольника нет ничего сложного. Рассчитать координаты вершин многоугольника – вот достойная задача. Конечно, при подсчете учитываем угол смещения для стартового угла, потому что хотим вращать фигуру.

Расчет координат вершин многоугольника

[свернуть]

Самое сложное – посчитать координаты пересечения прямой и окружности. Этому посвящена целая статья. В модуле xIPTrig находится нужная фукнция:

Найти координату точки на эллипсе по углу

[свернуть]

Ниже описание используемых типов. Вместо TxPoint вполне можно использовать TPointF. Как и для других используемых типов есть аналоги в современных версиях Delphi. Но они настолько совпадают, что приведение одного к другому ни сложностей, ни вопросов у компилятора не вызывает.

Используемые типы

[свернуть]

Правильная звезда

Давайте поместим внутрь построенного многоугольника еще один, меньший по размерам и повернутый на половину угла, полученного от деления 360 градусов на число вершин. Иными словами, половину угла между смежными вершинами. И последовательно соединим все получившиеся вершины.

Получается вполне себе симпатичная звезда.

Рис.2. Правильная пятиконечная звезда

Найдем массив вершин для правильной звезды:

Расчет координат вершин правильной звезды

[свернуть]

Играя с размером внутреннего эллипса и количеством вершин, можно получить разные симпатичные фигуры.

Рис.3. Правильные новогодние звезды

Для таких по новогоднему красивых звезд используем GDI+. А вернее TxIPCanvas, который реализован в рамках GDIPCanvas (включен в состав демонстрационного проекта). Мы просто инициализируем текстурную кисть, а заливка происходит как ни в чем не бывало – текущей кистью. Если это просто цвет, значит просто цвет. Если картинка, зальет картинкой.

Инициализация текстурной кисти GDI+

[свернуть]

Правильная «брутальная» звезда

Именно «брутальные» звезды красуются на китайском флаге и флаге США. Именно такая звезда является символом армии РФ. Звезда, которая строится без всяких там внутренних эллипсов. Строится на пересечении линий, связывающих вершины. Строгая геометрия. Прямая и брутальная, как Джейсон Стэтхэм.

Рис.4. Правильная звезда имени Стэтхэма

Теперь надо разобраться, что с чем пересекается. Смотрим на рис.4. Координата P0 получается как пересечение линий (V0, V2) и (V1,V4). Обобщая, можем записать так:

Latex formula

Где F – функция нахождения пересечения векторов, заданных двумя точками. Теме пересечения прямых посвящена целая статья. Функция расчета координаты пересечения, как обычно, находится в модуле xIPTrig.

Посчитать координаты вершин правильной "брутальной" звезды

[свернуть]

Сама функция из модуля xIPTrig:

Пересечения прямых (p1,p2) и (p3,p4)

[свернуть]

Неправильные звезды

Вернемся к звездам небрутальным, праздничным. У нас есть параметр смещения внутри угла между смежными вершинами. Ему совсем не обязательно делить угол пополам. Зададим другое значение, скажем, 90%. Получилась какая-то робкая звезда диско.

Рис.5. Неправильная робкая звезда диско

Если откажемся от полигонов в пользу кривых, получаем еще более интересные эффекты. В GDI+ это функция Curve. Существует исключительно для ленивцев, которым невмоготу считать направляющие кривых Безье. Параметр Tension (0..1) определяет «натяжение» струны кривой. Это лучше поэкспериментировать, так словами и не объяснишь.

Рис.6. Эволюция праздника…
Рис.7. Звезда-ромб. Ковер-самолет
Рис.8. Равнобедренный треугольник. Звезда-бумеранг
Рис.9. «Брутальная» звезда ромб-бабочка или цветочек
Рис.10. Хочется верить, что солнышко…

Хотя, конечно, больше смахивает на бактерию, которая появляется в новогоднем оставшемся оливье.

Рисование

Чуть не забыл про сами функции рисования. Алгоритм простой. Вначале находим массивы координат вершин. Функции для этого все указаны выше. Затем рисуем одним из методов – Polygon или Curve. Для Curve есть дополнительный параметр «натяжения» струны. Если этот параметр равен 0.0, то выглядеть будет так, будто применили Polygon вместо Curve.

 Все функции используют текущие настройки ACanvas. Т.е. цвет, толщину линий, кисть нужно настроить до вызова функции. Также, нет подсчета квадрата. Это уже дело программиста, что передавать – заранее посчитанный квадрат, либо эллипс. В случае эллипса (не круга), ни многоугольник, ни звезда правильными не будут. Но мало ли какие художественные замыслы у автора.

Параметры функций повторяют параметры при подсчете координат вершин, поэтому расписывать не стал.

Рисуем многоугольник

[свернуть]
Рисуем звезду через Polygon

[свернуть]
Рисуем звезду через Curve

[свернуть]
Рисуем "брутальную" звезду через Curve

[свернуть]

В интерфейсе проекта есть галочка «Rotate Image». Ее наличие указывает, что надо повернуть текстуру на угол поворота всей фигуры. Но особенности реализации не позволяют «намертво» прилепить текстуру к повороту фигуры, зато смотрится весьма динамично.

Если использовать «бесшовную» текстуру и делать смещение по её центру, то поворот будет идеален. Однако, для настоящего поворота любой фигуры, надо использовать поворот всего «мирового пространства». Разговор об этом обязательно состоится, очень интересная тема.

Интерфейс демонстрационного проекта

Друзья, спасибо за внимание!

С наступающим Новым Годом!!!

Информация о новых статьях смотрим в телеграм-канале.

Не забываем комментировать и подписываться )))


Скачать (1.24 Мб): Исходники (Delphi XE 7-10)

Скачать (2.02 Мб): Исполняемый файл


5 5 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Иван
Иван
9 месяцев назад

Весьма позитивно. За прогу спасибо

2
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x