Алгоритм Сазерленда – Ходжмана - Sutherland–Hodgman algorithm
В Алгоритм Сазерленда – Ходжмана является алгоритм используется для вырезка полигоны. Он работает, расширяя каждую строку выпуклый вырезать многоугольник по очереди и выбирая только вершины из предметный многоугольник которые находятся на видимой стороне.
Описание
Алгоритм начинается с ввода список всех вершин в рассматриваемом многоугольнике. Затем одна сторона многоугольника отсечения бесконечно удлиняется в обоих направлениях, и проходит путь рассматриваемого многоугольника. Вершины из входного списка вставляются в выходной список, если они лежат на видимой стороне расширенной линии многоугольника обрезки, и новые вершины добавляются в список вывода, где путь многоугольника объекта пересекает расширенную линию многоугольника обрезки.
Этот процесс повторяется итеративно для каждой стороны многоугольника отсечения, используя выходной список из одного этапа в качестве входного списка для следующего. После того, как все стороны многоугольника отсечения были обработаны, окончательный сгенерированный список вершин определяет новый отдельный многоугольник, который полностью виден. Обратите внимание: если полигон объекта был вогнутый в вершинах за пределами ограничивающего многоугольника новый многоугольник может иметь совпадающие (т. е. перекрывающиеся) края - это приемлемо для рендеринга, но не для других приложений, таких как вычисление теней.
В Вейлер – Атертон Алгоритм преодолевает это, возвращая набор разделенных многоугольников, но он более сложен и требует больших вычислительных затрат, поэтому Сазерленд – Ходжман используется для многих приложений визуализации. Сазерленд – Ходжман также может быть расширен в трехмерное пространство путем отсечения многоугольных контуров на основе границ плоскостей, определяемых пространством просмотра.
Псевдокод
Имея список ребер в многоугольнике обрезки и список вершин в субъектном многоугольнике, следующая процедура обрезает субъектный многоугольник относительно многоугольника обрезки.
Список 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.
внешняя ссылка
- Обрезка и заливка многоугольника Описывает алгоритм с помощью изображений, которые легко понять.
- [1] Примеры кода Rosetta