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

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

Описание

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

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

Все шаги для обрезки вогнутого многоугольника 'W' с 5-сторонним выпуклым многоугольником

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

Псевдокод

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

Список outputList = subjectPolygon; за (Edge clipEdge в clipPolygon) делать    Список inputList = outputList; outputList.clear (); за (int я = 0; я делать        Точка current_point = inputList [i]; Точка prev_point = inputList [(i + inputList.count - 1)% inputList.count]; Точка Intersecting_point = ComputeIntersection (prev_point, current_point, clipEdge) если (текущая_точка внутри clipEdge) тогда            если (prev_point не внутри clipEdge) тогда                outputList.add (точка_пересечения); конец, если            outputList.add (текущая_точка); иначе если (предыдущая точка внутри clipEdge) тогда            outputList.add (точка_пересечения); конец, если    сделаносделано

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

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

Смотрите также

Рекомендации

  • Мел Слейтер, Энтони Стид, Йоргос Хрисанту: Компьютерная графика и виртуальные среды: от реализма к реальному времени. Эддисон Уэсли. ISBN  0-201-62420-6.
  • Иван Сазерленд, Гэри В. Ходжман: Повторяющееся отсечение многоугольника. Коммуникации ACM, т. 17. С. 32–42, 1974.

внешняя ссылка