Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компьютерная геометрия и графика.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.78 Mб
Скачать

8.2. Отсечение плоских фигур

Рассмотрим задачу об отсечении произвольного многоугольника по границе заданного выпуклого многоугольника (рис.8.3). Алгоритм сводит основную задачу к серии более простых задач об отсечении многоугольника вдоль прямой, проходящей через одно из ребер отсекающего многоугольника.

Рис.8.3. Алгоритм отсечения плоских фигур

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

Рис. 8.4. Пошаговое выполнение алгоритма

При последовательном отсечении многоугольника по четырем границам возможны 4 различных ситуации (рис. 8.5). Может также возникнуть вариант, когда ребро совпадает с границей.

+P; +Q

--

+Q

+P

Рис. 8.5. Различные случаи алгоритмы

Предположим, что точка S уже обработана, тогда могут произойти следующие случаи.

В случае 1: ребро целиком лежит во внутренней области и точка P добавляется в результирующий многоугольник.

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

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

В случае 4: в результирующий многоугольник добавляются точка пересечения Q и точка P.

8.3. Алгоритм удаления нелицевых граней

Если сцена состоит только из выпуклых многогранников, то внутренние грани многоугольников никогда не будут видны.

Рис.8.6. Анализ лицевой грани

Но у такого выпуклого многогранника часть граней будет повернута от наблюдателя (нелицевые грани). Следовательно, они тоже не будут видны наблюдателю. Принцип отбраковки нелицевых граней поясняется на рис.8.6. Внешняя сторона многоугольника будет видима наблюдателю только в том случае, если нормаль к плоскости многоугольника будет направлена к наблюдателю. Обозначим через θ угол между внешней нормалью плоскости многоугольника и направлением на наблюдателя, тогда многоугольник будет представлять лицевую грань объекта только том случае, если -90° < θ < 90°, или, что то же самое, если .

Если уравнение плоскости, в которой лежит многоугольник, имеет вид

ax+by + cz + d = 0, то для определения, является ли грань лицевой или нелицевой, потребуется только проверить знак коэффициента с. Такую проверку можно выполнить как программно, так и аппаратно.

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

8.4. Алгоритм z-буфера

Рассмотрим алгоритм удаления невидимых граней с использованием z-буфера, который является одним из наиболее часто используемых в современных приложениях компьютерной графики. Он работает в пространстве изображения и применяется в таких популярных графических библиотеках как OpenGL и Direct3D.

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

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

Рис.8.7. Алгоритм z-буфера