4. Методы, алгоритмы и форматы файлов компьютерной графики
Рассмотрим два возможных случая вычисления функции F.
Случай 1. Если функция Р на предыдущем шаге была отрицательна, т. е. значение Y не изменялось, то получим равенство
F(XP + 2,YP+ 1/2) = -2W(YP + 1/2 - Ya) + 2H(XP + 2-Xa).
Чтобы определить, насколько последнее равенство больше, чем F(XM, YM), вычтем из него равенство (4.1):
F(XP + 2,YP+ 1/2) = F(XM, YM) + 2H.
Случай 2. Если функция F на предыдущем шаге была положительна, т. е. значение У было увеличено на 1, то
F(XP + 2,YP + 3/2) = -2W(YP + 3/2- Ya) + 2H(XP + 2-Xa) = F(XM, YM)-2(W-H).
В каждом из случаев к исходному значению функции добавляется некоторая константа: 2Н, если мы не увеличивали Y, и -2(W~H) — если увеличивали.
Осталось определиться, с чего начинать процесс растеризации. Известно, что при X = Ха Y = Ya. Поэтому первый «экземпляр» средней точки М = (Ха + 1, Ya + 1/2) и тогда
F(X, Y) = -2W(Ya + 1/2 - Ya) + 2Н(Ха +l-Xa) = 2H-W.
Если бы мы предварительно не умножили функцию на 2, то результат был бы Н - 0,5W, что сделало бы невозможным использование целочисленных значений всех переменных.
Таким образом, перед началом процесса примем, что F - 2Н - W, X = Ха, Y = Ya. Затем на каждом шаге делаем следующее:
1)присвоим пикселу (X, Y) нужное значение цвета;
2)увеличим X на 1; если F < 0, то добавим к F значение 2Н; в противном случае увеличим Уна 1 и добавим к F значение -2(W- H).
При программировании этого алгоритма следует отдельно рассматривать горизонтальные и вертикальные прямые, так как они встречаются в двухмерной графике очень часто. Для этих прямых следует использовать упрощенные алгоритмы, например для горизонтальных прямых закрашивать сразу все биты вдоль строки развертки.
Второй фундаментальной задачей в этой группе алгоритмов является задача заполнения многоугольника заданными координатами его вершин, пикселами одинакового цвета. Простейший способ заполнения многоугольника, заданного координатами вершин, заключается в определении принадлежности пиксела внутренней части многоугольника — если принадлежит, то пиксел закрашивается. Определить принадлежность пиксела многоугольнику можно, например, подсчетом суммарного угла с вершиной на пикселе при обходе контура многоугольника.
Из рис. 4.31, а следует, что если пиксел внутри многоугольника, то суммарный угол будет равен АРВ + ВРС + CPD + DPE + ЕРА = 360°, а из рис. 4.31, б следует, что если пиксел вне многоугольника, то этот угол будет равен