Министерство образования РФ Восточно-Сибирский государственный технологический университет
Методическое пособие по курс...
35 downloads
213 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 <...< xN = b даны значения некоторой функции f (x) и ее производной f / (x): fi = f (xi), f i ′ = f (xi ) , i = 0,1,...,N. Требуется построить кусочно-кубический полином Эрмита pн(х), удовлетворяющий условиям: 1) на каждом промежутке [ xi −1 , xi ] (i = 1,2,...,N) pн(х) = aio + ai1 (х -хi-1) + ai2 (х -хi-1)2 + ai3 (х -хi-1)3 ; (1.3) 2) Рн (хi) = fi,
P ′ (хi) = f i ′ , н
i = 0,1,...,N.
Очевидно, что вторая производная такого многочлена, вообще говоря, разрывна в узлах сетки Δ . Учитывая условия интерполяции, для вычисления коэффициентов aiα ( α = 0,1,2,3) для каждого i имеем систему уравнений, определяемую равенствами: pн (хi-1) = fi-1, pн (хi) = fi, ′ p H (хi-1) = f i −′ 1 , p ′H (хi) = f i ′ . Если ввести обозначения hi = xi - xi-1, то на участке [xi-1, xi] получим систему уравнений для определения aia :
ai0 = fi-1; ai0 + ai1 hi + ai2 hi2 + ai3 hi3 = fi; ai1= f i −′ 1 ; ai1 + 2ai2 hi + 3ai3 hi2 = f i ′ . Отсюда находим неизвестные коэффициенты: ai0 = fi-1; ai1= f i −′ 1 ; f′ 3(f -f ) 2f ′ i i-1 − i-1 − i ; h h h2 i i i 2(f -f ) f ′ f′ i-1 i + i+1 + i . ai3 = 2 2 h h h3 i i i
ai2 =
(1.4)
Введем обозначение u = (x - xi-1) / hi. Подставляя (1.4) в (1.3) и собирая члены при fi-1, fi, f i −′ 1 и f i ′ , получим Рн (х) = f i-1α o (u) + f i α 1(u) + [ f i ′−1 β0 (u) + f i ′β1(u)] hi . (1.5) ,где α o (u) = 1- 3u2 + 2u3; α 1 (u) = 3u2 - 2u3; β 0 (u) = u - 2u2 + u3; (1.6) 2 3 β 1 (u) = -u + u есть функции Эрмита третьей степени. Их графики изображены на рис.1.2. График полинома Эрмита представлен на рисунке 1.3. 1
1
1
1
α0()
α1()
β0()
β1()
0
1u
0
1u
0
1u
0
Рис. 1.2 Функции сопряжения многочлена Эрмита. y
x xi a=x 0 x N =b Рис.1.3 График кусочно-кубического многочлена Эрмита
1u
Иногда эти функции называют функциями сопряжения. Как видно из (1.5), с помощью первых двух функций сопрягаются значения fi-1 и fi, а посредством двух других - производные f i −′ 1 и f ′ , в результате чего i
получается «сглаженное» объединение Рн (х) на участке [xi-1, xi]. Возникает вопрос: что делать, если производные f ′ в узлах сетки Δ i
неизвестны? Наиболее простым выходом из этой ситуации является определение первых производных по разделенным разностям вида: f i − f i −1 f − fi , i = 1,2,...,N-1 + μι i + 1 hi hi f − f0 f − f1 f ′ = ( 1 + μ1 ) 1 − μ1 2 0 h1 h2 f − f N-2 f − f N-1 f N′ = − λ N −1 N-1 + ( 1 + λ N −1 ) N h N-1 hN f ′ = λι i
(1.7)
где μi =
hi , hi + hi + 1
λi = 1 − μ i .
(1.8)
Такой способ вычисления производных по природе своей процесс неточный. Получаемые результаты слишком глупы для того, чтобы их использовать в сравнительно точной формуле Эрмита. Другой способ определения первых производных приводит к понятию кубического сплайна. 1.4 Кубические сплайны
Кусочно-полиномиальное приближение функции получило название сплайн-приближения. Сплайнами называются функции, которые склеены из различных кусков многочленов с однородной структурой (составлены из многочленов одной и той же степени). Простейший пример - ломаные. По своей природе такие сплайны негладкие функции. Кусочно-кубические функции Эрмита (другой пример сплайнов) - это кубические сплайны дефекта 2, т.е. сплайны с непрерывной первой производной. Сплайны с непрерывной второй производной будем называть сплайнами дефекта 1. Сплайн, на всем отрезке [а, b] совпадающий с кубическим полиномом, назовем сплайном дефекта 0. Термин «сплайн» произошел от английского слова spline. В переводе это «рейка» - приспособление, которое применяют чертежники для проведения гладких кривых через заданные точки. Возьмем гибкую стальную линейку, поставим ее на ребро и поместим между опорами, которые расположены в заданных точках (рис.1.4).
y
xi a=x 0 x N =b Рис.1.4 Кубическая сплайн-функция
x
Согласно закону Бернулли-Эйлера, линеаризованное дифференциальное уравнение изогнутой оси линейки имеет вид: EI s ′′ (х) = - М (х), где s ′′ - вторая производная прогиба; М (х) - изгибающий момент, изменяющийся линейно от одной точки опоры к другой; EI - жесткость. Проинтегрировав это уравнение, получим, что функция s (x), описывающая профиль линейки, является кубическим многочленом между двумя соседними точками и дважды непрерывно дифференцируемой функцией на всем промежутке интегрирования. Таким образом, профиль линейки описывается кубическим сплайном дефекта 1 или просто кубическим сплайном. Для определенности задачи на концах должны быть заданы краевые условия, в частности, при отсутствии внешних нагрузок на линейку s ′′ (х0) = s ′′ (хN) = 0. Кубические сплайны обладают рядом замечательных свойств, которые обеспечили их успех в приложениях. Во-первых, это функции наименьшей степени, имеющие непрерывные вторые производные. Вовторых, алгоритмы построения кубических сплайнов очень просты и эффективно реализуются на ЭВМ, причем влияние ошибок округления при вычислениях оказывается незначительным. Кроме того, кубические сплайны обладают интересными экстремальными свойствами, связанными с тем фактом, что профиль рейки, проходящей через заданные точки с краевыми условиями s ′ (х0) = f ′ (х0) и
s ′ (хN) = f ′ (хN)
или s ′′ (х0) = s ′′ (хN) = 0, принимает форму, при которой потенциальная энергия минимальна. В линейном приближении это выражается соотношением b
∫ [ s ′′(x)] a
2
b
dx ≤ ∫ [ f ′′(x)] dx , a
2
(1.9)
где равенство имеет место только для f (x) = s (x). Пусть s (хi) = fi. Введем обозначение s ′ (xi) = mi, i = 0,1,...,N. Тогда на каждом интервале[xi-1, xi] согласно (1.5) s( x ) = f i −1α 0 ( u ) + f iα 1 ( u ) + [ mi −1β0 ( u ) + mi β1 ( u )] hi . (1.10) Интерполяционный кубический сплайн строится из условия непрерывности второй производной во внутренних узлах сетки. Поскольку
s ′′(x) =
f i − f i −1 hi
2
(6 − 12u) +
mi − 1 ( − 4 + 6u) mi ( − 2 + 6u) + , hi hi
(1.11)
находим отсюда односторонние пределы вторых производных: s ′′( x i + 0 ) = 6
f i +1 − f i
s ′′( x i − 0 ) = −6
hi +1
2
−
f i − f i −1 hi
2
4mi + 2mi +1 hi + 1
2mi −1 + 4mi + hi
(1.12)
Из требования непрерывности второй производной в точках хi (i = 1,2,...,N-1) s ′′ (хi + 0) = s ′′ (хi - 0) находим
λi mi −1 + 2mi + μ i mi +1 = ci .
(1.13)
f i +1 − f i f − f i −1 + λi i ). hi + 1 hi
Здесь ci = 3( μ i
Чтобы определить величины m0, mi,..., mN, надо задать два дополнительных условия (так называемые «краевые» условия). Из всего многообразия краевых условий будем рассматривать только два типа (заданы первые или вторые производные): s ′ (b) = f ′ (b) 1. s ′ (а) = f ′ (а), 2. s ′′ (а) = f ′′ (а), s′′ (b) = f ′′ (b). Тогда получим систему для определения mi: * * 2m0 + μ 0 m1 = c0 ; λi mi −1 + 2mi + μ i mi +1 = ci ; λ N * m N −1 + 2m N = c N * . В (1.14) для условий типа 1: μ0 * = λ N * = 0 , * c0 = 2 f 0′ , * c N = 2 f N′ , а для условий типа 2 согласно (1.12): μ0 * = λ N * = 1 ,
(1.14)
f 1 − f 0 h1 − f 0′′ , h1 2 f − f N −1 h N =3 N − f N′′ . hN 2
c0 = 3 *
cN
*
Матрица системы (1.14) в этих случаях является матрицей с диагональным преобладанием. Такие матрицы невырождены, потому система имеет решение, и притом единственное.
1.4.1. Решение системы линейных уравнений методом прогонки.
Во всех рассматриваемых случаях для нахождения величин уi необходимо решать трехдиагональную систему линейных алгебраических уравнений типа: ⎤ ⎡α ⎤ ⎡a 1 b1 0 ... 0 0 0 ⎤ ⎡ y1 1 ⎢ ⎢c a b ... 0 ⎢ 2 2 2 ⎢ ⎢⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⎢ ⎢0 0 0 ... c N −1 ⎢ ⎢0 0 0 ... 0 ⎣
⎥ 0 0 ⎥ ⎥ ⎥ ⋅ ⋅ ⋅ ⎥ ⎥ a N −1 b N −1 ⎥ ⎥ cN aN ⎥ ⎦
⎢ ⎢ ⎢ y2 ⎢ ⎢M ⎢y ⎢ N −1 ⎢ ⎢yN ⎣
⎥ ⎢ ⎥ ⎢ ⎥ ⎢α 2 ⎥ ⎢ ⎥ = ⎢M ⎥ ⎢α ⎥ ⎢ N −1 ⎥ ⎢ ⎥ ⎢α N ⎦ ⎣
⎥ ⎥ ⎥ ⎥ ⎥. ⎥ ⎥ ⎥ ⎥ ⎦
(1.15)
Такие системы эффективно решаются методом прогонки. Решение будем искать в виде i = 1,2,...,N-1. (1.16) yi = vi yi+1 + ui , Используя выражение для из yi-1 (1.16) yi-1 = vi-1 yi + ui-1 , исключим это неизвестное из i-го уравнения системы (1.15): ci yi-1 + ai yi + bi yi+1 = α i . Получим (1.17) (ai + ci vi-1) yi + bi yi+1 = α i - ci ui-1. Сравнивая (1.17) с (1.16), выводим рекуррентные формулы для прогоночных коэффициентов vi , ui (прямая прогонка): v0 = u0 = 0; bi ; a i + ci v i −1 α −c u ui = i i i −1 , a i + ci vi −1 vi = −
(1.18) i = 1,2,...,N-1.
Очевидно, что yN = uN. Все остальные неизвестные находятся по формулам (1.16) (обратная прогонка).
1.5 Описание кривых в параметрическом виде В общем случае в задачах машинного проектирования кривые не могут быть записаны в виде уравнения y = f (x) c использованием обычных однозначных функций. Первая причина этого в том, что формы объектов в технике не должны зависеть от системы координат. Кроме того, кривые инженерных объектов могут иметь вертикальные касательные, что тесно связано с многозначностью функций. Правда, кривая, заданная в неявном виде F (x, y) = 0, свободна от этого недостатка. Но для такой функции при вычислении текущих координат точек приходится каждый раз решать в
общем случае нелинейное уравнение F (x, y) = 0 от одного неизвестного х или у. Поэтому в машинном проектировании ведущую роль играет параметрическое представление участков кривых. Например, кривая на плоскости представляется не функцией вида y = f (x) или F (x, y) = 0, а парой функций x = x (s) и y = y (s) от параметра s (рис 1.5 a,б). Вид самой функции представлен на рисунке 1.5. y(s) x(s) 2 8 4 3 3 8 1
5
1
2
6
7 4
7 s
a)
5
6 s
б)
y
8 2
1
3
7 4
6
5 х
c)
Рис. 1.5 Плоская параметрическая сплайн-функция. В общем случае точка на пространственной кривой задается векторфункцией вида r = r (s) = x (s) i + y (s) j + z (s) k, (1.19) где i, j и k - единичные орты декартовой системы координат. В дальнейшем под функцией r = r (s) будем подразумевать радиусвектор точки на пространственной кривой , либо одну из следующих функций: x = x (s), y = y (s) или z = z (s) (рис 1.6 а,б,с). x(s) 3
2
6
2
8
5
a)
z(s)
у(s)
7
4
1
s
б)
4 3
5 7
6
1
3
с)
8
1 4
8
4
7
6 2
7 6
2
s
5
3
8
1
z
5
х
y Рис. 1.6 Пространственная (3D) параметрическая сплайн-функция.
s
Такое параметрическое задание кривых не только позволяет избежать упомянутые выше трудности, но, кроме того, дает возможность более простого вычисления текущих координат точек по изменяющимся значениям параметра кривой, что упрощает расчет информации при воспроизведении плоских кривых на графических дисплеях и оборудовании с программным управлением (графопостроители, станки с ЧПУ). Очевидно, что параметр s лучше всего выразить через длину дуги, однако на практике мы не можем установить длину дуги, пока не вычислим кривую, а чтобы это сделать, нужно знать длину дуги. Наиболее естественен альтернативный подход - использовать накопленную (суммарную) длину хорд, т.е. взяв s0 = 0, определить (1.20) si = si-1 + | ri - ri-1 |, i = 1,2,...,N, где | ri - ri-1 | = ( x i − x i −1 ) 2 + ( y i − y i −1 ) 2 + ( zi − zi −1 ) 2 . Можно начать с кривой, параметризованной таким способом, и затем, используя итерационный процесс, получить кривую, параметризованную по длине дуги. Поскольку разница между такими кривыми невелика, ограничиваются параметризацией по суммарной длине хорд. Для этого строят три сплайна, зависящие от s и проходящие через точки (xi, si), (yi, si), (zi, si) соответственно. Для определения коэффициентов параметрического сплайна необходимо решать три системы методом прогонки. Они различаются только правыми частями. Нетрудно видеть, что в формулах (1.18) ai + ci vi-1 не зависят от правых частей этих систем. величины vi и Поэтому, если вычислить их и запомнить, для решения каждой из трех систем потребуется меньше арифметических операций. Суммарная длина хорд - это приближение к длине дуги, поэтому можно считать, что | mi | = | ri ′ | ≈ 1. В таком случае в любом узле кривой можно вычислить производные, если задать дополнительную точку rg, лежащую на касательной к кривой: ri ′ =
rg − ri rg − ri
.
(1.21)
Из типа 2 краевых условий ограничимся случаем r ′′ = 0 на краях интервала. Точки, в которых заранее будут задаваться первые производные (или равные нулю вторые производные, если первые производные неизвестны), назовем характерными. Прогонку для решения систем уравнений будем осуществлять по участкам от одной характерной точки до другой. Таким образом, появляется возможность аппроксимировать кривую, состоящую из (N + 1) точек с (К + 1) характерными точками, где K ≤ N . Очевидно, что первая и последняя точки всегда должны быть характерными. Минимальное количество участков для прогонки - 1, максимальное - N. Для параметрического кубического сплайна по аналогии с (1.10) можно записать уравнение кривой на участке [si-1, si]:
r ( s ) = ri −1α 0 ( u ) + ri α i ( u ) + [ mi −1 β 0 ( u ) + mi β 1 ( u )]hi ,
(1.22) u = (s - si-1) / hi , а mi - неизвестные векторы, которые где hi = si - si-1, определяются из решения трех систем. Пусть mi-1 = mi =
ri − ri −1 , hi = | ri - ri-1 |. ri − ri −1
(1.23)
Тогда из (1.22) следует, что r ( s ) = ri −1α 0 ( u ) + ri α i ( u ) + ( ri − ri −1 )[ β 0 ( u ) + β 1 ( u )] = ri −1 [ α 0 ( u ) − β 0 ( u ) − β 1 ( u )] + ri [ α 1 ( u ) + β 0 ( u ) + β 1 ( u )] = ri ( 1 − u ) + ri u - прямая линия. Таким образом, задача введения на кривой прямолинейных участков решается просто. Если на кривой необходимо ввести излом (разрыв первой производной), то рассматриваемый узел следует повторить дважды, что будет соответствовать неравным двусторонним значениям первых производных (коэффициентов сплайнов). 1.6 Практическое использование кубических параметрических сплайнов 1.6.1. Выбор шага интерполяции
δ Λ/
ρ−δ
ρ
Рис.1.7 и шаг по параметру
Одна из задач, которая чаще всего возникает в приложениях, вычерчивание кривых на графопостроителях. При этом возникает вопрос выбора шага при линейной интерполяции. В случае малых шагов приемлемой аппроксимацией кривой служит ее соприкасающаяся окружность, так что кривизну кривой в данном месте можно использовать для определения длины шага. Используя теорему Пифагора, можно записать, что L2 = 4δ ( 2 β − δ ) ≤ 8 ρδ ,
L = 2 2 ρδ . Здесь δ - максимальное отклонение кривой от хорды (рис.1.7); ρ=
( x ′ 2 + y ′ 2 )3 / 2 . x ′y ′′ − y ′x ′′
(1.24) (1.25)
1.6.2. Разбиение графической информации
Следующая задача - разбиение графической информации на плазовые листы. С практической точки зрения все сводится к случаю, когда кривая полностью не умещается на прямоугольнике (плазовом листе).
Легко заметить, что участки кривой, которые необходимо вычерчивать на листе, чередуются с участками, которые чертить не требуется. При использовании параметрических сплайнов процедура разбиения на плазовые листы упрощается. P3 B A P1
P8
P2
P6 P0 C
P4
P5
Pк
P7 D
Рис. 1.8 Разбиение графической информации Найдем координаты точек пересечения кривой с краями листа, а также параметры этих точек. Включим в полученную таблицу начальную и конечную точки кривой. В рассматриваемом примере (рис.1.8) (1.26) P0, P1, P2, P3, P4, P5, P6, P7, P8, Pk. Упорядочим точки по возрастанию параметра: P0, P6, P1, P2, P4, P5, P3, P8, P7, Pk. (1.27) Выбросим из полученной таблицы одинаковые точки (случай прохождения кривой через угол листа): (1.28) P0, P6, P1, P2, P4, P5, P3, P7, Pk. После этого можно получить таблицу границ для черчения кривой. Черчение начинается с первого участка, если начальная точка лежит на поле листа; если не лежит, - то со второго. В рассматриваемом примере начальная точка не лежит на плазовом листе, поэтому черчение должно начинаться со второй точки таблицы (1.28). Получаем границы черчения: (1.29) [P6, P1], [P2, P4], [P5, P3], [P7, Pk]. Другая практическая задача - пересечение пространственной кривой с плоскостью или плоской кривой с прямой (этот случай уже возник при разбиении графической информации на плазовые листы). Если плоскость задавать в неявном виде Ax + By + Cz + D = 0, то все сводится (при использовании кубических параметрических сплайнов) к решению кубического уравнения относительно параметра s: F (s) = Ax (s) + By (s) + Cz (s) + D = 0. (1.30) Все действительные корни такого уравнения можно найти, применив формулу Кардана. При этом лучше всего решение искать в тригонометрической форме.
Если корни уравнения (1.30) отделены, часто пользуются методом хорд. Если известно хорошее начальное приближение, можно применить метод Ньютона. 1.6.3 Машинные методы построения аксонометрических изображений. Матричное преобразование системы координат.
При построении аксонометрических изображений технического объекта необходимо иметь полное представление в ЭВМ пространственной структуры объекта. Должны быть четко обозначены все простые элементы, из которых состоит объект - точки, прямые, окружности и т. д. Многогранники можно описать двумя способами: 1. Списком ребер, где каждое ребро - прямая, определяемая двумя своими точками . 2. Набором плоских граней многоугольников, т. е. упорядоченным набором координат вершин. Криволинейные поверхности можно представлять в виде математических формул (уравнение сферы, эллипсоида и т.д.) или аппроксимировать многогранниками - это наиболее простой и универсальный способ описания сложных поверхностей. При таком способе представления поверхности легко в матричной, удобной для ЭВМ, форме осуществлять различные преобразования (вращение, перенос, масштабирование и т.д.) трехмерных объектов. Такие преобразования сведутся к преобразованию координат вершин аппроксимирующего многогранника. Представление технических объектов в ЭВМ должно отвечать следующим требованиям: 1. Компактность и однозначность описания. 2. Легкость построения изображения произвольного многогранника на экране дисплея. 3. Удобство преобразования, деформирования, присоединения объекта к другим объектам. 4. Удобство математического описания для решения метрических и позиционных задач на поверхности. Известно, что изображение фигуры есть совокупность изображений всех ее точек, поэтому рассмотрим алгоритмы построения изображения точек на экране дисплея. Матричная форма записи является естественной при машинном формировании геометрических изображений. Это приводит использованию однородных координат, которые лежат в основе алгоритмов формирования геометрических изображений. Дадим кратко необходимые сведения об однородных координатах. Точка в пространстве (т.е. в трехмерной системе) с действительными координатами Χ,Υ,Ζ будет в однородных координатах отражаться четырехкомпонентным вектором-строкой [Χ,Υ,Ζ1], где 1 - однородный
член, либо как некоторое кратное этого вектора, например [ωx ωy ωz ω] , где ω - произвольное число. Точку в однородных координатах можно обозначить строчными буквами [x y z ω] , это та же самая точка, поскольку ее координаты Χ,Υ,Ζ всегда можно найти, разделив их на однородный член ω, т. е. Χ=x/ω, Υ=y/ω, Ζ = z / ω. Таким образом, действительные координаты точки Χ, Υ, Ζ получаются делением компонент вектора-строки на его четвертый компонент. Пример 1. Уравнение прямой Ax + By = C в матричной форме ⎡ A ⎤ ] ⎢⎢ B ⎥⎥ = 0 . Без учета знака С запишем: ⎢⎣− C ⎥⎦ ⎡ A⎤ ⎡ A⎤ [ x y ω ] ⎢⎢ B ⎥⎥ = 0 . Назовем [ x y 1 ] - матрицей координат точек и ⎢⎢ B ⎥⎥ ⎢⎣C ⎥⎦ ⎢⎣C ⎥⎦
⎡ A⎤ запишется [ x y ] ⎢ ⎥ = C или [x y 1 ⎣ B⎦
матрицей координат линий. Пример 2. Уравнение двух прямых x + y = 1 и 3x - 5y = 0 можно записать в следующем виде: ⎡1 3 ⎤ [ x y ]⎢ ⎥ = [ 10 ] ⎣1 − 5⎦
или
3⎤ ⎡1 ⎢ [x y 1 ] ⎢ 1 − 5⎥⎥ = [ 0 0 ] . ⎢⎣− 1 0 ⎥⎦
Получим матрицу 3х2 , которую трудно обращать. преобразование , не нарушающее это равенство , тогда
Проведем
3 0⎤ ⎡1 ⎢ [ x y ω ] ⎢ 1 − 5 0⎥⎥ = [ x y ω ]. ⎢⎣− 1 0 1⎥⎦
Для новой квадратной матрицы легко найти обратную матрицу. Однородные координаты и матричная запись позволяют сделать уравнения более симметричными и облегчают решение многих задач на ЭВМ. Пример 3. Параболу x = y2 можно представить в параметрическом виде уравнением x = u2 . где y = u . Любую точку на этой параболе можно представить в матричной форме уравнением: ⎡1 0 0⎤ [ x y 1 ] = [ u u 1] ⎢⎢0 1 0⎥⎥ = [ u2 u 1]. ⎢⎣0 0 1⎥⎦ 2
Матрица 3х3 является матрицей преобразования исходной кривой в другие кривые. К этой матрице преобразования можно добавлять матрицы масштабирования , сдвига , поворота и т. д.
Матричное представление формул преобразования Приведем формулы линейных преобразований: в пространстве на плоскости x` = a1x + b1y + d1 , x` = a1x + b1y + c1z + d1 , y` = a2x + b2y + d2 , y` = a2x + b2y + c2z + d2 , z` = a3x + b3y + c3z + d3 . Для реализации на ЭВМ удобнее представить их в матричном виде. Матричная форма записи преобразований позволяет представлять последовательность различных преобразований в виде единого преобразования ( совмещение преобразований ) . Конструктор должен иметь возможность увеличивать масштаб изображения фигуры, чтобы подробнее рассмотреть на экране дисплея интересующую его часть изображения или вращать изображение на экране и рассматривать его со всех сторон. Рассмотрим одновременно двумерные и трехмерные преобразования, позволяющие легко вычислить координаты новой точки ( x`, y`, z` ) по координатам ( x , y , z ) исходной точки: ⎡a1 a 2 ⎢b b [ x` y` z` 1 ] = [ x y z 1 ] ⎢ 1 2 ⎢ c1 c2 ⎢ ⎣d 1 d 2
a3 b3 c3 d3
0⎤ 0⎥⎥ ; 0⎥ ⎥ 1⎦
⎡ a1 [ x` y` 1 ] = [ x y 1 ] ⎢⎢ b1 ⎢⎣d1
a2 b2 d2
0⎤ 0⎥⎥ . 1⎥⎦
Добавление единичного элемента не меняет сути формул, однако, позволяет получить квадратную матрицу, с которой легко производить вычисления (умножение) матриц. Частные виды преобразований: 1. Перемещение. Преобразование перемещения ( сдвига ) исходной точки ( x , y , z ) в новое положение ( x`, y`, z` ) выражается в следующей форме: ⎡1 ⎢0 [ x` y` z` 1 ] = [ x y z 1 ] ⎢ ⎢0 ⎢ ⎣⎢Τx
0
0
1
0
0 Τy
1 Τz
0⎤ 0⎥⎥ ; 0⎥ ⎥ 1⎦⎥
⎡1 ⎢ [ x` y` 1 ] = [ x y 1 ] ⎢ 0 ⎢Τx ⎣
0 1 Τy
0⎤ ⎥ 0⎥ , 1⎥⎦
где Τx , Τy , Τz - величины перемещения в направлениях x , y и z соответственно . 2. Вращение. Поворот точки ( x , y ) в двумерном преобразовании на угол ϕ по часовой стрелке относительно начала координат определяется по формуле : ⎡cos ϕ [ x` y` 1 ] = [ x y 1 ] ⎢⎢ sin ϕ ⎢⎣ 0
− sin ϕ
cos ϕ 0
0⎤ 0⎥⎥ . 1⎥⎦
Вращение в комбинации с перемещением можно использовать для вращения точек плоской фигуры вокруг любой точки. Например , точка ( x ,
y ) поворачивается на угол ϕ по часовой стрелке относительно какой-либо точки М ( xМ , yМ) . Уравнение преобразования вращения применяется только для поворота точек относительно начала координат, поэтому вначале необходимо сдвинуть точку ( x , y ) так, чтобы точка М ( xМ , yМ) стала началом координат ⎡ 1 [ x` y` 1 ] = [ x y 1 ] ⎢⎢ 0 ⎢⎣− x M
0⎤ 0⎥⎥ , 1⎥⎦
0 1 − yM
затем произвести поворот точки (x`,y`) на угол ϕ: ⎡cos ϕ [ x`` y`` 1 ] = [ x` y` 1 ] ⎢⎢ sin ϕ ⎢⎣ 0
− sin ϕ
cos ϕ 0
0⎤ 0⎥⎥ . 1⎥⎦
Возвратим начало системы координат в исходное положение, т.е. произведем обратный сдвиг: ⎡1 [ x``` y``` 1 ] = [ x`` y`` 1 ] ⎢⎢ 0 ⎢⎣ x M
0⎤ 0⎥⎥ . 1⎥⎦
0 1 yM
Для конкретных значений xМ , yМ и ϕ можно эту последовательность преобразований представить как одно преобразование (совмещенное). При совмещении не должен нарушаться порядок выполнения преобразований : ⎡ 1 [ x`` y`` 1 ] = [ x y 1 ] ⎢⎢ 0 ⎢⎣− x M
0 1 − yM
0⎤ 0⎥⎥ 1⎥⎦
⎡cos ϕ ⎢ sin ϕ ⎢ ⎢⎣ 0
− sin ϕ
cos ϕ 0
0⎤ 0⎥⎥ 1⎥⎦
⎡1 ⎢0 ⎢ ⎢⎣ x M
0 1 yM
0⎤ 0⎥⎥ . 1⎥⎦
Эту формулу можно использовать для вращения фигуры вокруг любой точки. Применение совмещенного преобразования обеспечивает компактную запись и уменьшает объем вычислений. Трехмерные преобразования вращения сложнее двумерных преобразований. Здесь необходимо задать направление и расположение оси вращения . Вначале рассмотрим вращение вокруг координатных осей. Вращение вокруг координатной оси X, проходящей через точку (0,0,0), выражается матрицей: 0 ⎡1 ⎢0 cos ϕ [ x` y` z` 1 ] = [ x y z 1 ] ⎢ ⎢0 sin ϕ ⎢ 0 ⎣0
0 − sin ϕ cos ϕ 0
0⎤ 0⎥⎥ . 0⎥ ⎥ 1⎦
Здесь угол поворота ϕ берется по часовой стрелке вокруг начала координат , если смотреть в направлении начала координат из точки, расположенной на положительной полуоси X . Вращение вокруг координатной оси Y выражается матрицей:
⎡ cos ϕ ⎢ 0 [ x` y` z` 1 ] = [ x y z 1 ] ⎢ ⎢− sin ϕ ⎢ ⎣ 0
0 sin ϕ 1 0 0 cos ϕ 0 0
0⎤ 0⎥⎥ . 0⎥ ⎥ 1⎦
Вращение вокруг координатной оси Z, проходящей через начало координат, выражается матрицей: ⎡cos ϕ ⎢ sin ϕ [ x` y` z` 1 ] = [ x y z 1 ] ⎢ ⎢ 0 ⎢ ⎣ 0
− sin ϕ cos ϕ 0 0
0 0 1 0
0⎤ 0⎥⎥ . 0⎥ ⎥ 1⎦
Вращение вокруг произвольной оси описывается комбинацией простейших преобразований и выполняется в пять этапов: 1) перенос объекта в новую координатную систему с началом координат в любой точке (x,y,z) на прямой оси вращения (матрица Т); 2) совмещение единичного вектора оси X (0,0,1) с вектором направляющих косинусов (a,b,c) оси вращения путем поворота координатной системы вокруг осей X и Y (матрицы R и Q); 3) поворот новой координатной системы на угол ϕ вокруг оси X (матрица F); 4) выполнение преобразования, обратного произведенному на втором этапе (матрицы R-1 и Q-1); 5) выполнение преобразования, обратного произведенному на первом этапе (матрица Т-1) . 6) На 4-м и 5-м этапах происходит возвращение объекта в исходную систему координат. Таким образом, полное преобразование можно записать как Т R Q F R-1 Q-1 Т-1 . 3. Масштабирование. Применяется для увеличения или уменьшения изображения фигуры относительно ее начального размера . Увеличение или уменьшение фигуры производится относительно начала системы координат по формуле ⎡S x ⎢0 [ x` y` z` 1 ] = [ x y z 1 ] ⎢ ⎢0 ⎢ ⎣0
0 Sy 0 0
0 0 Sz 0
0⎤ 0⎥⎥ . 0⎥ ⎥ 1⎦
Если Sx , Sy , Sz – коэффициенты масштабирования не равны между собой, то это приводит к искажению изображения за счет неодинакового изменения размеров фигуры по направлениям координатных осей. Отрицательные значения величин Sx , Sy , Sz дают зеркальное отображение фигуры .
1.7 Сглаживающая сплайн функция
В практических задачах (результаты эксперимента, измерений) некоторая функция у(х) задается в отдельных точках, где известны ее приближенные значения. Тогда применение обычной интерполяции кубическими сплайнами приводит к существенным ошибкам. у
x
Рис. 1.9 Аппроксимация заданных точек. Если погрешности исходных данных относительно велики, то это крайне неблагоприятно влияет на поведение интерполяционного сплайна и особенно его производных, их график имеет резко выраженные осцилляции. В таком случае строят сплайн, проходящий вблизи заданных значений, но более «гладкий», чем интерполяционный (рис.1.9). Такой сплайн называется сглаживающим, а процедура его построения - сглаживанием. В работах Шенберга, Райнша, Завьялова и др. эта задача сглаживания сформулирована как задача о минимизации функционала, в качестве которого используется интеграл от квадрата второй производной, а в качестве величины, ограничивающей возможное смещение функций в узлах, берется сумма квадратов уклонения с различными весовыми множителями. Было предложено строить сглаживающий сплайн из условия минимизации функционала: b
N
a
i =0
Ф(u) = ∫ ( u ′′ ) 2 dx + ∑
1 [ u( x i ) − y i ] 2 . Ri
(1.31)
Здесь Ri > 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
где
F (u) = [ α 0 (u), α 1 (u), β 0 (u), β 1 (u)] - матрица-строка; FT (v) = [ α 0 (v), α1 (v), β 0 (v), β 1 (v)]T - матрица-столбец;
(2.7)
(2.8)
Т - символ транспонирования; ⎡r ( 0 ,0 ) ⎢ ⎢ ⎢r ( 1,0 ) Q= ⎢ ⎢ ⎢ru ( 0 ,0 ) ⎢ ⎢ru ( 1,0 ) ⎢⎣
r ( 0 ,1 )
rv ( 0 ,0 )
r ( 1,1 )
rv ( 1,0 )
ru ( 0 ,1 )
ruv ( 0 ,0 )
ru ( 1,1 )
ruv ( 1,0 )
rv ( 0 ,1 ) ⎤ ⎥ ⎥ rv ( 1,1 ) ⎥ ⎥. ⎥ ruv ( 0 ,1 ) ⎥ ⎥ ruv ( 1,1 )⎥ ⎥⎦
(2.9)
Заметим, что порция поверхности (2.7) полностью определена через векторы r, ru, rv и ruv в ее четырех углах. Порция поверхности этого типа определяется тензорным (или декартовым) произведением. Понятие «тензорное произведение» связано с тем обстоятельством, что матрица (2.9) зависит не от скаляров, а от векторов, и поэтому представляет собой тензор. Если строить составную поверхность их таких бикубических порций, можно легко обнаружить, что достигается непрерывность градиента во всех граничных точках порций. Действительно, ru (u, v) = Fu (u) QT F (v). Отсюда ru (i, v) = α 0 (v) ru (i, 0) + α 1 (v) ru (i, 1) + β 0 (v) ruv (i, 0) + β 1 (v) ruv (i, 1); ru (i, 0) и ru (i, 1) непрерывны на каркасе (это коэффициенты кубического параметрического сплайна). Если при этом сделать непрерывными ruv в углах порции, то составная поверхность будет непрерывна до первой производной. Недостатки такого метода обнаруживаются, когда пытаются описать поверхность порции на непрямоугольной области, т.е. когда разбиение по каркасу неравномерное. В этом случае противоположные границы порции имеют различные параметрические длины. В реальных условиях дело обстоит именно так: линии каркаса расположены плотнее в тех местах, где кривизна изменяется сильнее. В такой ситуации «навязывание» противоположным границам порции одинаковых параметрических длин дает поверхность с нежелательными плоскими областями или колебаниями. В связи с этим была поставлена и решена задача о построении уравнения порции поверхности для любой непрямоугольной области изменения параметров. 2.3. Поверхности на непрямоугольном каркасе
Рассмотрим произвольный каркас поверхности, образованный пересечением s - кривых с t - кривыми. Пусть sij, tij (i,j = 0,1) значения параметров в узлах конкретной порции (рис.2.2). Обозначим параметрические длины соответствующих граничных кривых через s0, s1, t0 и t1, т.е. si = si1 - si0, tj = t1j - t0j. Граничные кривые порции r (0, v), r (1, v), r (u, 0) и r (u, 1) тогда запишутся следующим образом: r (i, v) = r (i, 0) α 0 (v) + r (i, 1) α 1 (v) + [rt (i, 0) β 0 (v) + rt (i, 1) β 1 (v)] ti ;
r (u, j) = r (0, j) α 0 (u) + r (1, j) α 1 (u) + [rs (0, j) β 0 (u) + rs (1, j) β 1 (u)] sj . (2.10) Построить поверхность Кунса можно только для прямоугольной (или квадратной сетки). Поэтому необходимо определить преобразование ⎧s = s( u , v ) ⎨ ⎩t = t ( u , v ),
(2.11)
которое переводит четырехугольник со сторонами si и tj в единичный квадрат. Будем искать это преобразование в классе бикубических функций, используя уравнение тензорного произведения Кунса. Если преобразование уже определено, то ru (u, v) = rs (u, v) su (u, v) + rt (u, v) tu (u, v); rv (u, v) = rs (u, v) sv (u, v) + rt (u, v) tv (u, v). (2.12) Отсюда для узлов порции получим ru (i, j) = rs (i, j) su (i, j) + rt (i, j) tu (i, j); rv (i, j) = rs (i, j) sv (i, j) + rt (i, j) tv (i, j). (2.13) Но из (2.10) следует, что ru (i, j) = rs (i, j) sj ; rv (i, j) = rt (i, j) tj . (2.14) Сопоставляя (2.13) и (2.14), имеем sv (i, j) = 0, (2.15) su (i, j) = sj , tv (i, j) = ti . (2.16) tu (i, j) = 0, r(0,1)
t0
z
(s01,t01)
r(0,0) (s00,t00)
s0
t1
s1
r(1,1)
(s11,t11) y
r(1,0) (s10,t10) x Рис.2.2 Найдем для примера, преобразование s = s (u, v). В узлах порции эта функция определена: s00, s10, s01, s11. Первые производные задаются соотношениями (2.15). Так как su (i, j) ≠ 0 , а sv (i, j) = 0, то необходимо потребовать, чтобы suv (i, j) = 0. В таком случае преобразование s = s (u, v) согласно (2.7) запишется как
⎡s ⎢ 00 ⎢ ⎢ s10 s (u, v) = F (u) ⎢ ⎢ s0 ⎢ ⎢ ⎢⎣ s0
s01
0
s11
0
s1
0
s1
0
0⎤ ⎥ ⎥ 0⎥ ⎥ FT(v). 0⎥ ⎥ ⎥ 0⎥ ⎦
После простейших преобразований получим ⎡s s01 ⎤ ⎡α 0 ( v )⎤ 00 ⎥. ⎢ ⎥ ⎢ s (u, v) = [1 - u,u] ⎢ ⎥ ⎥ ⎢ ⎢⎣ s10 s11 ⎥⎦ ⎢⎣α 1 ( v )⎥⎦ Аналогично можно определить, что m
t (u, v) = [ α 0
(u), ∑ i =1
⎡t 00 (u)] ⎢⎢ ⎢⎣t 10
t 01 ⎤ ⎥ ⎥ t 11 ⎥ ⎦
⎡ ⎤ v ⎢ ⎥. ⎢ ⎥ ⎢⎣1 − v ⎥⎦
(2.17)
(2.18)
(2.19)
Из (2.18) и (2.19) найдем su (v) = s0 α 0 (v) + s1 α 1 (v) ; (2.20) tv (u) = t0 α 0 (u) + t1 α 1 (u). (2.21) Формулы (2.20) и (2.21) определяют закон изменения параметрических длин. Параметрическая длина в направлении s меняется от s0 (на границе v = 0) до s1 (на границе v = 1) по закону, определенному (2.20). Аналогично для параметрической длины в направлении t (2.21). Следуя Кунсу, построим поверхность r1 (u, v) , интерполирующую две граничные кривые r (0, v) и r (1, v) и имеющую заданные наклоны rs (0, v) и rs (1, v) поперек границ порции. Так как ru (i, v) = rs (i, v) su (v) (из (2.9) tu (i, v) = 0), то r1 (u, v) = r (0, v) α 0 (u) + r (1, v) α 1 (u) + + [rs (0, v) β 0 (u) + rs (1, v) β 1 (u)] su(v) . (2.22) Аналогично построим поверхность r2 (u, v), интерполирующую граничные кривые r (u, 0) и r (u, 1) с соответствующими наклонами rt (u, 0) и rt (u, 1) поперек границ порции: r2 (u, v) = r (u, 0) α 0 (v) + r (u, 1) α1 (v) + + [rt (u, 0) β 0 (v) + rt (u, 1) β1 (v)] tv(u) . (2.23) Как и прежде, r (u, v) = r1 (u, v) + r2 (u, v) - r3 (u, v). (2.24) Здесь r3 (u, v) получено с помощью того же метода интерполяции (2.19) в обоих направлениях при использовании информации об угловых точках. Определим поперечные границы rs (i, v) и rt (u, j): rs (i, v) = rs (i, 0) α 0 (v) + rs (i, 1) α 1 (v) + + [rst (i, 0) β 0 (v) + rst (i, 1) β 1 (v)] ti ; (2.25) rt (u, j) = rt (0, j) α 0 (u) + rt (1, j) α 1 (u) + + [rst (0, j) β 0 (u) + rst (1, j) β 1 (u)] sj . (2.26)
После соответствующих преобразований получим выражение для r (u, v): r (u, v) = F (u) Q (u, v) FT(v), (2.27) T где F (u) и F (v) были определены в (2.8), а ⎡r ( 0 ,0 ) ⎢ ⎢ ⎢r ( 1,0 ) Q (u, v) = ⎢ ⎢ ⎢rs ( 0 ,0 )su ( v ) ⎢ ⎢rs ( 1,0 )su ( v ) ⎢⎣
rt ( 0 ,0 )t v ( u ) rt ( 0 ,1 )t v ( u ) ⎤ ⎥ ⎥ r ( 1,1 ) rt ( 1,0 )t v ( u ) rt ( 1,1 )t v ( u )⎥ ⎥. ⎥ rs ( 0 ,1 )su ( v ) rst ( 0 ,0 )l00 rst ( 0 ,1 )l01 ⎥ ⎥ rs ( 1,1 )su ( v ) rst ( 1,0 )l10 rst ( 1,1 )l11 ⎥ ⎥⎦ r ( 0 ,1 )
(2.28)
Здесь введено обозначение lij = su (v) ti + sj tv (u) - sj ti, i,j = 0,1; (2.29) su (v) и tv (u) определяются по формулам (2.20) и (2.21). Сравним полученное уравнение порции поверхности на непрямоугольной области (2.27) с порцией поверхности Кунса, определенного тензорным произведением (2.7). Разница состоит в том, что появились множители перед первыми и перекрестными производными. В них учитывается непрямоугольность области. Матрица Q теперь зависит от параметров u и v. При s0 = s1 = 1 и t0 = t1 = 1 эти множители тождественно равны единице, и, как частный случай, получается поверхность тензорного произведения, определяемая на единичном квадрате. Таким образом, уравнение (2.27) является обобщением описания такой поверхности на произвольный четырехугольник. Можно проверить, что обеспечивается непрерывность производных rs и rt поперек границ порции, что важно, когда переходят к описанию составной поверхности. Рассмотрим, для примера, поведение rs (i, v). Из (2.12) следует, что ru (u, v) = rs (u, v) su (v) + rt (u, v) tu (u, v). При u = i (i = 0,1) (2.30) ru (i, v) = rs (i, v) su (v), так как tu (i, v) = 0 (из (2.19)). Из (2.27) получим ru (u, v) = Fu (u) Q (u, v) FT(v) + F (u) Qu (u, v) FT(v). Тогда при u = i (2.31) ru (i, v) = Fu (i) Q (i, v) FT(v), так как Qu (i, v) = 0 (это следует из (2.28)). Сравнивая (2.30) и (2.31), получим rs (i, v) su (v) = [rs (i, 0) α 0 (v) + rs (i, 1) α 1 (v) + + rst (i, 0) ti β 0 (v) + rst (i, 1)ti β 1 (v)] su (v) или rs (i, v) = rs (i, 0) α 0 (v) + rs (i, 1) α 1 (v) + + [rst (i, 0) β 0 (v) + rst (i, 1) β 1 (v)] ti.
Итак, производная rs(i, v) поперек границ u = i (i = 0,1) зависит лишь от значений rs (i, 0) и rs (i, 1) в углах этих границ (ti - общая граница двух соседних порций). Следовательно, если rs (i, 0), rs (i, 1), rst (i, 0) и rst (i, 1) одинаковы на границах двух порций, то составная поверхность будет иметь непрерывный градиент поперек этих границ. 2.4. Определение коэффициентов поверхности
Для полного определения поверхности на порции необходимо иметь в каждом из четырех ее узлов значения r, s, rs, t, rt, rst, т.е. векторы положения, параметры в направлении первого семейства каркаса, касательные векторы в этом направлении, параметры в направлении второго семейства каркаса, касательные векторы в этом направлении, перекрестные производные. Векторы положения известны с самого начала по заданному каркасу. Векторы касательных в углах порций определяются в результате построения сетки сплайновых кривых, т.е. rs и rt - коэффициенты кубических параметрических сплайнов для s - и t - кривых каркаса. В качестве параметров используется суммарная длина хорд соответствующих кривых. Для обозначения набора точек r00, r10,..., rNK используем символ rij (i = 0,1,...,N). Здесь (N + 1) - число кривых второго семейства каркаса; j = 0,1,...,K, где (K + 1) - число кривых первого семейства каркаса (рис.2.3). r0K r1K r2K K
rNK
t
2 r01
r11
r21
r00 0
r10
r20
1 0
1
2 S
N
rN1 rN0
Рис.2.3 Процесс определения коэффициентов поверхности по массиву точек будет состоять в следующем. 1) Вычисляются сплайновые кривые в s- направлении через (К + 1) i = 0,1,...,N. Каждая кривая требует наборов точек ri0, ri1,..., rik, дополнительных условий в характерных точках (либо задания наклонов rs, либо, если наклоны неизвестны, rss = 0). 2) Вычисляются сплайновые кривые, проходящие в t - направлении через (N + 1) наборов точек r0j, r1j,..., rNj, (j = 0,1,...,K). При этом
используются заданные значения rt в характерных точках (или rtt = 0, если наклоны неизвестны). В результате на шагах 1) и 2) получаем сетку аппроксимированных кривых, т.е. во всех узлах каркаса r, s, rs, t, rt могут рассматриваться как известные. 3) В s - направлении вычисляются (К + 1) сплайнов, соответствующих наборам векторов градиентов rt,i0; rt,i1;...; rt,ik (i = 0,1,...,N). Для этих вычислений необходимы значения rst в характерных точках, а поскольку такие значения получить нельзя, предполагается, что в характерных точках равна нулю более старшая производная по s, а именно rsts = 0. Коэффициенты таких сплайновых кривых и есть неизвестные производные rst в узлах каркаса. Теперь известны все элементы всех Q-тензоров, поэтому формула (2.15) может быть использована для построения каждой порции составной поверхности.
3. УДАЛЕНИЕ НЕВИДИМЫХ ЛИНИЙ И ПОВЕРХНОСТЕЙ
Для построения правильного изображения трехмерных объектов необходимо уметь определять, какие части объектов (ребра, грани) будут видны при заданном проектировании, а какие будут закрыты другими гранями объектов. В качестве возможных видов проектирования традиционно рассматриваются параллельное и центральное (перспективное) проектирования. Проектирование осуществляется на так называемую картинную плоскость (экран): проектирующий луч к картинной плоскости проводится через каждую точку объектов. При этом видимыми будут те точки, которые вдоль направления проектирования ближе всего расположены к картинной плоскости. Несмотря на кажущуюся простоту, эта задача является достаточно сложной и требует зачастую больших объемов вычислений. Поэтому существует ряд различных методов решения задач удаления невидимых линий, включая и методы, опирающиеся на аппаратные решения. Далее будем считать, что все объекты представлены набором выпуклых плоских граней, которые пересекаются только вдоль своих ребер. К решению задачи удаления невидимых линий и поверхностей можно выделить два основных полхода. Первый подход заключается в определении для каждого пикселя того объекта, который вдоль направления проектирования является ближайшим к нему. При этом работа ведется в пространстве картинной плоскости, и существенно используются растровые свойства дисплея. Второй подход заключается в непосредственном сравнении объектов друг с другом для выяснения тог, какие части, каких объектов будут являться видимыми. В данном случае работа ведется в исходном пространстве объектов и никак не привязана к растровым характеристикам дисплея. Существует большое количество смешанных методов, объединяющих оба описанных подхода. 3.1 Построение графика функции двух переменных
Рассмотрим сначала задачу построения графика функции двух переменных z = f (x, y) в виде сетки координатных линий x = const и y = const. Будем рассматривать параллельное проектирование, при котором проекцией вертикальной линии на картинной плоскости (экране) является вертикальная линия. Легко убедиться в том, что в этом случае точка p (x, y, z) переходит в точку ((p, e1), (p, e2)) на картинной плоскости, где e1 = (cos ϕ , sin ϕ , 0),
e2 = (sin ϕ sin ψ , -cos ϕ sin ψ , cos ψ ), а направление проектирования имеет вид e3 = (sin ϕ cos ψ , -cos ϕ cos ψ , -sin ψ ), ⎡ π π⎤ где ϕ ∈ [0 ,2π ] , ψ ∈ ⎢− , ⎥ . ⎣ 2 2⎦
Рассмотрим сначала построение графика функции в виде набора линий, соответствующих постоянным значениям y, считая, что углы ϕ и ψ подобраны таким образом, что при y1yi линия z = f (x, yj) не может закрывать линию z = f (x, yi). 3.2 Удаление невидимых линий. 3.2.1 Метод плавающего горизонта. Алгоритм построения графика функции z = f (x, y) когда линии рисуются в порядке удаления (возрастания у) и при рисовании очередной линии рисуется только та ее часть, которая не закрывается ранее нарисованными линиями такой алгоритм называется методом плавающего горизонта. Для определения частей линии z = f (x, yk), которые не закрывают ранее нарисованные линии, вводятся так называемые линии горизонта, или контурные линии. Пусть проекцией линии z = f (x, yk) на картинную плоскость является линия Y = Yk(X), где (X, Y) - координаты на картинной плоскости, причем Y соответствует вертикальной координате. Контурные линии Ykmax(X) и Ykmin(X) определяются следующими соотношениями: Ykmax(X) = max Yi(X), k
1≤ i ≤ k −1
Y min(X) = min Yi(X). 1≤ i ≤ k −1
На экране рисуются только те части линии Y = Yk(X), которые находятся выше линии Ykmax(X) или ниже линии Ykmin(X) (рис 3.1) . Одной из наиболее простых и эффективных реализаций данного метода является растровая реализация, при которой в области задания исходной функции вводится сетка { (xi, yj), i = 1,...,n1, j = 1,...,n2 } и каждая из линий Y = Yk(X) представляется в виде ломаной. Для рисования сегментов этой ломаной используется модифицированный алгоритм Брезенхейма, который перед выводом очередного пиксела сравнивает его ординату с верхней и нижней контурными линиями, представляющими собой в этом случае массивы значений ординат. Случай отрезков с угловым коэффициентом большим 1 требует специальной обработки (для того, чтобы не появлялись выпадающие пикселы).
Рассмотрим теперь задачу построения полутонового изображения графика функции z = f (x, y). Как и ранее, введем сетку { (xi, yj), i = 1,...,n1, j = 1,...,n2 } и затем приблизим график функции набором треугольных граней с вершинами в точках (xi, yj, f(xi, yj)). Для удаления невидимых граней воспользуемся аналогичным методом - упорядоченным выводом граней. Только в данном случае треугольники будем выводить не по мере удаления от картинной плоскости, а по мере их приближения, начиная с дальних и заканчивая ближними: треугольники, расположенные ближе к плоскости экрана, выводятся позже и закрывают собой невидимые части более дальних треугольных граней. Для определения порядка, в котором должны выводится грани, воспользуемся тем, что треугольники, лежащие в полосе { (x, y), yi ≤ y ≤ yi +1 } , не могут закрывать треугольники из полосы { (x, y), yi −1 ≤ y ≤ yi } .
Рис 3.1 Удаление невидимых линий методом плавающего горизонта a=(x-π)2+(y-π)2 Z(x,y)=0.2*sin(x)*cos(y)-1.5*cos(7a/4)*e - a
3.2.2 Алгоритм Робертса
Самым первым алгоритмом, предназначенным для удаления невидимых линий, был алгоритм Робертса, требующий, чтобы каждая грань была выпуклым многогранником. Опишем этот алгоритм. Сначала отбрасываются все ребра, обе определяющие грани которого являются нелицевыми (ни одно из таких ребер не будет видно). Следующим шагом является проверка каждого из оставшихся ребер со всеми гранями многогранника на закрытие. Возможны следующие случаи: • грань не закрывает ребро; • грань полностью закрывает ребро (и оно тогда удаляется из списка рассматриваемых ребер); • грань частично закрывает ребро (в этом случае ребро разбивается на несколько частей, из которых видимыми являются не более двух; само ребро удаляется из списка, но в этот список проверенных ребер добавляются те его части, которые не закрываются данной гранью). Если общее количество граней равно n, то временные затраты для данного алгоритма составляют О (n2). Можно заметно сократить количество проверок, если воспользоваться разбиением картинной плоскости. Картинная плоскость разбивается на равные клетки, и для каждой клетки составляется список тех граней, проекции которых имеют непустое пересечение с данной клеткой. Для проверки произвольного ребра сначала находятся все клетки, в которые попадает проекция этого ребра, и рассматриваются только те грани, которые содержатся в списках данных клеток. Несмотря на то, что этот вариант алгоритма требует определенных затрат для построения разбиения и соответствующих списков, при удачном выборе разбиения он имеет порядок О (n). 3.2.3 Алгоритм Аппеля
Введем понятие так называемой количественной невидимости точки как количества лицевых граней, ее закрывающих. Точка является видимой только в том случае, когда ее количественная невидимость равна нулю. Рассмотрим, как меняется количественная невидимость вдоль ребра. Количественная невидимость точек ребра изменяется на единицу при прохождении ребра позади так называемой контурной линии, состоящей из тех ребер, для которых одна из проходящих граней является лицевой, а другая - нелицевой.
Для определения видимости ребер произвольного многогранника берется какая-нибудь его вершина, и затем непосредственно определяется ее количественная невидимость. Далее прослеживается изменение количественной невидимости вдоль каждого из ребер, выходящих из этой вершины. Эти ребра проверяются на прохождение позади контурной линии, и в соответствующих точках их количественная невидимость изменяется. Те части отрезка, для которых количественная невидимость равна нулю, сразу рисуются. Следующим шагом является определение количественной невидимости для всех ребер, выходящих из новой вершины, и т.д. В результате определяется количественная невидимость связной компоненты сцены, содержащей исходную вершину (и при этом она рисуется). В случае, когда рассматривается изменение количественной невидимости вдоль ребра, выходящего из вершины, принадлежащей контурной линии, необходимо проверить, не закрывается ли это ребро одной из граней, выходящей из этой вершины. Так как для реальных объектов количество ребер, входящих в контурную линию, намного меньше общего числа ребер, то алгоритм Аппеля является более эффективным, чем алгоритм Робертса. Замечание Для повышения эффективности данного алгоритма использование разбиения картинной плоскости.
также
возможно
3.3 Удаление невидимых граней. 3.3.1 Отсечение нелицевых граней
Рассмотрим многогранник, для каждой грани которого задан единичный вектор внешней нормали. Несложно заметить, что если вектор нормали грани n составляет с вектором l, задающим направление проектирования, тупой угол, то эта грань заведомо не может быть видна. Такие грани называются нелицевыми. В случае, когда соответствующий угол является острым, грань называется лицевой. В случае параллельного проектирования условия на угол можно записать в виде (n, 1) ≤ 0, поскольку направление проектирования l от грани не зависит. При центральном проектировании с центром в точке с вектор проектирования для точки р будет равен l = с -р. Для определения того, является заданная грань лицевой или нет, достаточно взять произвольную точку р этой грани и проверить выполнение условия (n, 1) ≤ 0.
Знак этого скалярного произведения не зависит от выбора точки грани, а определяется тем, в каком полупространстве относительно плоскости, содержащей данную грань, лежит центр проектирования. В случае, когда сцена представляет собой один выпуклый многогранник, удаление нелицевых граней полностью решает задачу удаления невидимых граней. В общем случае предложенный подход хотя и не решает задачу полностью, но позволяет примерно вдвое сократить количество рассматриваемых граней. 3.3.2 Метод z- буфера
Одним из самых простых алгоритмов удаления невидимых граней и поверхностей является метод z- буфера (буфера глубины). В силу крайней простоты этого метода часто встречаются его аппаратные реализации. Сопоставим каждому пикселу (х, у) картинной плоскости, кроме цвета, хранящегося в видеопамяти, его расстояние до картинной плоскости вдоль направления проектирования z (х, у) (его глубину). Изначально массив глубин инициализируется + ∞ . Для вывода на картинную плоскость произвольной грани она переводится в свое растровое представление на картинной плоскости, и для каждого пиксела этой грани находится его глубина. В случае если эта глубина меньше значения глубины, хранящегося в z- буфере, пиксел рисуется, и его глубина заносится в z- буфер. Замечание Данный метод работает исключительно в пространстве картинной плоскости и не требует никакой предварительной обработки данных. Для вычисления глубины соседних пикселов при растровом разложении грани может использоваться вариант целочисленного алгоритма Брезенхейма.
3.3.3 Алгоритмы упорядочения
Метод, использованный ранее для построения графика функции двух переменных и заключающийся в последовательном выводе на экран всех граней в определенном ранее, может быть использован и для расчета более сложных сцен. Подход заключается в таком упорядочении граней, чтобы при их выводе в этом порядке получалось корректное изображение. Для этого необходимо, чтобы более дальние грани выводились раньше, чем более близкие. Существуют различные методы построения такого упорядочения, однако часто встречаются такие случаи, когда заданные грани нельзя упорядочить. В подобных случаях необходимо произвести разбиение одной или нескольких граней, чтобы получившееся после разбиения множество граней можно было упорядочить.
3.3.4 Метод сортировки по глубине
Наиболее простым подходом к упорядочиванию граней является их сортировка по минимальному расстоянию до картинной плоскости (вдоль направления проектирования) с последующим выводом их в порядке приближения. Этот метод великолепно работает для ряда сцен, включая, например, построение изображения нескольких непересекающихся достаточно простых тел. Однако возможны случаи, когда просто сортировка по расстоянию до картинной плоскости не обеспечивает правильного упорядочения граней, поэтому желательно после такой сортировки проверить порядок, в котором грани будут выводиться. Предлагается следующий алгоритм этой проверки. Для простоты будем считать, что рассматривается параллельное проектирование вдоль оси Oz. Перед выводом грани Р следует убедиться, что никакая другая грань Q, проекция которой на ось Oz пересекается с проекцией грани Р, не может закрываться гранью Р. И если это условие выполнено, то грань Р должна быть выведена раньше. Предлагаются следующие 5 тестов в порядке возрастания сложности проверки: 1. Пересекаются ли проекции этих граней на ось Ох? 2. Пересекаются ли их проекции на ось Оy? 3. Находится ли грань Р по другую сторону от плоскости, проходящей через грань Q, чем начало координат (наблюдатель)? 4. Находится ли грань Q по ту же сторону от плоскости, проходящей через грань Р, что и начало координат (наблюдатель)? 5. Пересекаются ли проекции этих граней на картинную плоскость? Если хотя бы на один из этих вопросов получен отрицательный ответ, то считаем, что эти две грани - Р и Q упорядочены верно, и сравниваем Р со следующей гранью. В противном случае считаем, что эти грани необходимо поменять местами, для чего проверяются следующие тесты: 3|. Находится ли грань Q по другую сторону от плоскости, проходящей через грань Р, чем начало координат? 4|. Находится ли грань Р по ту же сторону от плоскости, проходящей через грань Q, что и начало координат? В случае если ни один из этих тестов не позволяет с уверенностью решить, какую из этих двух граней нужно выводить раньше, то одна из них разбивается плоскостью, проходящей через другую грань. В этом случае вопрос об упорядочении оставшейся грани и частей разбитой грани легко решается.
3.3.5 Метод двоичного разбиения пространства
Существует другой, крайне элегантный способ упорядочивания граней. Рассмотрим некоторую плоскость в объектном пространстве. Она разбивает множество всех граней на два непересекающихся множества (кластера), в зависимости от того, в каком полупространстве относительно плоскости эти грани лежат (будем считать, что плоскость не пересекает ни одну из этих граней). При этом очевидно, что ни одна из граней, лежащих в полупространстве, не содержащем наблюдателя, не может закрывать собой ни одну из граней, лежащих в том же полупространстве, что и наблюдатель. Тем самым сначала необходимо вывести грани из дальнего кластера, а затем уже и из ближнего. Применим подобную технику для упорядочения граней внутри каждого кластера. Для этого построим разбиение граней каждого кластера на два множества очередной плоскостью; а затем для вновь полученных граней повторим процесс разбиения, и будем поступать так до тех пор, пока в каждом получившемся кластере останется не более одной грани. Обычно в качестве разбивающей плоскости рассматривается плоскость, проходящая через одну из граней (на самом деле при этом множество всех граней разбивается на 4 класса - лежащих на плоскости, пересекающих ее, лежащих в положительном полупространстве и лежащие в отрицательном полупространстве относительно этой плоскости). Все грани, пересекаемые плоскостью, разобьем вдоль этой плоскости. В результате мы приходим к дереву разбиения пространства (Binary Space Partitioning), узлами которого являются грани. Процесс построения дерева заключается в выборе грани, проведении через нее плоскости и разбиении множества всех граней. В этом процессе присутствует определенный произвол в выборе очередной грани. Существует два основных критерия для выбора: • получить как можно более сбалансированное дерево; • минимизировать количество разбиений. К сожалению, эти критерии, как правило, являются взаимоисключающими, поэтому выбирается некоторый компромиссный вариант. После того как дерево построено, осуществляется построение изображения в зависимости от используемого проектирования. Одним из основных преимуществ этого метода является его полная независимость от положения центра проектирования, что делает его крайне удобным для построения серий изображений одной и той же сцены из разных точек наблюдения.
3.3.6 Метод построчного сканирования
Метод построчного сканирования является еще одним примером метода, работающего в пространстве картинной плоскости. Однако вместо того, чтобы решать задачу удаления невидимых граней для проекций объектов на картинную плоскость, сведем ее к серии простых одномерных задач. Все изображение на картинной плоскости можно представить как ряд горизонтальных (вертикальных) линий пикселов. Рассмотрим сечение сцены плоскостью, проходящей через такую линию пикселов и центр проектирования. Пересечением этой плоскости с объектами сцены будет множество непересекающихся (за исключением концов) отрезков, которые и необходимо спроектировать. Задача удаления невидимых частей для такого набора отрезков решается тривиально. Рассматривая задачу удаления невидимых граней для каждой такой линии, мы тем самым разбиваем исходную задачу на набор гораздо более простых задач. Подобные алгоритмы с успехом используются для создания компьютерных игр типа Wolfenstein 3d. Рассмотрим, каким путем возможно применение этого метода для создания игры типа Wolfenstein 3d. В этой игре вся сцена представляет собой прямоугольный лабиринт с постоянной высотой пола и потолка и набором вертикальных стен. Разложим изображение сцены в ряд вертикальных линий. Каждая такая линия однозначно определяет вертикальную полуплоскость, проходящую через нее и точку наблюдения. Ясно, что в данном случае среди всех пересечений этой полуплоскости со стенами лабиринта, видимым будет только одно, ближайшее. При рассматриваемых условиях вся задача поиска пересечений может решаться в плоскости Оху, что позволяет свети ее к поиску пересечений луча с набором отрезков, представляющих собой проекции стен лабиринта. После того, как такое пересечение построено, пользуясь свойствами центрального проектирования, находится проекция стены на эту линию. На самом деле каждая вертикальная линия изображения состоит и трех частей: пола, части стены и потолка. Поэтому после определения части линии, занимаемой проекцией стены (она представляет собой отрезок), оставшаяся часть линии заполняется цветом пола и потолка. 3.3.7 Алгоритм Варнака
Алгоритм Варнака является еще одним примером алгоритма, основанного на разбиении картинной плоскости на части, для каждой из которых исходная задача может быть решена достаточно просто. Разобьем видимую часть картинной плоскости на 4 равные части. В случаях, когда часть полностью накрывается проекцией ближайшей грани и часть не накрывается проекцией ни одной грани, вопрос о закрашивании соответствующей части решается тривиально.
В случае, когда ни одно их этих условий не выполнено, данная часть разбивается на 4 части, для каждой из которых проверяется выполнение этих условий, и так далее. Очевидно, что разбиение имеет смысл проводить до тех пор, пока размер части больше чем размер пиксела. В противном случае, для части, размером в один пиксел, явно находится ближайшая к ней грань и осуществляется закрашивание.
4. ЗАКРАШИВАНИЕ 4.1 Закрашивание диффузионных и зеркальных поверхностей
Следующим шагом на пути создания реалистических изображений является проблема закрашивания поверхностей, ограничивающих построенные объекты. В этой главе рассмотрим простейшие модели, не требующих больших вычислительных затрат. Световая энергия, падающая на б поверхность от источника света (рис.4.1а), a может быть поглощена (рис.4.1в), отражена (рис.4.1б) и пропущена (рис.4.1г). Количество поглощенной, П оверхность отраженной и пропущенной энергии зависит от длины световой волны. При в г этом цвет поверхности объекта определяется поглощаемыми длинами волн. Рис 4.1
а)
б)
В)
Рис 4.2 Свойство отраженного света зависят от формы и направления источника света, а также от ориентации освещаемой поверхности и ее свойств. Свет, отраженный от объекта, может быть диффузным и зеркальным: диффузно отраженный свет рассеивается равномерно по всем направлениям (Ламбертовая поверхность см. рисунок 4.2 а)), зеркальное отражение происходит от внешней поверхности объекта (рис. 4.2 б). На рисунке 4.2 в показана поверхность, имеющая как диффузную, так и зеркальную характеристики. Примеры поверхностей, имеющие диффузную и зеркальную характеристики представлены на рисунках 4.3 и 4.4 соответственно.
Рис. 4.3 Зеркальная поверхность.
Рис. 4.4 Диффузионная поверхность (Ламбертовая).
x' Источник света
y' Камера z' z n k α r Отраженный свет
γ s
Θ
Объект
y
N
x Рис 4.5
Свет точечного источника отражается от идеального рассеивателя по закону косинусов Ламберта: I = Ii kd cos θ , (4.1) где I - интенсивность отраженного света; Ii - интенсивность точечного источника; kd - коэффициент диффузного отражения (постоянная величина, 0 ≤ kd ≤ 1 ); θ - угол между направлением на источник света и (внешней) нормалью к поверхности, 0 ≤ θ ≤
π (рис 4.5). 2
Пусть вектор нормали к поверхности в точке N обозначим через n(nx,ny,nz),где nx,ny,nz – составляющие этого вектора по осям, вектор, направленный на источник света обозначим через s(sx,sy,sz),тогда косинус угла между этими векторами определяется по формуле n x s x + n ys y + n z s z cos(θ) = (4.2) 2 2 2 2 2 2 n x +n y +n z s x +s y +s z На объекты реальных сцен падает еще и рассеянный свет, соответствующий отражению света от других объектов. Поскольку точный расчет рассеянного освещения требует значительных вычислительных
затрат, в компьютерной графике при вычислении интенсивности поступают так:
I = Ia ka +Ii kd cos θ , 0 ≤ θ ≤
π 2
,
(4.3)
Ia - интенсивность рассеянного света; ka - (постоянный) коэффициент диффузного отражения рассеянного света, 0 ≤ ka ≤ 1 . Интенсивность света, естественно, зависит от расстояния d от объекта до источника света. Для того чтобы учесть это, пользуются следующей моделью освещения:
где
I = Ia ka +
Ii k d cos θ d*K
(4.4)
К - произвольная постоянная. Интенсивность зеркально отраженного света зависит от угла падения, длины волны и свойств вещества. Так как физические свойства зеркального отражения довольно сложны, то в простых моделях освещения обычно пользуются следующей эмпирической моделью (моделью Фонга): Iz = Ii kz cosp α , (4.5) где Iz - интенсивность зеркально отраженного света kz - экспериментальная постоянная (коэффициент зеркального отражения 0 ≤ k z ≤ 1 ); α - угол между отраженным лучом и вектором наблюдения (направление на камеру) ; р - степень, аппроксимирующая пространственное распределение света (величина, влияющая на размер блика на поверхности объекта). Составляющие вектора отраженного луча r(rx,ry,rz) при зеркальном отражении определяются с помощью следующих формул n x s x + n ys y + n z s z q= n 2x + n 2 y + n 2z ⎧rx = 2n x q − s x ⎪ ⎨ry = 2n y q − s y ⎪ r = 2n q − s z z ⎩z Объединяя последние две формулы (4.4) и (4.5), получаем модель освещения (функцию закраски), используемую для расчета интенсивности (или тона) точек поверхности объекта (или пикселов изображения): где
I = Ia ka +
Замечание
Ii (kd cos θ + ks cosp α ). d*K
(4.6)
Чтобы получить цветное изображение, необходимо найти функции закраски для каждого из трех основных цветов - красного, зеленого и синего. Поскольку цвет зеркально отраженного света определяется цветом падающего, то постоянная ks считается одинаковой для каждого их этих цветов.
В случае, когда точечных источников света несколько, то значение интенсивности отраженного света в некоторой точке определяется как сумма значений интенсивности отраженного света от каждого источника света. Если освещаемая поверхность в рассматриваемой точке гладкая (имеет касательную плоскость), то вектор внешней нормали вычисляется непосредственно. Пусть закрашиваемая поверхность задана неявном виде F(x,y,z)=0. Если дана явная функция, то эту функцию всегда можно представить в неявном виде путем переноса в левую часть уравнения определяемое значение. Для определения вектора нормали n(nx,ny,nz) в некоторой точке N(xN,yN,zN) необходимо определить частные производные Fx, Fy, Fz, по переменным x,y,z и в полученные уравнения подставить координаты точки, для которой определяется нормаль. ∂F( x , y, z) ∂F( x , y, z) ∂F( x , y, z) , Fy ( x , y, z) = , Fz ( x , y, z) = ∂x ∂x ∂x n X = FX ( x N , y N , z N ) n Y = FY ( x N , y N , z N ) n Z = FZ ( x N , y N , z N ) Fx ( x , y, z) =
В случае многогранной поверхности векторы внешних нормалей можно найти только для ее граней. Что касается направлений векторов внешних нормалей на ребрах и в вершинах этой поверхности, то их значения можно найти только приближенно. Пусть, например, грани, сходящиеся в данной вершине, лежат в плоскостях, описываемых уравнениями Ai x + Bi y + Ci z + Di = 0, i = 1,...,m. Можно считать, что нормальные векторы этих плоскостей (Ai, Bi, Ci), i = 1,...,m, являются векторами внешних нормалей для рассматриваемой многогранной поверхности (если какой-то из нормальных векторов не является внешним, то достаточно поменять знаки его координат на противоположные). Складывая эти векторы, получаем вектор, определяющий направление приближенной нормали m
(А, В, С) = ∑ (Ai, Bi, Ci). i =1
Замечание Для определения направления приближенной нормали в точке, лежащей на ребре многогранной поверхности, достаточно сложить векторы внешних нормалей, примыкающих к этому ребру граней рассматриваемой поверхности. Можно поступить и по-иному. А именно, аппроксимировать переменный вектор нормали вдоль ребра многогранной поверхности при помощи уже найденных векторов внешних нормалей в вершинах, прилегающих к рассматриваемому ребру.
Пусть многогранная поверхность задана своими вершинами. Тогда векторы, определяющие направления приближенных внешних нормалей в ее вершинах можно найти, используя векторные произведения, построенные на векторах, идущих вдоль ребер, исходящих из соответствующих вершин. Например, для того, чтобы определить внешнюю нормаль в вершине V1, необходимо сложить векторные произведения V1V2 × V1V3, V1V3 × V1V4, V1V4 × V1V2. Замечание Если перед сложением найденные векторные произведения пронормировать, то полученная сумма будет отличаться от предыдущей и по длине, и по направлению.
Для отыскания направления вектора отражения напомним, что единичные векторы - падающего света l, нормали к поверхности n и отражения r лежат в одной плоскости, причем угол падения равен углу отражения. Рассмотрим модель освещения с одним точечным источником и предположим, что свет падает вдоль оси Z. Тогда координаты единичного вектора отражения r = (rx, ry, rz) определяются по формулам rx = 2nx nz, ry = 2ny nz, rz = 2n2z - 1, где n = (nx, ny, nz) - единичный вектор нормали к поверхности. Если же свет от источника падает не по оси аппликат, то проще всего поступить так: выбрать новую координатную систему так, чтобы ее начало совпадало с рассматриваемой точкой, касательная плоскость к поверхности была плоскостью ху, а нормаль к поверхности в этой точке шла вдоль оси Z. В этой новой системе координат векторы r и l будут связаны соотношениями rx = -lx, ry = -ly, rz = lz. Для того чтобы получить исходные координаты вектора отражения, необходимо выполнить обратное преобразование. Рассмотрим произвольную сцену, составленную из полигональных (многогранных) фигур. Простейший способ ее построения заключается в том, что на каждой из граней выбирается по точке, для нее определяется освещенность, и затем вся грань закрашивается с использованием найденной освещенности. Предложенный алгоритм обладает, однако, одним большим недостатком - полученное изображение имеет неестественный многогранный вид. Это объясняется тем, что определяемая подобным образом освещенность сцены не является непрерывной величиной, а имеет кусочно-постоянный характер. Существуют специальные методы закрашивания, позволяющие создавать иллюзию гладкости.
Опишем два известных метода построения сглаженных изображений. 4.2 Закраска методом Гуро
Наиболее простым из таких методов является метод Гуро, который основывается на определении освещенности грани в ее вершинах с последующей билинейной интерполяцией получившихся величин на всю грань. Пусть дана выпуклая четырехугольная грань. Предположим, что интенсивности в ее вершинах V1, V2, V3 и V4 известны и равны соответственно IV1, IV2, IV3 и IV4. Пусть W - произвольная точка грани. Для определения интенсивности (освещенности) в этой точке проведем через нее горизонтальную прямую. Обозначим через U и V точки пересечения проведенной прямой с границей грани. Будем считать, что интенсивность на отрезке UV изменяется линейно, то есть IW = (1 - t)IU + t IV, где
t=
UW UV
, 0 ≤ t ≤ 1.
Для определения интенсивности в точках U и V вновь воспользуемся линейной интерполяцией, также считая, что вдоль каждого из ребер границы интенсивность изменяется линейно. Тогда интенсивность в точках U и V вычисляется по формулам IU = (1 - u)IV4 + u IV1, IV = (1 - v)IV1 + v IV2, где
u=
V4 U V4V1
, 0 ≤ u ≤ 1,
v=
V1V V1V2
, 0 ≤ v ≤ 1.
Метод Гуро обеспечивает непрерывное изменение интенсивности при переходе от одной грани к другой без разрывов и скачков. Еще одним преимуществом этого метода является его инкрементальный характер: грань рисуется в виде набора горизонтальных отрезков, причем так, что интенсивность последующего пиксела отрезка отличается от интенсивности предыдущего на величину, постоянную для данного отрезка. Кроме того, при переходе от отрезка к отрезку значения интенсивности в его концах также изменяются линейно. Таким образом, процесс рисования грани слагается из следующих шагов: 1) проектирование вершин грани на экран; 2) отыскание интенсивностей в вершинах по формуле (4.3); 3) определение координат концов очередного отрезка и значений интенсивности в их линейной интерполяции; 4) рисование отрезка с линейным изменением интенсивности между его концами.
1. При определении освещенности в вершине, естественно, встает вопрос о выборе нормали. Часто в качестве нормали в вершине выбирается нормированная сумма нормалей прилегающих граней
n=
a 1 n1 + ...+ a k n k , a 1 n1 + ...+ a k n k
где a1,...,ak - произвольные весовые коэффициенты. 2. Дефекты изображения, возникающие при закраске Гуро, частично объясняются тем, что этот метод не обеспечивает гладкости изменения интенсивности. 4.3 Закраска методом Фонга
Как и описанный выше метод закраски Гуро, закраска Фонга при расчете интенсивности также опирается на интерполирование. Однако, в отличие от метода Гуро, здесь интерполируется не значение интенсивности по уже известным ее значениям в опорных точках, а значение вектора внешней нормали, которое затем используется для вычисления интенсивности пиксела. Поэтому закраска Фонга требует заметно большего объема вычислений. Правда, при этом изображение получается более близким к реалистичному (в частности, при закраске Фонга зеркальные блики выглядят довольно правдоподобно). Метод Фонга заключается в построении для каждой точки вектора, играющего роль вектора внешней нормали, и использовании этого вектора для вычисления освещенности в рассматриваемой точке по формуле (5). При этом схема интерполяции, используемая при закраске Фонга, аналогична интерполяции в закраске Гуро. Для определения вектора «нормали» nW в точке W проводим через эту точку горизонтальную прямую и, используя значения векторов «нормалей» nU и nV в точках ее пересечения U и V с ребрами грани, получаем
nW = где
t=
UW UV
( 1 − t )nU + tnV , ( 1 − t )nU + tnV
,
а векторы внешних нормалей в точках U и V находятся, в свою очередь (также линейной интерполяцией), по векторам нормалей в концевых точках соответствующих ребер рассматриваемой многоугольной грани: nU = (1 - u) nV4 + u nV1, nV = (1 - v) nV1 + v nV2, где
u=
V4 U V4V1
,
v=
V1V V1V2
.
Нормирование вектора nW необходимо в следствие того, что в формулах (1) - (5) используется единичный вектор нормали.
С П И С О К И С П ОЛ ЬЗ О ВА Н Н О Й Л И Т Е РАТ У Р Ы
1. Алберг Дж., Нильсон Э., Уолш Дж. Теория сплайнов и ее применения. М: Мир, 1972. 2. Вершинин В.В., Завьялов Ю.С., Павлов Н.Н. Экстремальные свойства сплайнов и задач сглаживания. -Новосибирск: Наука, 1988. 3. Гильберт Д., Кон-Фоссен С. Наглядная геометрия. Пер. с нем. - М.: Наука, 1981. -344 с. 4. Гребенников А.И., Метод сплайнов и решение некорректных задач теории приближений. -М: Мир, 1983. 5. Жермен-Лакур П., Жорж П.Л., Пистер Ф., Безье П. Математика и САПР. В 2-х кн. Кн.2 Пер. с франц. -М: Мир, 1988. - 264 с. 6. Завьялов Ю.С., Квасов Б.И., Мирошниченко В.Л., Методы сплайнфункций. -М: Наука, 1980. 7. Завьялов Ю.С., Леус В.А., Скороспелов В.А., Сплайны в инженерной геометрии. -М: Машиностроение, 1985. 8. Иванов В.П., Батраков А.С. Трехмерная компьютерная графика. - М.: Радио и связь, 1995 - 224 с. 9. Игнатов М.И., Певный А.Б. Натуральные сплайны многих переменных. Ленинград: Наука, 1991. 10.Носач В.В. Решение задач аппроксимации с помощью персональных компьютеров. - М. МИКАП, 1994. - 382 с. 11.Сидоренко С.М., Соловьев Л.П., Пронюшкина Т.Г., Сидоренко Е.Г. Вычислительная геометрия. -М.: Луч, 1995. -205 с. 12.Фокс А., Пратт М. Вычислительная геометрия. Применение в проектировании и на производстве. -М: Мир, 1982. - 304 с. 13.Фоли Дж., вэн Дэм А. Основы интерактивной машинной графики: В 2-х нигах. -М: Мир, 1985. - 368 с.
П Р И Л ОЖ Е Н И Е
ПРИЛОЖЕНИЯ Приложение 1 Построение плоских кривых по координатам точек. 1
2
3
4
5
6
7
8
9
10
x
1,94
3,10
3,89
4,76
5,69
5,72
6,74
8,18
8,38
8,83
y
0,15
1,14
2,62
3,08
4,81
3,62
0,52
4,05
2,86
4,43
x
-1,01 0,16
1,76
2,73
3,50
4,84
5,19
6,45
7,65
8,90
y
1,97
0,48
1,80
1,75
2,04
1,64
2,00
2,54
1,98
0,85
x
3,18
4,45
6,41
7,22
7,80
9,96 12,22 12,44 12,60 15,03
y
0,60
6,66
4,92
1,66
3,09
4,43
0,03
5,01
5,77
0,48
x
1,21
1,79
2,49
2,75
3,32
3,37
3,79
4,47
4,55
4,74
y
0,78
0,18
0,34
0,55
0,69
0,36
0,03
0,73
0,41
0,80
x
6,92
8,57 11,80 12,45 14,60 19,44 21,45 25,95 29,05 32,85
y
3,74
3,09
№6
x y
-7,78 -0,61 6,59 11,84 12,38 21,34 26,39 34,13 40,92 45,73 1,79 5,71 4,65 7,09 4,29 7,15 4,93 9,16 0,05 7,81
№7
x
3,81 13,54 20,45 21,28 23,67 35,63 42,51 53,48 53,98 60,88
y
2,06
№8
x y
-11,2 -4,91 4,70 4,85 3,86 1,23
№9
x
-1,26 10,86 20,75 28,77 31,77 40,44 54,42 60,46 64,86 70,34
y
0,14
№10
x y
4,99 10,79 11,52 13,26 15,17 18,17 19,18 19,23 24,17 29,63 0,00 0,11 0,27 0,06 0,05 0,20 0,22 0,17 0,12 0,02
№11
x
10,87 16,35 23,11 27,76 36,54 37,60 39,39 44,28 45,52 51,30
y
0,57
№12
x y
2,82 5,71 10,95 2,22
6,46 13,37 20,38 26,12 30,19 38,51 41,99 46,71 4,82 6,24 0,34 9,73 10,24 5,31 6,75 11,97
№13
x
1,00
1,06
1,16
1,44
1,90
2,52
2,67
3,16
3,68
3,90
y
1,55
0,69
0,24
0,35
1,25
0,31
0,56
1,17
0,23
1,15
№14
x y
-7,31 4,54 0,56 0,36
№15
x
1,14
2,73 11,81 12,03 22,58 24,41 34,54 45,14 54,06 60,99
y
0,80
0,45
№1 №2 №3 №4 №5
8,45
1,08
0,07
2,23
0,40
0,51
0,25
7,90
0,60
9,16
4,90
5,54
2,02
7,13
8,07
0,16
5,13
5,20
2,17
8,90
9,40
6,07 13,30 20,80 30,13 39,55 49,26 50,54 1,56 1,51 0,01 2,90 0,38 0,16 4,10 0,88
0,53
1,50
0,84
0,21
0,02
0,31
0,73
1,11
0,90
1,23
0,27
1,12
0,89
7,88 19,33 21,64 39,49 54,85 71,63 79,63 91,19 0,36 0,15 0,08 0,59 0,42 0,31 0,69 0,13 0,19
0,13
0,03
0,55
0,26
0,02
0,04
0,44
№16
x y
3,17 0,81
№17
x
6,93 10,62 13,55 21,56 35,15 42,42 50,29 58,59 59,69 70,88
y
5,58
№18
x y
14,33 15,14 24,97 30,93 38,62 48,00 57,68 63,01 77,42 81,26 20,67 3,20 6,05 22,83 14,37 24,11 11,21 7,99 19,04 7,27
№19
x
-10,8 0,11
5,77 11,11 21,15 29,36 36,05 47,51 52,64 60,32
y
0,24
0,67
x y
29,09 44,81 57,65 60,70 77,75 86,22 108,2 123,9 139,6 141,4 58,93 64,22 58,48 80,76 108,1 35,42 64,63 26,64 94,90 14,66
№20
3,47 0,26
3,91 0,12
0,52
4,24 1,21
0,37
0,54
6,07 0,03
2,00
7,02 0,43
5,96
0,44
8,74 0,74
5,88
0,18
5,97
0,09
0,72
8,88 0,51 1,86
0,29
9,01 0,36 5,20
0,58
9,66 1,10 1,82
0,45
Приложение 2 Построение пространственных кривых по координатам точек. Вариант №1 x y z
1
2
3
4
5
0.062 0.241 0.969
0.232 0.422 0.876
0.469 0.499 0.729
0.713 0.452 0.536
0.905 0.294 0.309
6
14
15
16
17
18
7
8
9
10
11
12
13
0.996 0.965 0.819 0.594 0.345 0.136 0.016 0.016 0.063 -0.184 -0.385 -0.491 -0.476 -0.342 -0.124 0.124 0.063 -0.187 -0.426 -0.637 -0.809 -0.930 -0.992 -0.992 19
20
21
22
23
24
25
x 0.136 0.345 0.594 0.819 0.965 0.996 0.905 0.713 0.469 0.232 0.062 0.000 y 0.342 0.476 0.491 0.385 0.184 -0.063 -0.294 -0.452 -0.499 -0.422 -0.241 0.000 z -0.930 -0.809 -0.637 -0.426 -0.187 0.063 0.309 0.536 0.729 0.876 0.969 1.000
Вариант №2 1
2
3
4
5
x 0.016 0.127 0.429 1.016 1.984 y 0.249 0.482 0.685 0.844 0.951 z 0.251 0.503 0.754 1.005 1.257 14
15
16
17
18
6
7
3.429 0.998 1.508
5.445 0.982 1.759
19
20
8
9
10
11
12
13
8.128 11.573 15.875 21.130 27.432 34.878 0.905 0.771 0.588 0.368 0.125 -0.125 2.011 2.262 2.513 2.765 3.016 3.267 21
22
23
24
25
x 43.562 53.579 65.025 77.995 92.584 108.888 127.002 147.020 169.039 193.154 219.459 248.050 y -0.368 -0.588 -0.771 -0.905 -0.982 -0.998 -0.951 -0.844 -0.685 -0.482 -0.249 0.000 z 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №3 1 x y z
2
3
4
5
6
1.286 1.653 2.125 2.733 3.514 4.518 0.249 0.482 0.685 0.844 0.951 0.998 0.063 0.253 0.568 1.011 1.579 2.274
7
8
5.808 0.982 3.095
7.468 0.905 4.043
9
10
11
12
13
9.602 12.345 15.873 20.408 26.239 0.771 0.588 0.368 0.125 -0.125 5.116 6.317 7.643 9.096 10.675
14
15
16
17
18
19
20
21
22
23
24
25
x 33.737 43.376 55.770 71.705 92.194 118.536 152.406 195.953 251.943 323.931 416.488 535.492 y -0.368 -0.588 -0.771 -0.905 -0.982 -0.998 -0.951 -0.844 -0.685 -0.482 -0.249 0.000 z 12.380 14.212 16.170 18.255 20.466 22.803 25.266 27.856 30.572 33.415 36.383 39.478
Вариант №4 1 X Y Z
3
4
5
6
7
8
9
10
11
12
13
0,002 0.021 0.069 0.161 0.306 0.510 0.777 1.106 1.491 1.925 2.396 2.891 3.393 0.031 0.124 0.271 0.464 0.691 0.937 1.187 1.426 1.637 1.809 1.930 1.992 1.992 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
X Y z
2
15
16
17
18
19
20
21
22
23
24
25
3.887 4.358 4.792 5.177 5.506 5.773 5.978 6.122 6.214 6.262 6.281 6.283 1.930 1.809 1.637 1.426 1.187 0.937 0.691 0.464 0.271 0.124 0.031 0.000 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №5 1 x y z x y z
2
3
4
5
6
7
8
9
10
11
12
13
0.972 0.890 0.758 0.584 0.379 0.154 -0.078 -0.304 -0.509 -0.684 -0.818 -0.903 -0.937 2.476e-4 1.969e-3 6.579e-3 0.015 0.030 0.050 0.077 0.112 0.154 0.203 0.259 0.321 0.387 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
15
-0.916 0.457 3.519
-0.845 0.530 3.770
16
17
18
19
20
21
22
23
24
25
-0.726 -0.569 -0.383 -0.179 0.030 0.231 0.413 0.565 0.680 0.750 0.602 0.673 0.741 0.804 0.860 0.909 0.948 0.977 0.994 1.000 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №6 1 x y z
3
4
5
6
7
8
9
10
11
12
13
2.916 2.813 2.672 2.496 2.288 2.053 1.796 1.521 1.234 0.940 0.646 0.356 4.671e3 5.869e-4 0.016 0.037 0.070 0.119 0.185 0.269 0.371 0.492 0.630 0.784 0.951 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x y z
2
2.979
0.075 1.129 3.519
15
16
17
18
19
20
21
22
23
24
25
-0.191 -0.439 -0.665 -0.867 -1.041 -1.187 -1.305 -1.393 -1.454 -1.489 -1.500 1.314 1.503 1.690 1.871 2.041 2.197 2.333 2.444 2.528 2.580 2.598 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №7 1 x y z
y z
3
4
5
6
7
8
9
10
11
12
13
1.023 1.088 1.182 1.283 1.368 1.412 1.394 1.300 1.123 0.868 0.549 0.188 -0.188 3.938e3 0.031 0.100 0.224 0.406 0.642 0.915 1.204 1.482 1.720 1.896 1.988 1.988 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x
2
15
16
17
18
19
20
21
22
23
24
25
-0.549 -0.868 -1.123 -1.300 -1.394 -1.412 -1.368 -1.283 -1.182 -1.088 -1.023 -1.000 3.938e3 1.896 1.720 1.482 1.204 0.915 0.642 0.406 0.224 0.100 0.031 0.000 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №8 1 x y z
y z
3
4
5
6
7
8
9
10
11
1.171 1.482 1.463 0.707 -0.809 -2.602 -3.861 -3.849 -2.315 0.309 3.038 0.076 0.537 1.453 2.464 2.939 2.341 0.584 -1.814 -3.910 -4.755 -3.863 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 14
x
2
15
16
17
18
19
20
21
22
23
24
12
13
4.765 -1.482 3.016
4.765 1.482 3.267
25
3.038 0.309 -2.315 -3.849 -3.861 -2.602 -0.809 0.707 1.463 1.482 1.171
1.000 -1.776e3.863 4.755 3.910 1.814 -0.584 -2.341 -2.939 -2.464 -1.453 -0.537 -0.076 15 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №9 1 x y z
14 x y z
2
3
4
5
6
7
8
9
10
11
12
13
1.308 1.528 0.427 -2.056 -4.163 -3.655 -0.044 4.436 6.295 3.663 -1.891 -6.348 -6.348 0.205 1.278 2.706 2.813 0.502 -3.183 -5.431 -3.942 0.823 5.568 6.613 2.918 -2.918 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 15
16
17
18
19
20
21
22
23
24
25
-1.891 3.663 6.295 4.436 -0.044 -3.655 -4.163 -2.056 0.427 1.528 1.308
1.000 3.553e-6.613 -5.568 -0.823 3.942 5.431 3.183 -0.502 -2.813 -2.706 -1.278 -0.205 15 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №10 1 x y z
y z
3
4
5
6
7
8
9
10
11
12
13
1.061 1.217 1.395 1.497 1.427 1.118 0.555 -0.214 -1.087 -1.927 -2.589 -2.953
-2.953 -1.977e0.979 1.808 2.367 2.593 2.490 2.121 1.596 1.039 0.559 0.225 0.052 1.977e-3 3 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x
2
15
16
17
18
19
20
21
22
23
24
25
-2.589 -1.927 -1.087 -0.214 0.555 1.118 1.427 1.497 1.395 1.217 1.061
1.000 2.573e-0.052 -0.225 -0.559 -1.039 -1.596 -2.121 -2.490 -2.593 -2.367 -1.808 -0.979 15 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №11 1 x y z
3
4
5
6
7
8
9
10
11
1.308 1.528 0.427 -2.056 -4.163 -3.655 -0.044 4.436 6.295 3.663 -1.891 3.583 4.897 3.207 -0.269 -3.302 -4.178 -2.693 -0.012 2.295 3.216 2.621 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 14
x y z
2
15
16
17
18
19
20
21
22
23
24
12
13
-6.348 0.991 3.016
-6.348 -0.991 3.267
25
-1.891 3.663 6.295 4.436 -0.044 -3.655 -4.163 -2.056 0.427 1.528 1.308 1.000 -2.621 -3.216 -2.295 0.012 2.693 4.178 3.302 0.269 -3.207 -4.897 -3.583 1.384e-14 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №12
1 x y z
3
4
5
6
7
8
9
10
11
12
13
1.031 1.118 1.245 1.385 1.504 1.568 1.541 1.393 1.105 0.668 0.088 -0.614 -1.402 5.258e3 0.041 0.135 0.306 0.563 0.903 1.312 1.761 2.212 2.621 2.939 3.117 3.116 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x y z
2
15
16
17
18
19
20
21
22
23
24
25
-2.225 -3.025 -3.736 -4.292 -4.631 -4.703 -4.472 -3.920 -3.056 -1.908 -0.531 1.000 2.903 2.462 1.793 0.914 -0.135 -1.298 -2.504 -3.672 -4.715 -5.547 -6.091 -6.283 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №13 1 x y z
3
4
5
6
7
8
9
10
11
12
13
-0.629 -0.803 -0.926 -0.991 -0.993 -0.934 -0.815 -0.646 -0.435 -0.198 0.052 0.299 0.527 0.314 0.068 -0.182 -0.421 -0.633 -0.806 -0.928 -0.991 -0.993 -0.932 -0.812 -0.642 -0.431 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x y z
2
15
16
17
18
19
20
21
22
23
24
25
0.722 0.871 0.966 1.000 0.971 0.881 0.736 0.545 0.319 0.073 -0.177 -0.416 -0.193 0.057 0.304 0.531 0.725 0.874 0.967 1.000 0.970 0.879 0.733 0.540 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №14 1 x y z
3
4
5
6
7
8
9
10
11
12
13
-0.629 -0.803 -0.926 -0.991 -0.993 -0.934 -0.815 -0.646 -0.435 -0.198 0.052 0.299 0.527 0.314 0.068 -0.182 -0.421 -0.633 -0.806 -0.928 -0.991 -0.993 -0.932 -0.812 -0.642 -0.431 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x y z
2
15
16
17
18
19
20
21
22
23
24
25
0.722 0.871 0.966 1.000 0.971 0.881 0.736 0.545 0.319 0.073 -0.177 -0.416 -0.193 0.057 0.304 0.531 0.725 0.874 0.967 1.000 0.970 0.879 0.733 0.540 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №15 1 x y z
3
4
5
6
7
8
9
10
11
12
13
-0.629 -0.803 -0.926 -0.991 -0.993 -0.934 -0.815 -0.646 -0.435 -0.198 0.052 0.299 0.527 -0.182 -0.806 -0.993 -0.642 0.057 0.725 1.000 0.733 0.068 -0.633 -0.991 -0.812 -0.193 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x y z
2
15
16
17
18
19
20
21
22
23
24
25
0.722 0.871 0.966 1.000 0.971 0.881 0.736 0.545 0.319 0.073 -0.177 -0.416 0.531 0.967 0.879 0.314 -0.421 -0.928 -0.932 -0.431 0.304 0.874 0.970 0.540 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №16 1 x y z
3
4
5
6
7
8
9
10
11
12
13
0.969 0.876 0.729 0.536 0.309 0.063 -0.187 -0.426 -0.637 -0.809 -0.930 -0.992 -0.992 0.249 0.482 0.685 0.844 0.951 0.998 0.982 0.905 0.771 0.588 0.368 0.125 -0.125 1.26 1.53 2.25 2.33 3.54 4.58 5.88 7.48 9.62 12.34 15.87 20.48 26.23 14
x
2
15
16
17
18
19
20
21
22
23
24
25
-0.930 -0.809 -0.637 -0.426 -0.187 0.063 0.309 0.536 0.729 0.876 0.969 1.000
y z
-0.368 -0.588 -0.771 -0.905 -0.982 -0.998 -0.951 -0.844 -0.685 -0.482 -0.249 0.000 33.73 43.76 55.77 71.70 92.19 118.53 152.40 195.95 251.94 323.93 416.48 535.49
Вариант №17 1 x y z
3
4
5
6
7
8
9
10
11
12
13
0.969 0.876 0.729 0.536 0.309 0.063 -0.187 -0.426 -0.637 -0.809 -0.930 -0.992 -0.992 3.742 1.588 0.846 0.495 0.309 0.203 0.139 0.099 0.072 0.054 0.042 0.033 0.026 0.251 0.503 0.754 1.005 1.257 1.508 1.759 2.011 2.262 2.513 2.765 3.016 3.267 14
x y z
2
15
16
17
18
19
20
21
22
23
24
25
-0.930 -0.809 -0.637 -0.426 -0.187 0.063 0.309 0.536 0.729 0.876 0.969 1.000 0.021 0.017 0.014 0.012 0.010 0.008 0.007 0.006 0.005 0.004 0.003 0.002 3.519 3.770 4.021 4.273 4.524 4.775 5.027 5.278 5.529 5.781 6.032 6.283
Вариант №18 1 x
2
3
4
5
6
7
8
9
10
11
12
13
0.314 0.745 1.270 1.854 2.452 3.013
y
3.487 3.830 4.005 3.991 3.782 3.394 2.858 0.061 0.221 0.414 0.542 0.488 0.143 -0.580 -1.721 -3.261 -5.110 -7.106 -9.024 10.591
z
0.969 0.876 0.729 0.536 0.309 0.063 -0.187 -0.426 -0.637 -0.809 -0.930 -0.992 -0.992 14
y
19 20 21 22 23 24 25 9.423e2.223 1.554 0.923 0.407 0.080 3 0.246 0.822 1.744 2.996 4.532 6.283 11.511 11.498 10.307 -7.773 -3.835 1.432 7.808 14.926 22.286 29.281 35.240 39.478
z
-0.930 -0.809 -0.637 -0.426 -0.187 0.063
x
15
16
17
18
0.309 0.536 0.729 0.876 0.969 1.000
Вариант №19 1 x y z
z
3
4
5
6
7
8
9
10
11
12
13
-0.629 -0.803 -0.926 -0.991 -0.993 -0.934 -0.815 -0.646 -0.435 -0.198 0.052 0.299 0.527 0.314 0.068 -0.182 -0.421 -0.633 -0.806 -0.928 -0.991 -0.993 -0.932 -0.812 -0.642 -0.431 0.257 0.550 0.939 1.576 3.078 15.895 -5.242 -2.125 -1.209 -0.727 -0.396 -0.126 0.126 14
x y
2
15
16
17
18
19
20
21
22
23
24
25
0.722 0.871 0.966 1.000 0.971 0.881 0.736 0.545 0.319 0.073 -0.177 -0.416 -0.193 0.057 0.304 0.531 0.725 0.874 0.967 1.000 0.970 0.879 0.733 0.540 0.396 0.727 1.209 2.125 5.242 15.895 -3.078 -1.576 -0.939 -0.550 -0.257 0.000
Вариант №20 1
2
3
4
5
6
7
8
9
10
11
12
13
x y z
-0.629 -0.803 -0.926 -0.991 -0.993 -0.934 -0.815 -0.646 -0.435 -0.198 0.052 0.299 0.527 -0.936 -0.650 -0.203 0.294 0.718 0.964 0.972 0.740 0.324 -0.172 -0.625 -0.924 -0.994 1.286 1.653 2.125 2.733 3.514 4.518 5.808 7.468 9.602 12.345 15.873 20.408 26.239
x
0.722 0.871 0.966 1.000 0.971 0.881 0.736 0.545 0.319 0.073 -0.177 -0.416
14
15
16
17
18
19
20
21
22
23
24
25
y z
-0.818 -0.440 0.047 0.522 0.869 1.000 0.884 0.549 0.079 -0.411 -0.800 -0.990 118.53 152.40 195.95 251.94 323.93 416.48 535.49 33.737 43.376 55.770 71.705 92.194 6 6 3 3 1 8 2
Приложение 3 Построение поверхностей по заданным уравнениям. № Функции 1. z = e x sin 2 y − e y cos 2 x 2. z = xy 3 − yx 3 3. 4. 5.
y( x 2 − 1) z= x2 +1 x 1 z = arctg + y ln( x 2 + y 2 ) y 2 2
2
Пределы изменения переменных
−2≤ x ≤2 −π≤ y≤π −2≤ x ≤2 −2≤ y≤2 − 2 ≤ x ≤ 2 −1 ≤ y ≤ 1 −1 ≤ x ≤ 1 −1 ≤ y ≤ 1 −2≤ x ≤2 −2≤ y≤2
6.
z = xe − x − y z = x sin( 2 y) + y 2 cos(2 x )
7.
z = x 2 sin( y) + y 3 cos( x )
π π π π ≤x≤ − ≤y≤ 3 3 3 3 −π≤ x ≤π −π≤ y≤π
8.
z = e x cos( x − y) + e y sin( y − x )
−π≤ x ≤π −π≤ y≤π
9.
z = e x cos 4 y
−
10. z = y cos( y − x ) + sin( 2 x + y) 11. z = cos( y + 3x ) + cos( x + 2 y) + y 2 12.
z = cos e y + e (x − y ) sin x 2
13. z = xy 2 + cos( x ) 14. z = sin( x − y) − y cos y 15. z = e cos x + sin y 16. z = sin( x + y) − x sin( y − x ) 17.
ex + y2 z= x+7
−
π π ≤x≤ 3 3 π π − ≤x≤ 3 3 π π − ≤x≤ 2 2 π π − ≤x≤ 2 2 −π≤ x ≤π
π π ≤y≤ 3 3 π π − ≤y≤ 3 3 π π − ≤y≤ 2 2 π π − ≤y≤ 2 2 −π≤ y≤π −
−π≤ x ≤π −π≤ y≤π −π≤ x ≤π −π≤ y≤π −π≤ x ≤π −π≤ y≤π − 2π ≤ x ≤ 2π − 2π ≤ y ≤ 2π
18. z = x sin y − y + x 19. z = x 2 − y 2 + xy
−π≤ x ≤π −π≤ y≤π −3≤ x ≤3 −3≤ y ≤3
20. z = x 2 + 2 x cos y
−π≤ x ≤π −π≤ y≤π
Приложение 4 Процедуры получения и установки цвета пиксела на изображении в Delphi. type TRGB = record Red,Blue,Green : integer; end; const MaxColor=255; var SvP : TRGB; procedure GetPixelRGB(AnyRis:TImage;x,y:integer;var GetRBG:TRGB); var SvP,W1,W2 : integer; begin SvP:=AnyRis.Canvas.Pixels[x,y]; W1:=SvP shr 16; W2:=SvP - (W1*$10000); GetRBG.Blue:=Lo(W1); // Blue GetRBG.Green:=Hi(W2); // Green GetRBG.Red:=Lo(W2); // Red end; procedure SetPixelRBG(AnyRis : TImage;x,y:integer;SetRGB:TRGB); begin if SetRGB.Blue<0 THEN SetRGB.Blue:=0; if SetRGB.Blue>MaxColor THEN SetRGB.Blue:=MaxColor; if SetRGB.Green<0 THEN SetRGB.Green:=0; if SetRGB.Green>MaxColor THEN SetRGB.Green:=MaxColor; if SetRGB.Red<0 THEN SetRGB.Red:=0; if SetRGB.Red>MaxColor THEN SetRGB.Red:=MaxColor; AnyRis.Canvas.Pixels[x,y]:= SetRGB.Blue*$10000+SetRGB.Green*$100+SetRGB.Red; end; Инициализация графического режима с поддержкой 256 цветов в Borland Pascal. Gd:=InstallUserDriver('SVGA256',nil); InitGraph(GD,Gr,'C:\BP\BGI'); i:=GraphResult; if i <> 0 then begin WriteLn('Графика не инециализировалась : ',i); Halt; end; Установка палитры градаций серого цвета в Borland Pascal. for i:=0 to 255 do SetRGBPalette(i,i div 4,i div 4,i div 4);