Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Темы_Растровая_графика_Матрицы_Побитовые операц...docx
Скачиваний:
2
Добавлен:
19.09.2019
Размер:
1.18 Mб
Скачать
  1. Алгоритм Коэна – Сазерленда

Можно рассмотреть теперь, как выполнить анализ принадлежности отрезка видовой области или его части.

Эта задача решена в алгоритме Коэна-Сазерленда.

Когда решается задача отсечения отрезка или линии, то считают - точка линии, лежащая на границе окна, принадлежит окну. Точки, лежащие внутри отсекающего окна, должны удовлетворять условию

xл xxпр или xmin xmax

yн в ymin ymax

Пространство разбивается на 9 областей. Область в центре – экранная область вывода изображения. Каждая подобласть кодируется бинарным 4-х битным кодом, в0 в1 в2 в3 (или с1с2с3с4 – обозначить их можно как угодно).

Для каждого отрезка определяют коды концов (К1, К2). Образование 4-х битного КОДА ясно из рисунка. 4-х битный код присваивается каждой конечной точке отрезка. Если конечная точка лежит ...

то соответствующему коду присваивается значение равное 1.

Иначе биту присваивают нулевое значение.

Машинный анализ кодов посредством побитовых бинарных операций дает три возможных результата.

1. Отрезок выводится целиком: коды P1 и P2 концов отрезка равны 0000 – (Код Р1) ИЛИ (Код Р2) = 0000. Здесь ИЛИ – бинарная операция.

2. Отрезок отбрасывается без вычислений: оба конца отрезка находятся выше, ниже, правее или левее окна вывода. Соответствующие биты в кодах равны 1: (Код P1) И (Код P2) = ...

Здесь символ И – бинарная операция логического умножения.

  1. Отрезок нельзя принять и нельзя отбросить. Результат бинарной операции ИЛИ равен 0000: Потребуется определить ту его часть, которая находиться за границей окна и отсечь ее, либо отсекать по частям до тех пор, пока коды концов не укажут на один из тривиальных случаев (см. п. 2) нахождения отрезка целиком за пределами окна.

Пример 1. Анализ положения отрезков

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

Для каждого отрезка определяют коды концов (К1, К2). По найденным кодам выполняется экспресс-анализ (побитовый опрос И и ИЛИ):

- Если К1 и К2 0, отрезок лежит вне поля вывода и отбрасывается (и – бинарная операция).

- Если К1 или К2 = 0, отрезок полностью лежит внутри поля вывода, отсечение не нужно и отрезок полностью прорисовывается.

- Если К1 и К2 =0, отрезок частично лежит внутри поля вывода, необходимо его отсечение по полю вывода, или требуется дополнительная проверка на невидимость отрезка.

D

Пример 2. Отсечение отрезка (рис ниже)

Задан отрезок Р1Р2.

Его расположение относительно окна вывода не соответствует условиям полной видимости или полной невидимости. Выпишем коды конечных точек:

Cod (P1) = 1010; Cod (P2) = 0101

Перенесём точку P1 в точку R (X = Xmin). Cod (R) = 0010. Отрезок P1R можно отсечь, т.к. побитовая бинарная операция дала результат

1010 1010

и 0101

0010 0000

0010, т.е. эта часть отрезка лежит левее линии X – Xmin.

Проверка отрезка по нижней границе Ymin:

RS: Cod R = (0010); Cod S = (0010) – это тривиальный случай и эту часть отрезка также можно отсечь. Он целиком лежит ниже нижней границы окна вывода (y = ymin)

Аналогично рассматривается перемещение точки P2 к точке Q в сторону границы ВС окна:

Cod (P2) = 0101 Cod Q = 0100

Бинарная операция И: 0101=0100

и 0100

0100

Отрезок P2Q должен быть отсечён.

Cod (Q) = 0100, Cod ( T)= 0100; И = 0100

0100

0100

Отрезок должен быть отсечен.

Cod (S) 0000; Cod T (0000) – отрезок ST видим, и должен быть отрисован.

Пример 3: Анализ положения отрезка по отношению к видовому окну.

Отрезок по отношению к области вывода может быть расположен таким образом, что однозначно невозможно сказать, попадает он в окно или нет.

Надо выполнить перенос точек.

Коды конечных точек: Cod (P1) = 1010; Cod (P2) = 0100

Перенесём точку P1 в точку Q, тогда

Cod (Q) = 0010 ; Cod (P2) = 0100

Перенесём точку P2 в точку T:

Cod (Q) = 0010 ; Cod (T) = 0100

Теперь перенесём точку Т в точку S:

Cod (Q) = 0010; Cod (S) = 0010

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

Известны и другие алгоритмы: алгоритм средней точки, алгоритм Кируса-Бека. Последний построен на параметрическом представлении отрезка : Ps(t) = P1+ (P2 – P1) ∙t t [0,1]. Алгоритм позволяет выполнять отсечение не только прямоугольным окном, но и любым выпуклым многоугольником.

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