Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

fullKG

.pdf
Скачиваний:
114
Добавлен:
12.02.2018
Размер:
736.4 Кб
Скачать

28. Алгоритм выявления видимости части отрезка на основе его разбиения средней точкой.

 

Рн

 

 

Рср’

 

 

 

Хл

Рср

Хп

 

Рк

Находим среднюю точку Анализируются полученных два отрезка (Рн-Рср) и (Рср – Рк).

Рср – Рк – невидим, перенесли точку Рк на место Рср.

Оставшийся отрезок делит пополам Рср’.

Рассматриваем отрезок Рн-Рср’ виден

Рн - запомнили; Рср’-Рк – неизвестно

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

Как только выходим на границу у нас обе точки видны и мы можем вывести полученный отрезок.

Если длина дошла до 0, а мы о нем ничего не знаем то он попал на границу и его надо выводить

Рср

Если изначально дает два неопределенных отрезка, то один

запоминаем и работаем с оставшимся, разбиваем его, а потом

 

 

возвращаемся к запомненному отрезку и разбиваем его.

29. Алгоритм отсечения отрезка сторонами произвольно расположенного выпуклого окна (алгоритм Кируса-Бека).

 

 

P2

Pi

 

0 t 1

 

P(t)=P1+(P2-P1)t

i

 

P(t)

n

Bнi

 

Bн-внутреннее,

P1

 

 

nВНi нормаль к “i”грани

 

 

( p(t) pi ) nВНi 0 (если это так, то можем найти точку пересечения с границей)

Можем найти t.

Можем определить видимую часть отрезка.

Все точки мы можем поделить на две группы:

-Точки входа в окошко

-Точки выхода из окна

(( p p ) ( p

p ) t) n

0

1

i

 

2

1

 

ВНi

 

Можно разделить эти две составляющие и получить “t”

 

( p p

) nВНi

 

W

скалярное произведение векторов

t

1

i

 

 

 

 

( p

p ) nВНi

Q

в числителе и знаменателе

 

 

 

 

 

 

2

1

 

 

 

 

 

Если Q>0 , то точка входа

Если Q<0 , то точка выхода

Если Q=0 , то -либо отрезок выражается в точку

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

p p

// p

p

1 2

i 1

i

Если W<0 , то точка находится вне окна Если W≥0, то точка P1 находится в окне.

2 3

1

4

0 5

вне окна

в окне

30. Алгоритм последовательного отсечения произвольного

многоугольника сторонами выпуклого окна.

Мн-к

окно

Мн-к

Если работаем с выпуклым окном, то рассматриваются стороны окна и смотрится: все что по стороне окна оставляем, а остальную часть отсекаем и так со всеми сторонами. Так мы можем сформировать всё, что останется в окошке, т.е. постепенно отсекается то что лежит вне окна.

1 вар

p

s

вне окна

В выходной массив заносим «0» точек.

2 вар

p

Внутри I окна

s

Вне окна

Тут мы должны найти точку пересечения «I» и занести в выходной массив, и конечную точку тоже заносим в выходной массив.

3 вар

p

s

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

4 вар

p

I

s

Заносим только точку “I” в массив.

Далее меняем стартовую и конечную точку местами. S->P (S – стартовая точка P - конечная)

4

2

3

 

1

Рассматриваем эту сторону и запоминаем точки 1 и 2.

31. Алгоритм отсечения произвольных многоугольников невыпуклыми окнами (алгоритм Вейлера-Азертона).

 

 

p2

 

w2

 

 

 

 

 

 

 

 

 

w2

p5

p1

i1

i2

p2

 

 

 

 

 

 

 

 

w6

 

 

i6

 

i3

w1

w5

p4

 

 

 

 

 

 

 

p6 w4

 

p3

 

 

 

 

 

 

w1

i5

i4

w3

 

 

 

 

p1

w3

 

 

p3

 

 

 

 

 

 

 

Точки пересечения принадлежат и окну и многоугольнику. Для окна и многоугольника составляются циклические списки.

p

w

 

1

1

p

2

w

 

2

p

w

 

3

3

В эти циклические списки вставляются точки пересечения окно со сторонами мн-ка.

p

w

 

 

1

 

1

I

1

I

6

 

 

I

2

I

1

 

 

p

2

w

 

 

 

2

I

3

I

2

 

 

I

4

I

3

 

 

p

w

 

 

3

 

3

I

5

I

4

 

 

I

6

I

5

 

 

При этом устанавливаются взаимно односложные двунаправленные связи.

Списки составляют так, что контур многоугольника и контур окна описываются по часовой стрелке.

Ищется любая точка входа в окно для описания списка многоугольника.

32. Алгоритм выявления охватывающего и внешнего многоугольника по отношению к окну.

(4) (5)

Если использовать четырех битовый код для всех точек для определения типа многоугольника:

Для определения (5) или (4) вариант используют лучевой тест.

Из любой точки внутри окна (или на границе) проводят в сторону многоугольника луч и смотрят сколько пересечений со сторонами многоугольника.

Если нечетное: n=2m+1 следовательно вариант (4) Если четное: n=2m следовательно вариант (5)

одна

точка

одна

2

точки

точка

или

 

 

 

0

точек

попали на вершину, т.е. пересечение с двумя сторонами

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

33. Методы выявления факта выпуклости многоугольника и способы определения внутренних нормалей к его стороне.

1.Определить, что окно выпуклое.

2.Определить нормаль к стороне.

