Добавил:
sergeevpavel0406@mail.ru СОВА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика в техническом университете / Информатика в техническом университете. Компьютерная графика

.pdf
Скачиваний:
88
Добавлен:
06.03.2018
Размер:
6.96 Mб
Скачать

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, б следует, что если пиксел вне многоугольника, то этот угол будет равен

308

4.1. Методы и алгоритмы двухмерной компьютерной графики

 

 

 

D

А

Е

А

Е

 

а

 

б

Рис. 4.31. Определение принадлежности пиксела: а — внутри многоугольника; б — вне многоугольника

DPE + ЕРС + СРА + АРВ - BPD = О, поскольку угол BPD отсчитывается в противоположном направлении по отношению к другим углам и равен их сумме.

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

Алгоритм построчного заполнения многоугольника. Более эффективны алгоритмы построчного заполнения. Предположим, что область, подлежащая заполнению, представляет собой многоугольник, заданный совокупностью пикселов Pt - (Xj, Y{), которые определяют вершины многоугольника. На рис. 4.32 приведен пример для многоугольника, заданного пятью вершинами.

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

На рис. 4.32 строка развертки при Y = 3 пересекает четыре ребра — Е5, £4, Еъ, Е2. Четыре абсциссы точек пересечения округляются до ближайшего целого и сортируются, в результате получается последовательность координат по X за-

крашиваемых пикселов — 1, 2, 7, 9. Затем закра-

 

шиваются следующие серии пикселов: первая от

 

столбца 1 до столбца 2 и вторая от столбца 7 до

 

столбца 9. При группировании отсортированных

 

пересечений ребер в пары используется тест — на-

 

ходится внутри или снаружи. В процессе движения

 

вдоль строки развертки пикселов мы при каждом

 

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

 

или наружу от него, причем это состояние все вре-

1 -

мя меняется. Пребывание внутри многоугольника

 

называют четностью. При этом можно говорить об

О 1 2 3 4 5 6 7 8 Л :

изменении четности при каждом пересечении. Если

Рис. 4.32. Заполнение области

мы попадаем внутрь многоугольника, то эта нечет-

внутри многоугольника

309

4. Методы, алгоритмы и форматы файлов компьютерной графики

ная последовательность пикселов будет закрашиваться; если попадаем наружу многоугольника, то четная последовательность не закрашивается. Если многоугольник целиком лежит по правую сторону от начала каждой строки развертки пикселов, то будет нечетная последовательность пикселов.

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

Часто бывает, что строка развертки проходит точно через угловую точку многоугольника. Для обеспечения правильного изменения четности это принимается за пересечение. В действительности существует много различных случаев и в программе потребуется реализовать сложный набор правил.

Практические алгоритмы основаны также на том, что соседние пикселы в строке скорее всего одинаковые и меняются только там, где строка пересекается с ребром многоугольника. Это называется когерентностью растровых строк. При этом достаточно определить координаты X пересечений строк сканирования с ребрами многоугольника. Пары отсортированных точек пересечения зададут интервалы закрашивания пикселов. Кроме того, если какие-либо ребра пересекались г-й строкой, то они скорее всего будут пересекаться также и строкой /+1. Это называется когерентностью ребер. При переходе к новой строке легко вычислить новую координату X точки пересечения ребра, используя координату X старой точки пересечения и тангенс угла наклона ребра:

 

 

 

Х 1

X

X

 

 

 

 

тх

i

 

 

 

 

 

 

 

 

тх — тангенс угла наклона ребра, тх = dYldX, так как

 

 

 

dy= 1, то l/mx = dX.

 

 

 

 

 

Смена числа интервалов закрашивания пикселов про-

 

 

 

исходит только тогда, когда в строке сканирования

 

 

 

появляется вершина.

 

 

Рис. 4.33. Заполнение

Учет когерентности строк и ребер позволяет построить

области с учетом при-

различные высокоэффективные

алгоритмы построчного

 

 

мыкания:

сканирования для заполнения многоугольников. Для увели-

.

ценТр отображав-

чения эффективности любого алгоритма следует найти ту

 

 

мого пиксела

его часть, которая отнимает больше всего времени. В дан-

310

4.1. Методы и алгоритмы двухмерной компьютерной графики

ном случае это большой объем вычислений, связанных с растром пересечений строк развертки с ребрами. Для снижения этих затрат времени следует построить и ввести простой список активных ребер, в результате чего можно быстро определять точки пересечений. Этот список позволяет алгоритму использовать когерентность ребер. Для каждой строки сканирования рассматриваются только те ребра, которые пересекают строку. При переходе к следующей строке для пересекаемых ребер пересчитываются координаты X пересечений. При появлении в строке сканирования вершин выполняется перестройка списка активных ребер. Ребра, которые перестали пересекаться, удаляются из списка, а все новые ребра, пересекаемые строкой, заносятся в него.

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

1)подготовить служебные целочисленные массивы Y координат вершин и номеров вершин;

