Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Практика 03. Закрашивание граней

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

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

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

Очевидно, что закрашивать треугольник гораздо проще, чем четырёхугольник – в этом случае не нужно учитывать порядок вершин друг относительно друга (это приводит к огромному количеству ветвлений в коде, что, в свою очередь – к ошибкам).

Четырёхугольники, отличающиеся порядком вершин.

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

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

Задача 1. Закрашивание треугольника

Суть метода заключается в обычном закрашивании горизонтальными отрезками:

НЕ нашли? Не то? Что вы ищете?

Начало и конец отрезка легко вычислить, исходя из уравнения прямой по двум точкам. Однако тут возникает проблема:

Концы первого отрезка находятся, исходя из уравнений прямых ACи AB, а второго – ACи BC. Таким образом, нам нужно знать, какие стороны треугольника пересекает отрезок, который мы хотим нарисовать. Легко заметить, что выше вершины В отрезок пересекает стороны ACи AB, а ниже – ACи BC. Поэтому, можно сначала закрасить часть треугольника от вершины Aдо уровня В, а затем – часть от вершины Cдо уровня B.

Таким образом, суть алгоритма в следующем:

1.  отсортировать массив точек по координате Y. После этого вершина Aбудет первым элементом, B–вторым, С – третьим;

2.  закрасить верхнюю часть треугольника от YAдо YB линиями;

3.  закрасить нижнюю часть треугольника от YCдо YBлиниями.

Метод рисования прямой у вас уже есть (вы ведь уже рисовали рёбра), так что осталось только определить координаты начала и конца отрезка. Если точка (X, Y) лежит на прямой AB, то . Эта формула получается из уравнения прямой по двум точкам. Будьте готовы ответить, каким образом.

В результате у вас должен получиться закрашенный кубик:

P. SСоздайте группу переключателей, с помощью которых можно выбрать, каким методом закрашивать.

Для закрашивания куба этого метода достаточно. Однако вскоре вам предстоит ИДЗ (произвольная фигура). Вы, конечно, можете разрезать каждую грань на треугольники вручную, но разумнее использовать более общий метод.

Задача 2. Закрашивание произвольного полигона

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

Алгоритм представляет собой цикл вдоль оси oY, в ходе которого выполняется поиск точек пересечения линии контура с соответствующей горизонталью (это закрашивание горизонталями напоминает предыдущий алгоритм). Алгоритм называется XY.

Алгоритм заключается в следующем:

1.  Находим верхнюю и нижнюю границы закраски (Ymaxи Ymin)

2.  Затем, в цикле от нижней до верхней границы выполняем:

a.  Находим точки пересечения текущей горизонтали со всеми отрезками контура нашего полигона (если таковые имеются) и заполняем ими, например, массив x;

b.  Сортируем по возрастанию массив x:

c.  Выводим на экран горизонтальные линии

(x0, y) – (x1,y)

(x2, y) – (x3, y)

(xn-1, y) – (xn, y)

Этот алгоритм использует свойство топологии контура полигона – любая прямая пересекает контур чётное количество раз. Таким образом, точки пересечения всегда можно разбить на пары. Для выпуклых фигур (например, грани куба) точек пересечения всегда две.

Отдельно следует отметить случай, когда горизонталь проходит через вершину, касаясьеё. В этом случае вершину в массив записывать не следует, т. к. тогда испортится весь порядок вершин (иной способ – записать её в массив два раза, однако в данном случае эти действия излишни).

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