Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CG_lk.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.22 Mб
Скачать

2.4.5 Отсечение примитивов вывода

Видовая операция «окно» производит операцию отсечения точек, линий, цепочек литер для типичного вертикального прямоугольного окна ( Рис. 2. 22 ). Точка А находится внутри окна и поэтому она отображается внутри поля вывода на видовой поверхности. Точка В находится вне окна и поэтому она не изображается. Отрезок прямой EF изображается полностью, отрезки GH и IJ изображаются частично (отсекаются), а CD и KL не изображаются совсем. Отметим, что точки и отрезки, находящиеся на границе окна, считаются внутренними и поэтому отображаются.

Рис. 2. 22 Двумерное отсечение

Отсечение точек. Отсечение точек осуществляется достаточно просто. Если xmax и xmin , ymax и ymin - координаты границ окна, то для того чтобы точка была видимой, должны выполняться неравенства:

xmin x xmax , ymin y ymax

Если хотя бы одно из этих неравенств неверно, точка не отображается.

Отсечение отрезков

Отсечение отрезков прямых требует большего числа вычислений, чем отсечение точек. Конечно как и в предыдущих преобразованиях достаточно рассмотреть конечные точки отрезка, не принимая во внимание бесконечное количество внутренних точек. Прежде всего можно быстро разобраться с классом отрезков, обе конечные точки которых лежат внутри окна (отрезок EF на Рис. 2. 22). Такие отрезки целиком находятся внутри окна и, следовательно, могут быть приняты целиком. Отрезки, одна конечная точка которых находится внутри окна, а другая вне его, требует операции отсечения (отрезок GH на Рис. 2.22). Отрезки, обе конечные точки которых находятся вне окна, необходимо проверить по границам окна, чтобы выявит возможное пересечение с окном: при обнаружении пересечения необходимо отсечение (см. отрезки CD, IJ, KL).

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

x = x1 + t( x2 - x1),

y = y1 + t( y2 - y1).

Для t из диапазона (0, 1) эти уравнения определяют точки (x, y), находящиеся на ориентированном отрезке прямой, начинающемся в точке (x1, y1) и заканчивающемся в точке (x2, , y2). В данном случае для нахождения точки пересечения необходимо решить систему уравнений относительно tсторона и tотрезок. Если найденные значения

tсторона и tотрезок лежат в диапазоне (0, 1), точка пересечения находится внутри проверяемого отрезка и внутри стороны окна и, следовательно, отрезок пересекается с окном. До решения системы уравнений специальной проверкой необходимо исключит случай, когда прямые параллельны сторонам окна.

Эффективность системы отсечения приобретает особое значение в анимационных системах графики, когда сотни и тысячи отрезков должны отсекаться с высокой скоростью для плавного перехода от одного кадра к другому. Одним из наиболее эффективных алгоритмов отсечения является алгоритм Коэна-Сазерленда.

Алгоритм Коэна-Сазерленда

Алгоритм отсечения Коэна-Сазерленда позволяет быстро выявит отрезки, которые могут быть отвергнуты или приняты целиком, при этом используется проверки области расположения отрезков. Вычисления точек пересечения требуются в тех случаях, когда отрезки не попадают ни в один из данных классов.

Работа алгоритма начинается с присвоения конечным точкам отрезков 4-битного кода «вне - внутри» по правилу Рис. 2. 23.

Рис. 2.23 Формирование кодов для конечных точек

Каждому биту присваивается значение 1, если выполняется соответствующее данному биту условие, характеризующее взаимное расположение точки и окна (биты нумеруются слева направо):

- бит 1 - точка выше окна;

- бит 2 - точка ниже окна;

- бит 3 - точка справа от окна;

- бит 4 - точка слева от окна.

В противном случае биту присваивается значение 0.

Существует эффективный способ вычисления этого кода, вытекающий из того факта, что бит 1 является знаковым битом разности (ymax -y), бит 2 знаковым битом для (y - ymin), бит 3 для (xmax - x), бит 4 для (x - xmin) . Точка находится внутри окна, если эти разности неотрицательны (код 0000). Отрезок можно принять целиком, если оба его конца лежат внутри окна (оба кода 0000). Отрезок отбрасывается без вычислений, если оба его конца лежат выше, ниже, правее или левее окна. В этих случаях соответствующие биты в обоих кодах равны 1 и это легко выявить применив к кодам логическую операцию И и проверив результат на отличие от 0000.

Если результат логической операции И равен 0000, отрезок нельзя ни принять ни отвергнуть целиком, так как он может пересекаться с окном (см. отрезки CD, IJ, KL на рис.2. 22). Для определения пересечения в алгоритме используется итеративная стратегия «разделяй и властвуй», требующая небольшого объема вычислений. Используется горизонтальность либо вертикальность сторон окна, что позволяет определить координаты x или y точки пересечений без вычислений. Кроме того используется тот факт, что часть отрезка, расположенная с внешней стороны окна, может быть отброшена. Оставшийся отрезок проверяется на возможность его принятия или отбрасывания целиком. Если это невозможно процесс повторяется для другой стороны окна. На каждой итерации конечная точка отрезка с ненулевым кодом заменяется на точку , лежащую на стороне окна или на прямой, содержащей сторону. Порядок перебора окон совершенно произволен: независимо от порядка отсечение некоторых отрезков потребует четырех итераций, определяющих пересечения со всеми четырьмя сторонами окна. В данном случае будем руководствоваться расположением битов в коде:

1. верхняя часть - отбросить часть отрезка, расположенную над окном;

2. нижняя часть - отбросить часть отрезка, расположенную ниже окна;

3. правая сторона - отбросит часть отрезка, расположенную справа;

4. левая сторона - отбросить часть отрезка, расположенную слева.

При расчете точек пересечения используется тот факт, что одна из координат точки пересечения известна (xmin , xmax, ymax , ymin). Например, при вычислении точки пересечения I (см. Рис. 2.22) воспользуемся уравнением:

y = yI + M (x - xI ) = ymin

x = 1/M (ymin - yI) - xI

где x, y - координаты точки I.

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

Алгоритм деления отрезка пополам

Алгоритм деления отрезка пополам сначала отображает все примитивы в координаты устройства и затем отсекает их по границам поля вывода. В этом алгоритме коды «вне/внутри» используются так же как и в алгоритме Коэна-Сазерленда. Если отрезок нельзя ни принять, ни отбросить целиком, он делится на две равные части. Общая стратегия состоит в повторении этой процедуры до тех пор, пока один сегмент исходного отрезка не будет принят целиком (если существует пересечение), а другой - целиком отброшен. На каждом шаге обычно можно принять и/или отбросить половину отрезка. Например, на Рис. 2.24 половина отрезка GI принимается, а половина отрезка KL отбрасывается.

Рис. 2.24 Отсечение методом деления отрезка пополам

Имеется только одна небольшая сложность. При отсечении отрезков, подобных AC и DF (см. Рис. 2.24), необходимо найти либо два пересечения, либо ни одного. Какой конкретно имеет место случай, легко определить в процессе деления. На некотором шаге либо обе половины отбрасываются (как AB и BC), либо нет (как DE и EF). В последнем случае рассмотрение одного временно откладывается, а другой делится до нахождения пересечения. После этого найденные координаты запоминаются и процесс повторяется для отложенного отрезка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]