2)совместно отсортировать координаты Y по возрастанию и массив номеров вершин для того, чтобы можно было определить исходный номер вершины;

3)определить пределы заполнения по оси Y — Y_min и F_max. Стартуя с текущим значением У_тек = F_min, исполнять пп. 4-9 до завершения закрашивания области;

4)определить число вершин, расположенных на строке У_тек — текущей строке сканирования;

5)если вершины есть, то для каждой из вершин дополнить список активных ребер, используя информацию о соседних вершинах;

6)для каждого ребра в список активных ребер заносятся:

-максимальное значение координаты Y ребра,

-приращение координаты X при увеличении Y на 1,

-начальное значение координаты X.

7)если обнаруживаются горизонтальные ребра, то они просто закрашиваются и информация о них в список активных ребер не заносится;

8)если после этого обнаруживается, что список активных ребер пуст, то закрашивание заканчивается;

9)по списку активных ребер определяется У_след — координата Y ближайшей вершины (вплоть до У_след можно не заботиться о модификации списка активных ребер, а только менять координаты X пересечений строки сканирования с активными ребрами).

Вцикле от У_тек до 7_след для каждой координаты Y:

выбрать из списка активных ребер и отсортировать координаты X пересечений активных ребер со строкой сканирования;

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

перевычислить координаты пересечений для следующей строки сканиро-

вания;

проверить, не достигли ли максимальной координаты Y. Если достигли, то заполнение области закончено, иначе выполнить п. 4;

311

4.1. Методы и алгоритмы двухмерной компьютерной графики

Рис. 4.34. Закрашивание 4-связной области:

а — порядок перебора соседних пикселов; б — порядок закраски; • — начальный пиксел; х— центр отображаемого пиксела

села. Более экономичным является построчный алгоритм заливки, который использует пространственную когерентность:

пикселы в строке меняются только на границах;

при перемещении к следующей строке размер закрашиваемой строки скорее всего или не изменяется, или меняется на один пиксел.

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

Последовательность работы алгоритма для гранично определенной области следующая:

1) координата затравки помещается в стек, затем до исчерпания стека выполняются пп. 2-4;

2)координата очередной затравки извлекается из стека и выполняется максимально возможное закрашивание вправо и влево по строке с затравкой, т. е. пока не попадется граничный пиксел. Пусть это Хлев и Хправ соответственно;

3)анализируется строка ниже закрашиваемой в пределах от Хлев до Хправ и в ней находятся крайние правые пикселы всех незакрашенных фрагментов. Их координаты заносятся в стек;

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

эффекта (например, при растеризации линий с наклоном, не равным 90° и 0 на рис. 4.28), связано с дискретной природой пикселов. На рис. 4.35 показан пример растеризации черного прямоугольника при условии, что каждый пиксел имеет только два значения яркости — черный и белый. Подобные примеры

Рис. 4.35. Ступенчатость прямоугольника

313