Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ К КОМПЬЮТЕРНОЙ ГРАФИКЕ .doc
Скачиваний:
59
Добавлен:
29.10.2018
Размер:
1.26 Mб
Скачать

15.Алгоритмы трёхмерного отсечения.

Прямоугольный параллелепипед

Усеченная пирамида

    • Отсечение выпуклой многоугольной областью

      • Выпуклый многоугольник = пересечение полуплоскостей, образованных сторонами многоугольной области

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

{ p[1..n] – многоугольник, sp – полуплоскость, inp(p,sp) – лежит ли точка p в полуплоскости sp, add – добавление вершины в новый многоугольник }

p[0]:=p[n]; ci := inp(p[n],sp);

for i:=1 to n do begin

nci := inp(p[i],sp);

if nci <> ci then begin

newp:=intersect(p[i-1],p[i],sp);

add(newp);

end;

if nci then add(p[i]);

ci := nci;

end;

В результате отсечения получится многоугольник.

Проверка принадлежности полупространству

Нахождение отсечения на битовом уровне.

Прежде чем заняться обобщением изложенных методов для случая трех измерений, необходимо обсудить вопрос о форме отсекающего объема. Двумя наиболее распространенными формами трехмерных отсекателей являются: прямоугольный параллелепипед, т. е. полый брусок, используемый при параллельном или аксонометрическом проецировании, а также усеченная пирамида, часто называемая пирамидой видимости, которая используется при центральном проецировании. Эти формы показаны на рис.9.8, у каждой из них шесть граней: левая, правая, верхняя, нижняя, ближняя и дальняя. Существует, кроме того, необходимость отсекать и по нестандартным объемам.

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

в первый бит - если конец ребра левее объема,

во второй бит - если конец ребра правее объема,

в третий бит - если конец ребра ниже объема,

в четвертый бит - если конец ребра выше объема,

в пятый бит - если конец ребра ближе объема,

в шестой бит - если конец ребра дальше объема.

Рис 9.8 Трехмерное отсечение

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

Поиск кодов точки относительно отсекающего прямоугольного параллелепипеда является прямым обобщением соответствующего двумерного алгоритма. Однако случай, когда отсекателем служит усеченная пирамида, показанная на рис.9.8.b, заслуживает дополнительного обсуждения. Один из методов заключается в преобразовании отсекателя в каноническую форму, где xправ = 1, xлев = -1, yверх = 1, yниз = -1 при zдаль = 1. Если zближ = a, где 0 < a <= 1, а центр проекции совпадает с началом левой системы координат, то проверка кодов концевых точек заметно упрощается.

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

Вид усеченной пирамиды сверху показан на рис. 9.9. а. Уравнение прямой на плоскости xz, несущей проекцию правой грани отсекателя, имеет вид:

x = (z - zцп) * xп / (zд - zцп) = za 1 + a 2,

где a 1 = xп / (zд - zцп) и a 2 = - a 1 zцп

Рис 9.9 Усеченная пирамида

Уравнение этой прямой можно использовать для определения местоположения точки: справа, на или слева от прямой, т. е. вне отсекателя, на плоскости, несущей его правую грань, или внутри отсекателя. Подстановка координат х и z точки Р в пробную функцию правой грани дает следующий результат:

п = x - za 1 - a 2 м > 0, если Р справа от плоскости

н = 0, если Р на плоскости

о < 0, если Р слева от плоскости

Пробные функции для левой, верхней и нижней граней имеют вид:

л = zb 1 - b 2 м > 0, если Р справа от плоскости

н = 0, если Р на плоскости

о < 0, если Р слева от плоскости

где b 1 = xл / (zд - zцп) и b 2 = - b 1 zцп

в = y - zg 1 - g 2 м > 0, если Р выше плоскости

н = 0, если Р на плоскости

о < 0, если Р ниже плоскости

где g 1 = yв / (zд - zцп) и g 2 = - g 1 zцп

н = y - zd 1 - d 2 м > 0, если Р ниже плоскости

н = 0, если Р на плоскости

о < 0, если Р выше плоскости

где d 1 = yн / (zд - zцп) и d 2 = - d 1 zцп

Наконец, пробные функции для ближней и дальней граней имеют вид:

б = z - zб м > 0, если Р ближе плоскости

н = 0, если Р на плоскости

о < 0, если Р дальше плоскости

д = z - zд м > 0, если Р дальше плоскости

н = 0, если Р на плоскости

о < 0, если Р ближе плоскости

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

Как указывали Лианг и Барский, последний метод может дать некорректные значения кодов, если концы отрезка лежат за центром проекции. Это происходит потому, что плоскости, несущие левую, правую, верхнюю и нижнюю грани усеченной пирамиды, пересекаются в точке центра проекции. Поэтому существуют точки, расположенные одновременно левее левой и правее правой граней. Лианг и Барский предложили способ устранения этой неопределенности. Для этого в принципе необходимо лишь обратить значения первых четырех битов кода при z > zцп.

http://www.mari-el.ru/mmlab/home/kg/Lection9/index.html