Трехмерная компьютерная графика
Рефераты >> Программирование и компьютеры >> Трехмерная компьютерная графика

Обработка левого бокового ребра:

Если Pnявляется первой точкой на первой кривой, то запомним Pn в качестве Pn-1 и закончим заполнение. В противном случае создадим ребро, соединяющее Pn и Pn-1.

Занесем в массивы верхнего и нижнего горизонтов ординаты этого ребра и запомним Pn в качестве Pn-1.

Обработка правого бокового ребра:

Если Pn является последней точкой на первой кривой, то запомним Pn в качестве Pn-1 и закончим заполнение. В противном случае создадим ребро, соединяющее Pn и Pn-1.

Занесем в массивы верхнего и нижнего горизонтов ординаты этого ребра и запомним Pn в качестве Pn-1.

Теперь полный алгоритм выглядит так:

Для каждой плоскости z = const.

Обработать левое боковое ребро.

Для каждой точки, лежащей на кривой из текущей плоско­сти:

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

Если на сегменте от предыдущего (xn) до текущего (xn+k) значения x видимость кривой изменяется, то вычисляется пересечение (xi).

Если на участке от xn до (xn+k) сегмент кривой полностью видим, то он изображается целиком; если он cтал невидимым, то изображается его кусок от xn до xi; если же он стал видимым, то изображается его ку­сок от xi до xn+k.

Заполнить массивы верхнего и нижнего плавающих горизонтов.

Обработать правое боковое ребро.

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

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

Алгоритм плавающего горизонта

Гэкран – разрешение экрана в горизонтальном направлении

Вэкран – разрешение экрана в вертикальном направлении

Верх – массив, содержащий координаты верхнего горизонта

Низ – массив, содержащий координаты нижнего горизонта

Y – текущее значение функции y = f ( x, z ) при z = const

Тфлаг – флаг видимости для текущей точки

Пфлаг – флаг видимости для предыдущей точки, равный

0 = невидима

1 = видима и выше верхнего горизонта

-1 = видима и ниже нижнего горизонта

Draw – графическая команда, которая чертит видимую линию между точками, заданными их координатами.

Xmin, Xmax – минимальная и максимальная абсциссы функции

Xшаг – шаг приращения вдоль оси x

Zmin, Zmax – минимальная и максимальная аппликата функции

Zшаг – шаг между плоскостями z = const

Dimension Верх (Гэкран), Низ (Гэкран)

инициализация переменных

Xлевое = -1; Yлевое = -1; Xправое = -1; Yправое = -1

инициализация массивов горизонтов

Верх = 0

Низ = Вэкран

Вычисление функции на каждой плоскости z = const, начиная с ближайшей к наблюдателю плоскости Zmax

for z = Zmax to Zmin step - Zшаг

инициализация предыдущих значений по x и y: Xпред и Yпред

Xпред = Xmin

Yпред = f (Xmin, z)

если используется видовое преобразование, то его нужно применить к Xпред, Yпред, z в данной точке

обработка левого бокового ребра

call Обрребра (Xпред, Yпред, Xлев, Yлев; Верх, Низ)

call Видимость (Xпред, Yпред, Верх, Низ; Пфлаг)

для каждой точки на кривой, лежащей в плоскости z = const

for x = Xmin to Xmax step Xшаг

y = f (x, z)

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

проверка видимости текущей точки и заполнение соответствующего массива горизонта

call Видимость (x, y, Верх, Низ; Тфлаг)

if Тфлаг = Пфлаг then

if (Тфлаг = 1) or (Тфлаг = -1) then

Draw (Xпред, Yпред, x, y)

call Горизонт (Xпред, Yпред, x, y; Верх, Низ)

end if

если видимость изменилась, то вычисляется пересечение и заполняется массив горизонта

else

if Тфлаг = 0 then

if Пфлаг = 1 then

call Пересечение (Xпред, Yпред, x, y, Верх; Xi, Yi)

else

call Пересечение (Xпред, Yпред, x, y, Низ; Xi, Yi)

end if

Draw (Xпред, Yпред, Xi, Yi)

сall Горизонт (Xпред, Yпред, Xi, Yi, Верх, Низ)

else

if Тфлаг = 1 then

if Пфлаг = 0 then

call Пересечение (Xпред, Yпред, x, y, Верх; Xi, Yi)

Draw (Xi, Yi, x, y)

сall Горизонт (Xi, Yi, x, y; Верх, Низ)

else

call Пересечение (Xпред, Yпред, x, y, Низ; Xi, Yi)

Draw (Xпред, Yпред, Xi, Yi)

call Горизонт (Xпред, Yпред, Xi, Yi; Верх, Низ)

call Пересечение (Xпред, Yпред, x, y, Верх; Xi, Yi)

Draw (Xi, Yi, x, y)

call Горизонт (Xi, Yi, x, y; Верх, Низ)

end if

else

if Пфлаг = 0 then

call Пересечение (Xпред, Yпред, x, y, Верх; Xi, Yi)

Draw (Xi, Yi, x, y)

call Горизонт (Xi, Yi, x, y; Верх, Низ)

else

call Пересечение (Xпред, Yпред, x, y, Верх; Xi, Yi)

Draw (Xпред, Yпред, Xi, Yi)

call Горизонт (Xпред, Yпред, Xi, Yi; Верх, Низ)

call Пересечение (Xпред, Yпред, x, y, Низ; Xi, Yi)

Draw (Xi, Yi, x, y)

call Горизонт (Xi, Yi, x, y; Верх, Низ)

end if

end if

end if

end if

вновь инициализировать Пфлаг, Xпред, Yпред

Пфлаг = Тфлаг

Xпред = x

Yпред = y

next x

обработка правого концевого ребра

call Обрребра (x, y, Xправ, Yправ; Верх, Низ)

next z

finish

подпрограмма обработки бокового ребра

Subroutine Обрребра (x, y, Xребра, Yребра; Верх, Низ)

если Xребра = -1, то встречена первая кривая и ребро не создаётся

if Xребра = -1 then 1

call Горизонт (Xребра, Yребра, x, y; Верх, Низ)

1 Xребра = x

Yребра = y

return

подпрограмма определения видимости точки

Subroutine Видимость (x, y, Верх, Низ; Тфлаг)

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

Тфлаг = 0, если точка невидима

= 1, если она видима и выше верхнего горизонта

= -1, если она видима и ниже нижнего горизонта

x считается целой

if (y < Верх (x)) and (y > Низ (x)) then Тфлаг = 0

if y ³ Верх (x) then Тфлаг = 1

if y £ Низ (x) then Тфлаг = -1

return

подпрограмма заполнения массивов плавающих горизонтов


Страница: