Векторная и матричная алгебра
1.1 Вектора
1.1.1 ОсновыВектор - линия с постоянным направлением и длиной ,
которую можно перемещать в координатной системе . Вектор можно нарисовать
вот так :
Вектора обычно марккируются так : a=(x1,y1,z1),
где x1 , y1 , z1 суть к-ты .
Введем понятие векторов единичной длины для каждой оси - i,j,k : для оси
x - это вектор i=(1,0,0), и т.д.
1.1.2 Векторное уравнение
Пусть имеется точка A с координатами
(Ax,Ay,Az), и точка B с координатами (Bx,By,Bz),тогда вектор с началом в
точке A и концом в точке B есть
AB = (Bx-Ax,By-Ay,Bz-Az)= (X,Y,Z).
И что
это значит ? А значит это буквально следующее : нам нужно встать в точку A и
протопать в направлении X расстояние , равное (Bx-Ax) , после чего проделать
еще 2 прогулки в направлении Y и Z .
1.1.3 Длина вектора
Длина вектора есть сумма квадратов его координат
:
|AB| = sqrt( X^2 + Y^2 + Z^2 ).
Или , что
то же самое , расстояние от начала координат до вершины .
Вычисление длины вектора необходимо , например , для phong shading и
vertex normal calculation .
Задачка : Возьмем вектор a = (1,1,1). Вычислим
единичный вектор , который к тому же параллелен к a.
- Решение ::
- |a| = sqrt ( 1^2 + 1^2 + 1^2 ) = sqrt(3),
- 1/sqrt(3)*(1,1,1) = ( 1/sqrt(3) , 1/sqrt(3) , 1/sqrt(3) ).
1.1.4 Сложение векторов
Результат - вектор :
a + b = (Ax+Bx,Ay+By,Az+Bz).
Задачка: Пусть a = (2,-6) и b =
(1,3). Вычислить длину | 2a - b |.
- Решение:
- 2a = (2*2,2*(-6)) = (4,-12).
- 2a-b = (4-1,-12-3) = (3,-15).
- |2a-b| = sqrt( 3^2 + (-15)^2 ) = sqrt(9+225) =
sqrt(234).
1.1.5 Скалярное умножение векторов
Два вектора можно перемножить
2-мя способами , и скалярное произведение есть произведение длин этих
векторов на косинус угла между ними . В этом есть геометрический смысл : это
есть ни что иное , как длина проекции вектора a на вектор b .
a dot b =
|a||b|cos(a,b)= Ax*Bx + Ay*By + Az*Bz
Cos(a,b) есть угол alpha.
Кстати ! Когда угол = 90 градусов , то (cos90 = 0 ->
a dot b = 0)!
Скалярное произведение пригодится при phong illuminating и много где еще
.
Задачка : Вычислить угол между двумя векторами
a+b и a-b, где a = (3,1) и b =
(1,-7).
- Решение:
- a+b = (3+1 , 1-7) = (4,-6)
- a-b = (3-1 , 1+7) = (2,8)
- (a+b) dot (a-b) = |a+b| *
|a-b| * cos(a+b,a-b), и с другой
стороны
- (a+b) dot (a-b) = 4*2 + (-6)*8 = 8-48 =
-40.
- |a+b| = sqrt( 4^2 + (-6)^2 ) = sqrt(16+36) =
sqrt(52),
- |a-b| = sqrt( 2^2 + 8^2 ) = sqrt(4+64) = sqrt(68). Из
выражения
- sqrt(52) * sqrt(68) * cos(a+b,a-b) =
-40 мы получаем
- cos(a+b,a-b) = -40 / sqrt(52*68).
- Этот угол равен 132.3 градуса .
1.1.6 Векторная проекция
Вычислим проекцию одного вектора на другой
.
- Для этого вычислим скалярное произведение 2-х векторов , после чего
умножим результат на вектор b :
a's component parallel to b = (a dot b)*b.
Результат представляет из себя масштабирование вектора b .
Это пригодится при конвертации вектора в матрицу .
1.1.7 Векторное умножение
В 3-мерном пространстве , векторное
умножение axb ("a cross b") 2-х векторов
a и b есть вектор , который перпендикулярен к каждому из 2-х
векторов a и b :
|a x b| =
|a||b|sin(a,b) (что эквивалентно площади
параллелограмма)
Другие свойства векторного умножения :
- a x a = 0,
- a x b = -(b x a),
- r - константа, (ra) x b = r(a x b),
- a x (b + c) = a x b + a x
c,
- i x j = k (k x i = j и
j x k = i).
Мы добрались до определителя матрицы - (кстати , с этого места когда-то
начинался мой курс математики в политехе ) .
Для нахождения векторного умножения , можно использовать
определитель матрицы 3*3 :
= ( Ay*Bz-By*Az , Az*Bx-Bz*Ax , Ax*By-Bx*Ay )
Векторное умножение полезно при нахождении нормалей .
Задачка : Найти площадь параллелограмма , определенного
векторами : (1,-1,2) и (2,3,-1).
Решение :
= (-5,5,5).
Площадь равна длине вот этого вектора =
sqrt( (-5)^2 + 5^2 + 5^2 ) = sqrt(75).
1.1.8 Умножение 3-х векторов
(axb) dot c, и
равно оно обьему тела , сформированного этими 3-мя векторами . Кстати , если
обьем = 0 , то все 3 вектора лежат в одной плоскости !
Задачка : Найти такую константу a , чтобы 3 вектора (1,-1,2),
(1,3,-1), (a,-4,1) оказались в одной плоскости .
Решение :
Сначала найдем векторное умножение первых 2-х векторов , затем
скалярно умножим результат на 3-й вектор : -5a - 15 = 0 <=> -5a = 15
<=> a = -3.
1.2 Матрицы
1.2.1 Основы
Специально организованная таблица действительных или комплексных чисел
зовется матрицей:
Элемент матрицы обозначается как a(y,x) , где 1-й индекс есть номер
строки и второй - номер столбца .
Матрица из 1-й строки
a = [ a(1) a(2) .. a(n) ]
Матрицы с одинаковым числом строк и столбцов суть квадратные матрицы .
Если все элементы матрицы=0 , кроме диагональных , то это диагональная
матрица :
В
идентичной матрице к тому же по диагонали везде стоят единицы .
Матрица называется ортогональной , если вектора , образованные из
строк или столбцов , взаимно перпендикулярны и имеют единичную длину .
Матрица B, определенная вот так
A*B = I <=> B = A^(-1),
называется
инверсной матрицей для A.
1.2.2 Матричные операции
1.2.2.1 Сложение
Каждый элемент b(j,k) второй матрицы
складывается с каждым элементом a(j,k) первой матрицы:
1.2.2.2 Умножение на скаляр
Здесь аналогично сложению ,
только вместо знака + будет * . Эта операция масштабирует матрицу .
1.2.2.3 Умножение 2-х матриц
Вот алгоритм :
Это напоминает скалярное векторное умножение . Сначала 1-я строчка 1-й
таблицы умножается скалярно на 1-й столбец 2-й таблицы , затем на 2-й стобец
, и т.д.
! При перемножении матриц есть существенное ограничение :
Если первая матрица имеет размерность p * q, вторая должна иметь размерность
q * r, причем p и r могут быть различны , а q - нет ! Результирующая матрица
будет иметь размерность p * r .
Полезно при object transformations.
1.2.2.3.1 Умножение на вектор
Рассмотрим вектор :
Xi+Yj+Zk = [ X Y Z ].
Умножим его на
матрицу :
Полезно
для vertex transformations .
1.2.2.4 Транспонирование
Пусть имеется матрица A(pxn).
Транспонированная к ней матрица есть
C(nxp) = AT,
где
C(j,k) = A(k,j).
Транспонирование необходимо при вращении вокруг произвольного вектора
Транспонирование ортогональной матрицы есть инверсия и используется при
оптимизации
Смотрите также:
http://blog-codera.net/