Министерство образования РФ Восточно-Сибирский государственный технологический университет
Методическое пособие по курс...
35 downloads
202 Views
1016KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования РФ Восточно-Сибирский государственный технологический университет
Методическое пособие по курсу
“Интерактивные графические системы”
Под редакцией проф., д.т.н. В.В. Найханова
Улан-Удэ, 2002
Методическое пособие по курсу “Интерактивные графические системы” Для студентов изучающих компьютерную графику. В.В.Найханов, Ц.Ц.Цыдыпов, Т.В. Аюшеев, А.А. Дубанов, Д.В. Базархандаев, Б.Б.Будажапова Рецензент: к.т.н., доц. Баргуев С.Г.
© ВСГТУ, 2002
СОДЕРЖАНИЕ 1. СОСТАВНЫЕ КРИВЫЕ И СПЛАЙНЫ 1.1. Введение 1.2 Многочлен Лагранжа 1.3. Кусочно-кубические многочлены Эрмита 1.4 Кубические сплайны 1.4.1. Решение системы линейных уравнений методом прогонки. 1.5 Описание кривых в параметрическом виде 1.6 Практическое использование кубических параметрических сплайнов 1.6.1. Выбор шага интерполяции 1.6.2. Разбиение графической информации 1.6.3 Машинные методы построения аксонометрических изображений. Матричное преобразование системы координат. 1.7 Сглаживающая сплайн функция 2. СОСТАВНЫЕ ПОВЕРХНОСТИ 2.1. Общие замечания 2.2. Поверхности Кунса, определенные тензорным произведением 2.3. Поверхности на непрямоугольном каркасе 2.4. Определение коэффициентов поверхности 3. УДАЛЕНИЕ НЕВИДИМЫХ ЛИНИЙ И ПОВЕРХНОСТЕЙ 3.1 Построение графика функции двух переменных 3.2 Удаление невидимых линий. 3.2.1 Метод плавающего горизонта. 3.2.2 Алгоритм Робертса 3.2.3 Алгоритм Аппеля 3.3 Удаление невидимых граней. 3.3.1 Отсечение нелицевых граней 3.3.2 Метод z- буфера 3.3.3 Алгоритмы упорядочения 3.3.4 Метод сортировки по глубине 3.3.5 Метод двоичного разбиения пространства 3.3.6 Метод построчного сканирования 3.3.7 Алгоритм Варнака 4. ЗАКРАШИВАНИЕ 4.1 Закрашивание диффузионных и зеркальных поверхностей 4.2 Закраска методом Гуро 4.3 Закраска методом Фонга СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ ПРИЛОЖЕНИЕ
1. С О С ТА В Н Ы Е К Р И В Ы Е И С П Л А Й Н Ы 1.1. Введение Видное место в системах геометрического моделирования занимает конструирование кривых и поверхностей. При этом чаще всего возникает задача восполнения данных: имеется некоторое количество точек, через которые следует провести кривую. Это ни что иное, как классическая задача интерполяции. Интерполяция - частный случай более общей задачи аппроксимации (приближенного представления), возникающей при замене кривой, описываемой функцией сложной природы, другой кривой, в некотором смысле близкой заданной, имеющей более простые уравнения. Задача сглаживания кривой возникает, когда данные, используемые для ее восстановления, определены в результате измерений или эмпирически с некоторой погрешностью либо представляют кривую, описываемую функцией, недостаточно гладкой (например, не дифференцируемой или дифференцируемой всего несколько раз). Типичная задача интерполяции ставится следующим образом: по заданной таблице чисел (xi, f(xi)), i = 0,1,...,N восстановить функцию f(x) с той или иной точностью на отрезке [ a ,b] . Классический метод ее решения состоит в построении интерполяционного многочлена Лагранжа. 1.2 Многочлен Лагранжа Интерполяционный многочлен Лагранжа (рис 1.1) определенного равенством LN (x) =
N
∑ f (x ) L i =0
i
i
(1.1)
(x)
где Li (x) =
(x − x 0 )...(x − xi −1 )(x − xi +1 )...(x − x N ) . (xi − x 0 )...(xi − xi −1 )(xi − xi +1 )...(xi − x N )
(1.2)
y
a= x 0
xi
xN= b
Рис.1.1 График многочлена Лагранжа. Из определения Li (x) следует, что
x
Li (xj) = δij , i, j ∈[0, N ] , где δij - дельта-символ Кронекера: ⎧1, если i = j; δ ij = ⎨ ⎩0, если i ≠ j.
Многочлен Лагранжа - это единственный многочлен степени N, являющийся решением задачи. Вместе с тем интерполяционный метод Лагранжа на всем интервале [ x0 , x N ] имеет существенный недостаток: поскольку степень многочлена Лагранжа N соответствует числу узлов (плюс 1), любая попытка улучшить точность аппроксимации путем увеличения числа узлов влечет за собой увеличение степени многочлена. Однако при этом на кривой появляется «волнистость». Один из возможных путей решения этой проблемы - разбиение интервала [ x0 , x N ] на не несколько подинтервалов и «склейка» нескольких многочленов Лагранжа низких степеней. При этом можно достичь любой точности аппроксимации, но лишь ценой возможной не дифференцируемости объединенной аппроксимирующей функции в некоторых или во всех узлах. Таким образом, вместо волнистой кривой получается кривая с изломами. Оба эти эффекта в равной мере неприемлемы в машинном проектировании. Этот недостаток можно устранить, если склеивать не многочлены Лагранжа, а многочлены Эрмита. 1.3. Кусочно-кубические многочлены Эрмита
Пусть в узлах сетки Δ : а = x0 < x1 0 - некоторые весовые множители, определяющие относительный вес, согласовывающий сглаживание и аппроксимацию; u (х) - дважды непрерывно дифференцируемые функции. b
Так как кубический сплайн минимизирует
∫ ( u ′′ ) dx 2
(см. 1.9), то
a
естественно искать решение в классе кубических сплайнов. В задачах интерполирования большой выбор граничных условий использовался для того, чтобы возможно лучше приблизить заданную функцию. Здесь же известны лишь приближенные значения функции в узлах со случайными ошибками. Поэтому можно обойтись меньшим числом типов граничных условий. Будем предполагать, что s ′′ (а) = s ′′ (b) = 0 (1.32)
Так как требовать совпадения значений сплайна и интерполяционной функции в узлах сетки теперь нельзя, получим другое условие, которое будет вытекать из того, что функционал (1.31) минимизируется кубическим сплайном s (х). Для задачи сглаживания более удобно другое представление сплайна, в котором вместо mi присутствуют вторые производные Mi = S i′′ . Запишем условие линейности второй производной от кубического сплайна s (х) на участке [xi-1, xi]:
s ′′ (х)= M
i −1
xi − x x − xi −1 . + Mi hi hi
(1.33)
Здесь hi = xi - xi-1, Mi - коэффициенты сплайна. Граничными условиями будут M0 = MN = 0. Если рассмотреть выражение Ф. (u - s ), где u (x) - любая функция из заданного класса, а s (х) - сглаживающий сплайн, то после некоторых преобразований (интеграл берется по частям и используются граничные условия (1.32)) получим: Ф (u - s ) = Ф (u ) - Ф ( s ) - 2 с, где с =
N
X i −1
i =1
Xi
∑ Si′′′( u − S )
N
+∑ i =0
1 ( S i − y i )( ui − S i ) . Ri
(1.34)
Если потребовать, чтобы с = 0, то (1.35) Ф (u - s ) = Ф (u ) - Ф ( s ) ≥ 0 (Ф (u - s ) - положительно определенный функционал). Отсюда следует, что Ф ( s ) ≤ Ф (u), т.е. тогда кубический сплайн будет минимизировать рассматриваемый функционал. Из (1.33) можно определить S i′′′ . После простых преобразований условие с = 0 запишется следующим образом: s (xi) = yi - Ri Li , i = 0,1,...,N, (1.36) где
Li =
M i +1 − M i M i − M i −1 − hi +1 hi
-
(1.37)
скачок третьей производной в i - м узле. Для единообразия записи здесь введено: M-1 = MN+1 = 0, h0 hN+1 ≠ 0. Формула (1.36) заменяет условие s (xi) = yi интерполяционной задачи. Для определения коэффициентов Mi (i = 1,2,...,N-1) потребуем, чтобы функция s (х) и ее первая производная α (х) были непрерывны в узлах сетки, т.е. s (xi - 0) = s (xi + 0), s′ (xi - 0) = s′ (xi + 0). (1.38) Дважды интегрируя (1.33) и учитывая (1.36) и (1.38), получим для определения неизвестных коэффициентов систему N - 1 линейных алгебраических уравнений: (1.39) ci-2 Mi-2 + bi-1 Mi-1 + ai Mi + bi Mi+1 + ci Mi+2 = Fi ; a1 = c0 = b0 = 0; bN-1 = cN-1 = cN-2 = 0; ai =
1 1 1 2 1 1 ) Ri + Ri + ( + Ri +1 + ( hi + hi +1 ) ; 2 2 3 hi hi +1 hi hi +1
i = 1,2,...,N-1 ⎡ 1 ⎤ 1 1 1 1 1 + )Ri + ( + )Ri +1 ⎥ + hi +1 ; hi +1 hi + 2 ⎣ hi hi +1 ⎦ hi +1 6
bi = - ⎢(
(1.40)
i = 1,2,...,N-2 ci =
1 Ri +1 ; hi +1 hi + 2
i = 1,2,...,N-3;
Fi = (
y i +1 − yi y i − yi −1 − ). hi + 1 hi
Если весовые множители (R0, R1,..., RN) известны, то после решения пятидиагональной системы (1.39) методом прогонки (когда Ri малы) или методом немонотонной прогонки (при больших значениях Ri) и определения коэффициентов Mi значения сглаживающей функции в узлах находятся из соотношения (1.36). При Ri = 0 получаем из (1.39) систему уравнений для определения коэффициентов интерполяционного кубического сплайна. Отсюда следует, что чем точнее значение yi в узлах сетки, тем меньше должны быть величины весовых множителей Ri. Если при сглаживании возникает необходимость закрепить точку с номером k, то для этого надо потребовать, чтобы Rk = 0. При сглаживании обычно известны ошибки в определении значений yi, т.е. задаются неравенства | s (xi) - yi | ≤ δ i (i = 0,1,...,N). (1.41) Для полного решения задачи сглаживания было предложено строить интерполяционный процесс для определения Ri. Обозначив Ei = s (xi) - yi , (1.42) из (1.36) и (1.41) получим E δ (1.43) Ri = i ≤ i . Li
Li
В соответствии с (1.43) построим интерполяционный процесс для определения Ri , используя следующую формулу: δ Ri(j+1) = (i j ) , (1.44) Li
где j - номер итерации. Для получения начального приближения естественно положить (0) Ri = 0 и построить кубический сплайн, проходящий через заданные точки. Ясно, что если Li(j) = 0, то Ri(j+1) = 0. Можно показать, что итерации по формуле (1.44) сходятся. Действительно, перепишем (1.44) следующим образом: δi δ Ri(j+1) = Ri(j) ( j ) i ( j ) = Ri(j) . (1.45) ( j) Ri
Li
Ei
Отсюда видно, что если при j-й итерации для i-й точки неравенство (1.41) не выполнено ( |Ei(j) | > δ i ), то Ri(j+1) < Ri(j) , т.е. следующая (j + 1)-я итерация уменьшает весовой множитель Ri . Это способствует уменьшению Еi. С другой стороны, если на j-й итерации |Ei(j) | < δ i и Li(j) ≠ 0, то множитель Ri на следующей итерации увеличивается, что способствует более полному использованию «коридора» (1.41) в целях обеспечения большей гладкости сплайна.
Итерационный процесс должен продолжаться до тех пор, пока значения сплайна s (xi) в узлах сетки не окажутся в «коридоре». Для случая, когда ошибки в yi неизвестны, можно определить их следующим образом. При ручном сглаживании для оценки гладкости кривой в точке xi остальную часть ее фиксируют и освобождают опору, измеряя отклонение в i-м узле к первоначальному положению. Описав этот процесс математически с использованием кубических сплайнов, приходим к следующей формуле для определения δ i : δ i = Ai | Li |. (1.46) В случае предполагаемых грубых ошибок 2
2
h h Ai = 1 / 3 i i +1 . hi + hi +1
(1.47)
грубые ошибки не попадаются, то 3
⎛ hh ⎞ Ai = 1 / 3⎜ i i +1 ⎟ . ⎝ hi + hi +1 ⎠
(1.48)
При сглаживании кривых строится параметрический сглаживающий сплайн r (s) = x (s) i + y (s) j + z (s) k как совокупность трех сглаживающих сплайнов. Параметризацию будем брать по суммарной длине хорд. Отметим, что в ходе сглаживания изменяется расстояние между точками и поэтому на каждой итерации необходимо осуществлять пересчет параметров ~si . Пример сглаживания некоторой неоднозначной кривой приведен на рис.1.10 y
x
Рис. 1.10 Сглаживание кривой
2. С О С ТА В Н Ы Е П О В Е РХ Н О С Т И 2.1. Общие замечания
Поверхности агрегатов в технике, как правило, очень сложны и поэтому не могут быть представлены одним уравнением. Они проектируются с помощью набора поперечных сечений. После их определения строятся гладкие продольные кривые. Получается единая трехмерная форма. Для описания кривых такого каркаса чаще всего используются кубические параметрические сплайны. Каракас разбивает всю проектируемую поверхность на некоторую совокупность криволинейных четырехугольников - порций. Каждую такую порцию можно описать, используя метод, предложенный Кунсом. Уравнение поверхности в параметрическом виде в дифференциальной геометрии записывается как r = r (u, v), (2.1) где r (u, v) - радиус-вектор точки на поверхности. Это уравнение (2.1) соответствует трем скалярным уравнениям x = x (u, v); у = y (u, v); (2.2) z = z (u, v). Здесь u и v - параметры, которые изменяются в некотором диапазоне. 2.2. Поверхности Кунса, определенные тензорным произведением
Допустим, что u и v изменяются в пределах от 0 до 1 вдоль соответствующих границ порции (рис.2.1).
rv(0,1)
ru(0,1)
r(0,1) r(0,v)
ruv(0,0)
rv(u,1) v=1
ruv(1,1) rv(1,1)
r(u,1) r(1,1)
ru(1,1)
ru(0,v) u=0
r(u,v) rv(u,0)
u=1 ru(1,v)
r(1,v) ru(0,0) ruv(1,0) r(u,0) rv(1,0) rv(0,0) ru(1,0) v=0 ruv(0,0) r(0,0) r(1,0) Рис.2.1
Тогда r (u, v), 0