Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Алгоритм Сазерленда-Коэна отсечения прямоугольной областью





Рассмотрим плоскую сцену, состоящую из отрезков различной длины и направлений, в которой надо выделить часть, находящуюся внутри прямоугольника. Прямоугольник задан списком ребер: t<op>, b<ottom>, l<eft>, r<ight>;, отрезки также задаются координатами концевых точек. Область, отсекаемая окном (с учетом его границы), состоит из точек , удовлетворяющих соотношениям

(6.1)

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

Рис. 6.1. Коды Сазерленда-Коэна для областей

Отрезок полностью невидим, если оба его конца лежат

1. справа от ребра ;

2. слева от ребра ;

3. снизу от ребра ;

4. сверху от ребра .

Во всех остальных случаях отрезок может (но не обязан) пересекать прямоугольное окно.

Для выполнения анализа полной видимости или невидимости отрезка А.Сазерленд и Д.Коэн предложили следующий алгоритм. Прямые, которым принадлежат ребра прямоугольника, разбивают плоскость на девять областей, каждой из которых присваивается четырехразрядный код. Каждый бит этого кода "отвечает" за одну из прямых: 1-й (старший) бит - за прямую , 2-й - за прямую , 3-й - за , 4-й - за . Если в коде области какой-либо бит установлен в 1, то это означает, что она отделена от окна соответствующей прямой. Схема идентификации областей приведена на рис. 6.1.

Концевым точкам отрезков сцены теперь можно присвоить коды в зависимости от расположения точек. Ясно, что если коды обоих концов отрезка равны нулю, то отрезок полностью лежит внутри окна. Для дальнейшего анализа воспользуемся операцией логического умножения кодов (поразрядное логическое "И"). Тогда таблица истинности для кодов, согласно схеме на рис. 6.1, будет выглядеть следующим образом:

Таблица 6.1.

Значения истинности для логического умножения кодов областей

  С1 С2 С3 С4 С13 С14 С23 С24
С1 Т F F F T T F F
С2 F T F F F F T T
С3 F F T F T F T F
С4 F F F T F T F T
С13 T F T F T T T F
С14 T F F T T T F T
С23 F T T F T F T T
С24 F T F T F T T T

Из сопоставления таблицы с рисунком видно, что если произведение кодов концов отрезка принимает значение T<rue>;, то отрезок целиком лежит по одну сторону какой-то из прямых, причем внешнюю сторону по отношению к окну, следовательно, он полностью невидим. Во всех остальных случаях отрезок может частично лежать внутри окна, поэтому для определения их видимой части надо решать задачу о пересечении отрезков с ребрами окна. При этом желательно по возможности сократить число перебираемых пар "отрезок-ребро".

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

В блок-схеме используются следующие соглашения и обозначения:

· входными данными являются точки , массив координат окна ;

· на выходе получаем новые концевые точки , а также значение переменной IsVisible (0 - отрезок видимый);

· используются следующие вспомогательные функции:

GetCode(r) - определение кода точки;

Intersec0(r1,l) - поиск пересечения отрезка со сторонами окна при условии, что обе точки лежат вне окна; если пересечения нет, устанавливает переменную IsVisible в 0;

Intersec(r1,l) - поиск пересечения отрезка со сторонами окна при условии, что точка r1 лежит в окне;

C1, C2 - коды точек r1, r2.

 

Рис. 6.2. Блок-схема алгоритма Сазерленда-Коэна

В приведенном алгоритме теперь остается только детализовать функции Intersec0 и Intersec, эффективность работы которых является ключевым моментом. Рассмотрим один из методов поиска пересечений, который использует параметрическое уравнение прямой, проходящей через точки :

или в координатном виде

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

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

