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

23. Алгоритм отсечения отрезков на плоскости.

При отсечении на плоскости выполняется, с одной стороны, выделение обрабатываемой области экрана, а с другой стороны, объекты этой выделенной области разбиваются на составляющие. Для операции отсечения элементарным геометрическим объектом является линия (отрезок прямой). Существует ряд алгоритмов, позволяющих оптимизировать процесс отсечения, но наиболее эффективно реализован на методе кодирования, предложенном американскими инженерами Коэнном и Сазерлен дом (Cohen D., Sutherland I.). Для быстрого определения видимости/невидимости отрезков прямых был предложен способ четырехразрядного кодирования. Каждый разряд этого кода определяет принадлежность концов отрезка к соответствующим областям. Если точка попадает в область, то код равен единице.

Используя эти коды можно определить видимость (полную или неполную) или невидимость отрезка. Рассмотрим возможные варианты кодировки концевых точек:

1) С1=С2=0 – отрезок полностью видим (обе точки внутри окна);

2) если хотя бы одна из точек имеет и отличие от 0 , то, следовательно, часть отрезка или он полностью невидим:

2.1) если поразрядное логическое произведение кодов отлично от нуля (С1&С2 ≠0), то отрезок полностью невидим;

2.2) С1&С2 = 0, то отрезок может быть как видимым, так и невидимым. В этом случае выполняется дополнительный анализ, при котором концевые точки заменяются точками пересечения рассматриваемого отрезка с границами отсекающего окна.

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

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

для каждой стороны окна выполнить:

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

проверка С1 = С2 = 0;

если результат проверки положительный,

то - отобразить отрезок, иначе - выполнить:

если С1&С2 ≠0, то перейти к следующему отрезку,

иначе заменить точки Р1 и Р2 на точки пересечения отрезка с границами окна.

Конец 23 вопроса.

24. Алгоритмы отсечения многоугольников на плоскости.

Многоугольник можно рассматривать как замкнутую последовательность отрезков, расположенных на плоскости, а операцию отсечения реализовать с точки зрения вычисления взаимного перекрытия двух многоугольников. Один из многоугольников представляет собой отсекающее окно, а другой – отсекаемый объект. При реализации подобных алгоритмов на базе вычислений пересечений, возникает ряд проблем, связанных с тем, что фигура отсекаемого многоугольника может превратиться в набор разрозненных отрезков, либо в открытые многоугольники (как на рис.4.24).

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

Алгоритм Сазерленда-Ходжмена.

Алгоритм Сазерленда-Ходисмена основан на последовательном отсечении рёбер многоугольника каждой из границ отсекающего окна. Например :

Реальный алгоритм более сложен, т.к. учитывает произвольную форму и ориентацию, как отсекаемого многоугольника, так и отсекающего окна. Исходными данными для работы алгоритма являются списки вершин многоугольника и отсекающего окна v1,v2,…,vn; w1,w2,…,wn.

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

Как правило, алгоритм реализуется за два этапа. На первом этапе в прямой последовательности осуществляется просмотр вершинv1,v2,…,vn и выявляются точки пересечения. На втором этапе осуществляется обратный просмотр с формированием выходного списка отсечённого многоугольника. При этом на каждом шаге работы алгоритма могут быть занесены 1,2 – вершины.

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

Перед началом работы цикла выбирается начальная точка v1внутри.

Случай 1. Ребро полностью находится внутри окна. При этом начальная точка v1 ребра находится в выходном списке, а вторая вершина v2 добавляется в список.

Случай 2. Ребро выходит за пределы окна. При этом известна точка пересечения x1 ребра с окном. В выходной список заносится точка пересечения x1 .

Случай 3. Ребро полностью находится за пределами окна. В этом случае выходной список не изменяется.

Случай 4. Ребро входит в окно, и в выходной список заносятся две точки: точка пересечения x2 и v1 .

Данный алгоритм позволяет работать как с выпуклыми, так и с не выпуклыми многоугольниками.

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

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

Алгоритм Вейлера – Азертона.

Данный алгоритм ориентирован на эффективное решение проблемы отсечения в том случае, если в результате отсечения образуется множество ребер на границе окна.

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

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

1) если ребро входит в окно, то просмотр продолжается вдоль ребра многоугольника;

2) если ребро выходит из окна, то выполняется поворот по границе окна в выбранном направлении.

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

Конец 24 вопроса.

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