Jump to content

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

(Перенаправлено из Сазерленда-Ходжмана )

Алгоритм Сазерленда -Ходжмана — это алгоритм, используемый для отсечения многоугольников . Он работает путем расширения каждой линии выпуклого полигона обрезки по очереди и выбора только вершин из рассматриваемого многоугольника , которые находятся на видимой стороне.

Описание

[ редактировать ]

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

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

Все шаги по отсечению вогнутого многоугольника W 5-сторонним выпуклым многоугольником

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

Псевдокод

[ редактировать ]

Учитывая список ребер в полигоне обрезки и список вершин в полигоне субъекта, следующая процедура отсекает полигон субъекта относительно полигона обрезки.

List outputList = subjectPolygon;  

for (Edge clipEdge in clipPolygon) do
    List inputList = outputList;
    outputList.clear();

    for (int i = 0; i < inputList.count; i += 1) do
        Point current_point = inputList[i];
        Point prev_point = inputList[(i − 1) % inputList.count];

        Point Intersecting_point = ComputeIntersection(prev_point, current_point, clipEdge)

        if (current_point inside clipEdge) then
            if (prev_point not inside clipEdge) then
                outputList.add(Intersecting_point);
            end if
            outputList.add(current_point);

        else if (prev_point inside clipEdge) then
            outputList.add(Intersecting_point);
        end if

    done
done

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

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

Реализации

[ редактировать ]

Python-реализацию метода Сазерленда-Ходжмана можно найти здесь .

См. также

[ редактировать ]

Другие алгоритмы отсечения полигонов:

По поводу обрезки:

  • Мел Слейтер, Энтони Стид, Йоргос Хрисанту: Компьютерная графика и виртуальная среда: от реализма к реальному времени. Эддисон Уэсли, 2002. ISBN   0-201-62420-6 .
  • Иван Сазерленд , Гэри В. Ходжман: Обрезка возвратного полигона. Сообщения ACM , вып. 17, стр. 32–42, 1974 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2e8728d38c7e32b708684491a17eacdf__1717572360
URL1:https://arc.ask3.ru/arc/aa/2e/df/2e8728d38c7e32b708684491a17eacdf.html
Заголовок, (Title) документа по адресу, URL1:
Sutherland–Hodgman algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)