1.Определить, что окно выпуклое.

P2

P1 P3

P4

P0P6 P5

P(t)=P0+(P1-P0)t

Если в матричное уравнение прямой подставить значения точек P0…P6, то значение тестовой функции будет одного знака.

Матричное уравнение:

f(xi,yi)=

x x

y y

i

0

i

0

x x

y

y

1

0

1

0

, i

2…5. - это тестовая функция

Если в эту значения P0…P6 , то

x x

y y

0

 

1

 

 

1

x

x

y

2

y

 

2

1

 

1

 

-

2

 

тестовую функцию постепенно поставить эта функция будет иметь один знак.

- Матричное представление прямой.

1 +

Все точки, которые лежат на прямой будут давать 0.

Справа от прямой точки будут давать знак “+”. А слева – “-”.

Выпуклость проверяется по всем сторонам, проверять знак долго, легче сравнить с “0”.

Если f2+fi<0 – окно не выпуклое.

37. Алгоритм удаления невидимых линий, использующий принцип плавающего горизонта.

Используется когда есть функциональное описание поверхности: f (x,y,z)=0

Делается срез по координате z, т.е. при z=const.

g(x, y)

z const 0

м ожем получить y g1 (x)

Далее для этих функций должны построить кривые.

Построение начинается от

z zmax т.к. оно наиболее близкое к наблюдателю

имеем y g1 (x) z max

и эта функция строится.

Иными словами на экране

y

 

 

i, j

z 1

 

 

 

y

 

 

i, j

z

 

 

i

 

х1 х хj

 

При следующем срезе

zi

строится новая функция

 

g

 

 

 

 

 

 

 

1

z max

 

 

 

 

 

 

 

 

 

 

 

z

max

z y

i

g

(x)

zi

 

 

 

1

 

y

i, j

g

1

(x

j

)

zi

 

 

 

 

если

1.yi, j zi yi, j zi 1

2.yi, j zi yi, j zi 1

то эта часть видна не видна.

Необходимо для каждого “ x j ” отслеживать “ yij max

”.

Для проверки (сравнения) видна точка или не видна.

 

Точки аппроксимируем отрезками, при этом получаем видимую и обратную сторону поверхности.

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

m – количество

Блок анализа

 

 

 

 

 

 

 

 

многоугольников

начало

 

 

 

 

 

начальная установка

 

 

 

 

 

Zmin=0 т.е. совпадает с плоскостью визуализации

 

i=1

 

 

 

 

 

 

 

i>m

 

да

конец

 

 

 

 

 

 

 

 

 

 

 

 

 

нет

 

 

взять i-ый многоугольник (наиболее дальний) с Zmax=min

 

проверка на отношение к предшествующему окну (если

i=i+1

оно было, т.е. не первый раз в цикле)

 

 

 

внутри пересечение пересечение

охватывает

вне

 

стороной

вершиной

окно

окна

 

*

проверка на отношение к текущему окну

*

да

Zмн-ка> Zокнаmin

 

Zокна =Zмн-ка

нет

?

в окне больше одного мн-ка и окна надо делить

конец

39. Алгоритм Вейлера-Азертона выявления видимости граней.

Он базируется на алгоритме Вейлера-Азейтона.

Он позволяет отсекать произвольные многоугольники произвольным окном.

1 этап:

Предварительная сортировка по zmax ↓ всех многоугольников

2 этап:

он связан с отсечением многоугольников на плоскости визуализации

берем самый удаленный многоугольник (т.е. тот который ближе к наблюдателю)

z

i

max

 

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

При этом формируется два списка многоугольников: внутренний список и внешний список.

1

y

 

2

проекции

 

0

на XOZ

z

 

x

1

2

I вариант

 

 

II вариант

1’

2’

один многоугольник

пересекает другой

 

 

 

1’’

 

III вариант

2’’

 

 

 

Если на первом этапе: после предварительной сортировки по zmax ↓ всех многоугольников получился следующий порядок многоугольников: 1, 2, то на втором этапе: 21

 

1

2н(1)

 

 

 

 

 

 

 

 

2

 

 

 

 

отсекатель

внутренний

внешний

 

 

 

список

список

 

 

12

 

 

1н(2)

 

1

1

 

 

 

21

2н

 

 

 

40. Алгоритм, использующий принцип трассировки лучей.

Н

Экран разбит на пиксели.

Находят точки пересечения луча со всеми объектами сцены (т.е. находят z для пиксельного элемента) для объектов i, j, k и т.д.

Далее их сортируют по z↑: zi , zk, zj , у того, где z максимум этим цветом и подкрашивают точку на экране.

Если лучи параллельны, то проходим по всем пикселям и формируем картинку.

75-95% времени алгоритма сводится к определению точек пересечения (т.е. z).

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

Не ищут точки пересечения, а сначала объект заменяют на сферичискую или кубовидную оболочку.

Кубовидная: ymax

ymin хmin хmax

хороша тем, что четко определены: хmin , хmax , ymin , ymax. Следовательно зная координаты луч (хi , хi) можем сразу сказать лежит

ли «х» в пределах хmin - хmax и «y» в пределах ymin - ymax или нет. Если нет, то переходим к рассмотрению следующего объекта.

Сферическая:

(x,y) - центр

если хi , yi: (xi xц )2 ( yi yц )2 Rоболочки2

то попадает в оболочку, тогда имеет смысл искать точки пересечения, иначе переходим к следующему объекту.

Соседние файлы в предмете Компьютерная Графика