Аналогично выглядят формулы и для остальных границ окна. Если точка расположена внутри окна, то, в зависимости от знака , следует искать пересечение либо с верхней, либо с нижней границей окна. При отсутствии таковых отыскиваются пересечения с левой или правой стороной окна. Но прежде чем перебирать эти варианты, необходимо исключить случаи горизонтальных и вертикальных направлений отрезка. В первом случае точками пересечения с правой или левой границей (в зависимости от знака ) могут быть или , а во втором - или .

Этот алгоритм реализован в виде функции Intersec, блок-схема которой приведена на рис. 6.3.

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

Затем последовательно рассматриваются четыре случая расположения точки относительно прямых, ограничивающих окно. Если в каком-то из вариантов будет найдена точка пересечения, то анализ прекращается, точка заменяется новой точкой и вызывается функция Intersec. В случае же, когда все четыре варианта не дали положительного результата, переменной IsVisible присваивается значение 0. Алгоритм реализуется функцией Intersec0 (блок-схема на рис. 6.5).

Предложенная реализация алгоритма отсечения не является единственной в своем роде. Существуют и другие подходы, в частности использование метода деления отрезка пополам для поиска точек пересечения и выявления видимой части отрезка. Такой вариант алгоритма был предложен Сазерлендом и Спрулом для аппаратной реализации, но он может быть реализован и на программном уровне, хотя при этом эффективность его будет ниже, чем у предыдущего. В нем нет прямого вычисления координат новой точки по явным алгебраическим соотношениям. Поиск осуществляется итерационным методом, в котором на каждом шаге для отрезка, "подозреваемого" в частичной видимости, находится его средняя точка, определяется ее код, затем из двух отрезков оставляются либо оба (если они оба не окажутся полностью невидимыми), либо только один, после чего операции продолжаются с новыми отрезками. Ситуация, когда дальнейшему дроблению подвергаются сразу два вновь полученных отрезка, может возникнуть только на первом итерационном шаге в тех случаях, когда исходный отрезок имеет две точки пересечения с границами окна. На последующих итерационных шагах количество анализируемых отрезков уже не будет увеличиваться. Процесс продолжается до тех пор, пока длина очередного отрезка не станет меньше наперед заданной точности. После этого найденная точка проверяется на предмет пересечения со стороной окна. На рис. 6.6 приведены три варианта отрезков, предварительный анализ которых не классифицирует их как полностью невидимые, и показан первый итерационный шаг. Отрезок a после первого деления дает два частично видимых отрезка, после чего ищутся две точки пересечения. В остальных случаях остается лишь один из двух отрезков, причем в случае отрезка c точка пересечения со стороной окна отсутствует, т.е. обнаруживается полная невидимость отрезка. По сути дела общий алгоритм, показанный на рис. 6.3, сохраняется, изменяется лишь метод поиска точки пересечения.

Рис. 6.3. Блок-схема функции Intersec

Рис. 6.4. Отрезки параллельны сторонам окна

Рис. 6.5. Блок-схема функции Intrsec0

Рис. 6.6. Произвольное расположение отрезков







Дата добавления: 2015-10-01; просмотров: 1479. Нарушение авторских прав; Мы поможем в написании вашей работы!




Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...


ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...


Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...


Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

Дренирование желчных протоков Показаниями к дренированию желчных протоков являются декомпрессия на фоне внутрипротоковой гипертензии, интраоперационная холангиография, контроль за динамикой восстановления пассажа желчи в 12-перстную кишку...

Деятельность сестер милосердия общин Красного Креста ярко проявилась в период Тритоны – интервалы, в которых содержится три тона. К тритонам относятся увеличенная кварта (ув.4) и уменьшенная квинта (ум.5). Их можно построить на ступенях натурального и гармонического мажора и минора.  ...

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

Растягивание костей и хрящей. Данные способы применимы в случае закрытых зон роста. Врачи-хирурги выяснили...

ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...

Различие эмпиризма и рационализма Родоначальником эмпиризма стал английский философ Ф. Бэкон. Основной тезис эмпиризма гласит: в разуме нет ничего такого...

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия