Как найти матрицу направляющих косинусов

Матрица преобразований (направляющих косинусов)

Рассмотрим теперь КЭ в составе рамы, расположенный под углом

α к оси Х в

общей системе осей координат.

Необходимо перейти от матрицы реакций [r]j в местной системе осей координат к

матрице [r] в общей системе координат.

Задачу решаем следующим образом. В начале построим матрицу [c]j, которая

преобразует перемещения КЭ {z}j в общей системе осей координат в перемещения {v}j,

по выражению

{v}j = [c]j {z}j

Y

Z3

V3

V4

К

Z4

Z2

Z6 =V6

V2

V1

Н

Z1

a

Z3 =V3

X

V1 = Z1 cosα + Z2 sinα

V2 = -Z1 sinα + Z2 cosα

V3 = Z3

V6 = Z6

V4 = Z4 cosα + Z5 sinα

V5 = -Z4 sinα + Z5 cosα

В матричной форме приведенная выше запись будет иметь вид

éV1 êêV2

êêV3

êV4 êêV5

êëV6

ù

é cosα

sinα

0

0

0

0ù

éZ1

ù

ú

ê

cosα

0

0

0

ú

ê

ú

ú

êsinα

0ú

êZ2

ú

ú

ê

0

0

1

0

0

0ú

êZ

3

ú

ú

= ê

0

0

0

cosα

sinα

ú

× ê

ú,

ú

ê

0ú

êZ4

ú

ú

ê

0

0

0

sinα

cosα

0ú

êZ

5

ú

ú

ê

0

0

0

0

ú

ê

ú

ú

ê 0

1ú

êZ

6

ú

û

ë

û

ë

û

или в блочной форме

éс

0 ù

[c]j = ê

н

ú,

ë

0

cк û

где для жесткого узла

é соsa

sina

0ù

[c]н,к =

êsina

cosa

0ú,

ê

0

0

ú

ê

1ú

для шарнирного узла

ë

û

é cosa

sinaù

[c]н,к =

ê

ú.

ësina

cosaû

Так как мы рассматриваем плоские упругие системы, то векторы узловых усилий и узловых перемещений, как для отдельного элемента, так и для сооружения в целом,

связаны между собой линейно

{S}j= [r]j{V}j

в местной системе осей координат.

{S}j = [r]j {Z}j

в общей системе осей координат

Кроме того

{V}j = [c]j{Z}j,

Аналогично

{S}j= [c]j{S}j,

где {S},{S}-узловые усилия КЭ соответственно, в местной и общей системах осей координат.

Тогда

{S}j = [c]j-1 {S}j= [c]j-1[r]j{V}j = [c]j-1[r]j[c]j{Z}j.

Для матрицы направляющих косинусов выполняется равенство

[c]j-1 = [c]jT,

Тогда

{S}j = [c]jT [r]j[c]j{Z}.

Обозначим

[r]j = [c]jT [r]j[c]j это выражение и является формулой для вычисления матрицы жесткости КЭ в общей системе осей координат.

При формировании матриц жесткости отдельных элементов [r]jдолжны быть зафиксированы начало и конец каждого стержня, так как от этого зависит знак угла a, определяющего ориентацию стержня в общей системе осей координат ХОY.

Соседние файлы в папке СФ

  • #
  • #
  • #
  • #
  • #
  • #

Матрицей поворота (или матрицей направляющих косинусов) называется ортогональная матрица, которая используется для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице.
Обычно считают, что, в отличие от матрицы перехода при повороте системы координат (базиса), при умножении на матрицу поворота вектора-столбца координаты вектора преобразуются в соответствии с поворотом самого вектора (а не поворотом координатных осей; то есть при этом координаты повернутого вектора получаются в той же, неподвижной системе координат). Однако отличие той и другой матрицы лишь в знаке угла поворота, и одна может быть получена из другой заменой угла поворота на противоположный; та и другая взаимно обратны и могут быть получены друг из друга транспонированием.

Матрица поворота в трёхмерном пространстве

Любое вращение в трехмерном пространстве может быть представлено как композиция поворотов вокруг трех ортогональных осей (например, вокруг осей декартовых координат). Этой композиции соответствует матрица, равная произведению соответствующих трех матриц поворота.
Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:
Вращение вокруг оси x:

Вращение вокруг оси y:

Вращение вокруг оси z:

После преобразований мы получаем формулы:
По оси Х
x’=x;
y’:=y*cos(L)+z*sin(L) ;
z’:=-y*sin(L)+z*cos(L) ;

По оси Y
x’=x*cos(L)+z*sin(L);
y’=y;
z’=-x*sin(L)+z*cos(L);

По оси Z
x’=x*cos(L)-y*sin(L);
y’=-x*sin(L)+y*cos(L);
z’=z;

Все три поворота делаются независимо друг от друга, т.е. если надо повернуть вокруг осей Ox и Oy, вначале делается поворот вокруг оси Ox, потом применительно к полученной точки делается поворот вокруг оси Oy.

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

Кватернионы. Решение одной навигационной задачи

Время на прочтение
10 мин

Количество просмотров 9K

История

Некоторое время назад я занимался одной интересной задачей, относящейся к спутниковой навигации. Используя фазовый фронт сигнала, объект навигации (ОНВ) измеряет координаты навигационных спутников (НС) в своей системе координат (локальная система, ЛСК). Также ОНВ получает значения положений НС в глобальной системе координат (ГСК), и измеряет время получения сигнала НС (рис. 1). Требовалось вычислить координаты ОНВ в ГСК и системное время, то есть решить навигационную задачу.

Рис. 1. Системы координат

Рис. 1. Системы координат

Задача была интересна тем, что её решение теоретически позволяет уменьшить число НС в сравнении с тем, сколько НС требуется в методах, реализованных в спутниковых системах навигации. Своё внимание в то время я в основном уделял исследованию качества измерений фазового фронта и получению навигационных уравнений для координат и времени, полагая при этом, что вычисление ориентации и координат ОНВ не вызовет особых проблем. Тем более, что на плоскости задача решалась быстро и просто.

Однако, когда я построил модель в трёхмерном пространстве, неожиданно выяснилось, что вычислить значения ориентации ОНВ при неизвестных его координатах в ГСК не получается. Несколько предпринятых попыток определить ориентацию с помощью матриц направляющих косинусов и поворотов привели к такому нагромождению тригонометрических функций, что продвигаться дальше к решению у меня не получалось. Какое-то время даже казалось, что аналитического решения вообще не существует.

Но оно, конечно, существует. Мне удалось найти решение этой задачи, используя свойства кватернионов. В этом материале я хочу описать саму задачу, ход и её решение, уделяя внимание ориентации и координатам ОНВ, и пока оставляя за рамками измерения координат по фазовому фронту.

Входные данные

Итак, входные данные:

mathbf R_i = begin{bmatrix}  	x_i & y_i & z_i  end{bmatrix}^T: вектор-столбец положения i-го НС в ГСК, i = 1, 2, 3: номер НС,
mathbf R_i ^{'} = begin{bmatrix}  	x_i^{'} & y_i^{'} & z_i^{'}  end{bmatrix}^T: вектор-столбец положения i-го НС в координатах ЛСК; векторы mathbf R_iи mathbf R_i^{'} полагаем известными; ГСК, ЛСК: правые декартовы системы координат в 3-х мерном евклидовом пространстве E^3 с разнонаправленными базисами (mathbf e_x, mathbf e_y, mathbf e_z) и ( mathbf e_x^{'}, mathbf e_y^{'}, mathbf e_z^{'})соответственно; начала координат ГСК и ЛСК не совпадают. Нижний индекс дальше будет обозначать номер вектора, верхний — номер элемента в векторе, если только не указано явно, что это степень.

Задача

Рис. 2. Основные величины

Рис. 2. Основные величины

Нужно найти:

mathbf R_a = begin{bmatrix}  	x_a & y_a & z_a  end{bmatrix}^T: вектор-столбец положения ОНВ в ГСК,

mathbf M: оператор перехода от ЛСК к ГСК, который я условно назвал «оператором ориентации» (рис. 2)

Решение

Теперь ход моих рассуждений и решения.

Разложение векторов mathbf R_i и mathbf R_i^{'} в своих базисах: mathbf R_i = x_i mathbf e_x + y_i mathbf e_y + z_i mathbf e_z,quad  	mathbf R_i^{'} = x_i^{'} mathbf e_x^{'} + y_i^{i} mathbf e_y^{'} + z_i^{'} mathbf e_z^{'}, где i=1,2,3 — номер НС. Базисные векторы ЛСК

begin{cases} 		mathbf e_x^{'} = a_1^1 mathbf e_x + a_1^2 mathbf e_y + a_1^3 mathbf e_z,\ 		mathbf e_y^{'} = a_2^1 mathbf e_x + a_2^2 mathbf e_y + a_2^3 mathbf e_z,\ 		mathbf e_z^{'} = a_3^1 mathbf e_x + a_3^2 mathbf e_y + a_3^3 mathbf e_z, 	end{cases}

где lbrace a_j^i: a_j^i in mathcal R rbrace, mathcal R — множество вещественных чисел, i = 1, 2, 3. Выписывая эти коэффициенты в матрицу

mathbf M = 	begin{bmatrix} 		a_1^1 & a_2^1 & a_3^1\ 		a_1^2 & a_2^2 & a_3^2\ 		a_1^3 & a_2^3 & a_3^3 	end{bmatrix},

получаем

mathbf e_x^{'} = mathbf M mathbf e_x,; 	mathbf e_y^{'} = mathbf M mathbf e_y,; 	mathbf e_z^{'} = mathbf M mathbf e_z,;

полагая, что mathbf e_x = begin{bmatrix} 	1 & 0 & 0 end{bmatrix}^T, mathbf e_y = begin{bmatrix} 	0 & 1 & 0 end{bmatrix}^T, mathbf e_z = begin{bmatrix} 	0 & 0 & 1 end{bmatrix}^T. Следовательно, координаты вектора mathbf R_i^{'}в базисе ГСК mathbf R_i^{''} = mathbf M mathbf R_i^{'}. Можно сказать, что mathbf M является матрицей некоторого линейного оператора (или «оператора ориентации»), такого, что E^3 to E^3, определённого в базисе ГСК. Такой матрицей может быть матрица направляющих косинусов или любая из матриц поворотов.

Свойства евклидового пространства позволяют записать уравнение для вычисления вектора положения ОНВ:

mathbf R_a = mathbf R_i - mathbf M mathbf R_i^{'}. (1)

Неудачный поиск решения

Уравнение (1) содержит две неизвестные матричные величины mathbf R_a и mathbf M, и имеет поэтому бесконечное число решений. Аналогичное соотношение для трёх различных НС в виде

mathbf R = mathbf R_a + mathbf M mathbf R^{'},qquad (2)

где

mathbf R = begin{bmatrix} 		x_1 & x_2 & x_3\ 		y_1 & y_2 & y_3\ 		z_1 & z_2 & z_3 	end{bmatrix},quad mathbf R^{'} = begin{bmatrix} 	x_1^{'} & x_2^{'} & x_3^{'}\ 	y_1^{'} & y_2^{'} & y_3^{'}\ 	z_1^{'} & z_2^{'} & z_3 ^ {'} end{bmatrix} -

квадратные невырожденные матрицы, также содержат две неизвестные матричные величины mathbf R_a и mathbf M. Можно переписать (1) и (2) так, чтобы избавиться от величины mathbf R_a:

mathbf R_a = mathbf R_i - mathbf M mathbf R_i^{'} = 	mathbf R_k - mathbf M mathbf R_k^{'},quad i ne k;quad i,k=1,2,3,

откуда

(x_k^{'} - x_i^{'}) mathbf M mathbf e_x + (y_k^{'} - y_i^{'}) mathbf M mathbf e_y + (z_k^{'} - z_i^{'}) mathbf M mathbf e_z = (x_k - x_i) mathbf e_x + (y_k - y_i) mathbf e_y + (z_k - z_i) mathbf e_z,

или

mathbf M mathbf R_{ki}^{'} = mathbf R_{ki}, qquad (3)

где mathbf R_{ki}^{'} = mathbf R_k^{'} - mathbf R_i^{'}.

Если бы я смог как-нибудь найти mathbf M из (3) и подставить в (1), то задача была бы решена. К примеру, была сделана попытка расписать (3) по трём НС аналогично с (2), но в итоге матрицы получались вырожденные и уравнение единственного решения поэтому не имело. Попытки расписать и решить систему уравнение вроде

begin{cases} 		mathbf M mathbf R_{12}^{'} = mathbf R_{12},\ 		mathbf M mathbf R_{13}^{'} = mathbf R_{13} ,	end{cases} qquad (4)

приводили к тому самому нагромождению синусов и косинусов, о котором я упомянул во вступлении.

Здесь я и подумал, а получится ли найти mathbf M, если (3) или (4) записать в кватернионном виде. В итоге получилось, но продолжу по порядку.

Теория о кватернионе поворота

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

Кватернионом, как мы знаем, является математический объект вида dot q = q^0 + iq^1 + jq^2 + kq^3 = q^0 + dot{ mathbf q}, где q^0, q^1, q^2, q^3in mathcal R, q^0— скалярная часть (множитель вещественной единицы), dot{mathbf q} — векторная часть; 1, i, j, k — вещественная и три разные мнимые единицы с таблицей умножения:

begin{split} 		1^2 = 1,quad 1i = i1,quad 1j = j1,quad 1k = k1,quad i^2 = j^2 = k^2 = -1,\ 		ij = -ji = k,quad jk = -kj = i,quad ki = -ik = j. 	end{split}

Кватернион даёт удобную возможность представления трёхмерных преобразований (вращений), определяя одновременно и ось поворота, и угол вращения. Если взять некоторый кватернион dot q = q^0 + dot{mathbf q} = q^0 + iq^1 + jq^2 + kq^3, такой, что Vert dot q Vert = 1, то можно записать, что Vert dot q Vert = q^{(0)^2} + Vert dot {mathbf q } Vert = 1, и значит Vert dot q Vert = cos^2 gamma + sin^2 gamma = 1, где cos^2 gamma = q^{(0)^2}, sin^2 gamma = Vert dot { mathbf q} Vert = q^{(1)^2} + q^{(2)^2} + q^{(3)^2}. Здесь индекс в скобках обозначает номер элемента, а верхний индекс без скобки — возведение в степень. Если вектор dot { mathbf q} представить как

mathbf{ dot q} = frac{1}{vert dot {mathbf q} vert} (q^1 + q^2 + q^3) vert dot {mathbf q} vert = (q^x + q^y + q^z) vert dot {mathbf q} vert = (q^x + q^y + q^z) sin gamma,

где q^x = frac{q^1}{vert dot {mathbf q} vert}, q^y = frac{q^2}{vert dot {mathbf q} vert}, q^z = frac{q^3}{vert dot {mathbf q} vert}, то кватернион dot q запишется так:

dot q = cos gamma + dot {mathbf q}_n sin gamma,

где dot {mathbf q}_n = iq^x + jq^y + kq^z. Если теперь взять произвольный кватернион dot R с нулевой скалярной частью и вектором dot {mathbf R}, то результатом операции

dot R^{'} = dot q circ dot R circ dot q^{-1} qquad (5)

будет вектор dot{mathbf R}^{'} с той же длиной, что и dot {mathbf R}, но повёрнутый на угол 2 gamma против часовой стрелки вокруг оси, направляющим вектором которой является dot {mathbf q}_n. Дальше будут встречаться фразы вроде «кватернион dot q выполняет поворот вектора dot R«, которые, конечно, подразумевают применение кватерниона dot q к вектору dot{mathbf R} и получение dot{mathbf R}^{'} в соответствии с (5).

Последний теоретический момент. Для обозначения разных видов умножения используются такие общеизвестные значки: dot {mathbf q} dot {mathbf r} или dot {mathbf q} cdot dot {mathbf r}: скалярное произведение,dot q circ dot r: кватернионное произведение,dot {mathbf q} times dot {mathbf r}: векторное произведение.

На этом с теорией всё.

Описание решения с кватернионами

Вернёмся к векторам mathbf R_{ki}^{'} и mathbf R_{ki}. Три замечания об их характере, которые потребуются дальше. Примем пока k = 1 , i = 2.

Нужные замечания

Во-первых, эти векторы являются свободными векторами, которые можно перемещать в пространстве, соблюдая параллельность перемещений.

Во-вторых, они неколлинеарны. Действительно, если бы они были коллинеарными, то (3) обращалось бы в истинное высказывание только при единичной матрице mathbf M и задачу решать не нужно было.

И, в-третьих, vert mathbf R_{12}^{'} vert = vert mathbf R_{12} vert. В самом деле, так как mathbf M — это ортогональная матрица, которая не меняет длину вектора mathbf R_{12}^{'}, то из (3) следует, что длины векторов mathbf R_{12}^{'} и mathbf R_{12} равны.

Tак как в (3) длины векторов не имеют значения, для упрощения записей и решения дальше заменю векторы mathbf R_{12}^{'} и mathbf R_{12} их нормированными эквивалентами:

mathbf r_1 equiv frac{mathbf R_{12}^{'}}{vert mathbf R_{12}^{'} vert} = 	begin{bmatrix} 		r_1^1 & r_1^2 & r_1^3 	end{bmatrix}^T, qquad mathbf p_1 equiv frac{mathbf R_{12}}{vert mathbf R_{12} vert} = begin{bmatrix} 	p_1^1 & p_1^2 & p_1^3 end{bmatrix}^T,

и в виде кватернионов:

dot r = 0 + mathbf{dot r}_1 = 0 + ir_1^1 + jr_1^2 + kr_1^3, quad 		dot p = 0 + mathbf{dot p}_1 = 0 + ip_1^1 + jp_1^2 + kp_1^3.

Кватернионная форма основных уравнений

Выражение (3) в кватернионной форме выглядит теперь так:

dot q circ dot r_1 circ dot q^{-1} = dot p_1,qquad (6)

где dot q— неизвестный кватернион, эквивалент mathbf M, а выражение (1) так:

dot R_a = dot R_1 - dot q circ dot R_1 circ dot q^{-1}, qquad (7)

где dot R_a = 0 + ix_a + jy_a + kz_a, dot R_1 = 0 + ix_1 + jy_1 + kz_1.

Рис. 3. Основные векторы

Рис. 3. Основные векторы

Так как векторы dot {mathbf r}_1 и dot {mathbf p}_1 свободны, неколлинеарны, то можно совместить их концы таким образом, чтобы dot {mathbf r}_1 и dot {mathbf p}_1 образовали угол gamma_1 на плоскости, натянутой на эти векторы (пусть эта плоскость будет lambda_1). Начало координат поместим в точку, общую для dot {mathbf r}_1 и dot {mathbf p}_1 (рис. 3), и будем полагать, что значение gamma_1 известно.

Уравнение (6), аналогично уравнению (3), по-прежнему имеет бесконечное множество решений: можно найти сколько угодно различных dot q, которые удовлетворяют (6). Геометрически это обозначает, что можно найти бесконечное число различных прямых, вокруг которых можно выполнить вращение, совмещающее dot {mathbf r}_1 с dot {mathbf p}_1. На рис. 3 приведён пример, в котором поворот выполняется по кратчайшему пути вокруг прямой с направляющим вектором dot {mathbf d}_1, ортогональным плоскости lambda_1. Очевидно, что gamma_{d_1} = gamma_1.

На рис. 4, а) и б) приведён пример, в котором вокруг некоторой оси с направляющим вектором dot {mathbf q}_1 построен круговой конус tau_1 с направляющими прямыми dot {mathbf r}_1 и dot {mathbf p}_1. Ясно, что вокруг такой оси можно сделать поворот, совмещающий dot {mathbf r}_1 с dot {mathbf p}_1, который будет выполнен не по кратчайшему пути (не в плоскости lambda_1), и угол gamma_{q_1}, измеряемый в плоскости основания конуса tau_1, не будет равен gamma_1, измеряемый в плоскости lambda_1.

Рис. 4. Поворот r к p вокруг произвольной оси

Рис. 4. Поворот r к p вокруг произвольной оси

Чтобы найти неизвестное значение dot q, я добавил два новых объекта:

dot r_2 = frac {dot R_{13}^{'} }{vert dot R_{13}^{'} vert} и dot p_2 = frac {dot R_{13}}{vert dot R_{13} vert},

получаемые из векторов mathbf R_3 и mathbf R_1. Выражение (6), аналогично (4), расширяется до системы уравнений

begin{cases} 	dot q circ dot r_1 circ dot q^{-1} = dot p_1,\ 	dot q circ dot r_2circ dot q^{-1} = dot p_2. end{cases} qquad (8)

Теперь можно утверждать, что кватернион dot q, найденный из этой системы уравнений (8), является единственным решением, и он выполняет такой поворот в пространстве, который совмещает тройку векторов базиса ЛСК с векторами ГСК. Следовательно, его можно подставить в выражение (7) и вычислить искомое R_a — положение ОНВ.

Когда я записал (8), отчего-то стало ясно, что здесь безразмерная куча тригонометрии может не возникнуть, и аналитическое решение поэтому можно будет найти более-менее просто.

Геометрия задачи

Рис. 5. Геометрия задачи

Рис. 5. Геометрия задачи

Геометрически задача теперь выглядит так. Нужно найти в пространстве такую ось, вокруг которой можно выполнить поворот, совмещающий вектор dot {mathbf r}_1 с вектором dot {mathbf p}_1, и вектор dot {mathbf r}_2 с вектором dot {mathbf p}_2. Прямые, направляющими векторами которых являются dot {mathbf r}_1 (или dot {mathbf p}_1) и dot {mathbf r}_2 (или dot {mathbf p}_2), образуют два различных круговых конуса tau_1, tau_2. Эти конусы имеют общую ось, направляющим вектором которой является искомый dot {mathbf q}. При этом повороты dot {mathbf r}_i к dot {mathbf p}_i, i = 1, 2, будут выполняться не по кратчайшему пути, и поэтому углы gamma_{q_i}, измеренные в плоскости оснований конусов tau_i, будут отличаться от углов gamma_i (рис. 5).

Здесь и далее нам понадобятся два таких утверждения.

Утверждение 1. Угол поворота вокруг биссектрисы dot {mathbf b}_1 такого, который совмещает dot {mathbf r}_1 с dot {mathbf p}_1, равен pi (рис. 4, в), г)).

Утверждение 2. Поворот, который совмещает dot {mathbf r}_i с dot {mathbf p}_i, i = 1, 2, вокруг некоторой прямой можно сделать тогда и только тогда, когда эта прямая лежит в плоскости, натянутой на dot {mathbf d}_i и dot {mathbf b}_i (плоскость delta_i), рис. 6). Вокруг любой другой прямой такой поворот выполнить нельзя.

Рис. 6. Плоскости векторов b и d

Рис. 6. Плоскости векторов b и d

Для доказательства этих утверждений нужно рассмотреть свойства кругового конуса tau_i, образованного линией, направляющий вектор которой равен dot {mathbf r}_i (или dot {mathbf p}_i), а ось лежит в плоскости delta_i.

Очевидно, что ось, вокруг которой можно сделать такой поворот, который совместит dot {mathbf r}_i с dot {mathbf p}_i , i = 1, 2, будет одновременно принадлежать обеим плоскостям delta_i, то есть будет совпадать с линией их пересечения. Поэтому вектор dot {mathbf q} будем искать из уравнения линии пересечения плоскостей delta_i (рис. 7).

Рис. 7. Линия пересечения плоскостей

Рис. 7. Линия пересечения плоскостей

Эта прямая не будет совпадать с прямыми, определяемые направляющими векторами dot {mathbf d}_i. Проходя через начало координат, она образует некоторый угол beta_1 с вектором dot {mathbf d}_1, и угол beta_2 с вектором dot {mathbf d}_2 (рис. 8). Оба этих угла нам пока неизвестны и beta_1 ne beta_2.

Рис. 8. Все векторы

Рис. 8. Все векторы

Посмотрим на рис. 8. Если взять некоторый кватернион dot e_{d_1}, который поворачивает вектор dot {mathbf r}_1 на pi в плоскости lambda_1, т.е.

dot e_{d_1} = 0 + dot {mathbf s}_1, qquad (9)

и повернуть его вокруг начала координат на угол beta_1 в плоскости delta_1, то из

dot e_{q_1}(beta_1) = dot h_1(beta_1) circ dot e_{d_1} circ dot h_1^{-1}(beta_1) qquad (10)

мы получим вектор dot {mathbf e}_{q_1}(beta_1), который в свою очередь является кватернионом поворота на угол pi для вектора dot {mathbf r}_1, причём dot {mathbf r}_1 при этом будет описывать дугу в пространстве. Поворот dot {mathbf e}_{d_1} к dot {mathbf e}_{q_1} может быть выполнен кватернионом dot h_1(beta_1), который мы найдём чуть позже из условия его ортогональности к плоскости delta_1.

Из утверждения 2 следует, что вектор dot {mathbf r}_1 может быть совмещён с dot {mathbf p}_1 вращением вокруг оси с направляющим вектором dot {mathbf e}_{q_1}(beta_1) на некоторый угол gamma_{q_1}, который, очевидно, функционально зависит от beta_1. Поэтому, зная beta_1 и зависимость gamma_{q_1} = f(beta_1), мы сможем построить из кватерниона dot {mathbf e}_{q_i} кватернион dot q, являющийся решением задачи.

Зависимость gamma_{q_1} = f(beta_1) мы найдём немного позже из простых тригонометрических соотношений.

Угол beta_1 будем искать из следующих соображений. Так как dot {mathbf q} ортогонален одновременно dot {mathbf h}_1 и dot {mathbf h}_2, то результат векторного произведения dot {mathbf h}_1(beta_1) times dot {mathbf h}_2(beta_2) будет сонаправлен с dot {mathbf q}. Обозначим

dot {mathbf q}_e equiv dot {mathbf h}_1(beta_1) times dot {mathbf h}_2(beta_2) qquad (11)

и запишем такое скалярное произведение: dot {mathbf e}_{q_1}(beta_1) dot {mathbf q}_e. Отметим, что направление dot {mathbf q}_e не зависит ни от beta_1, ни от beta_2. Поэтому для вычисления dot {mathbf q}_e примем dot h_1 = dot h_1 (beta_1) vert _{beta_1 = pi} и dot h_2 = dot h_2 (beta_2) vert _{beta_2 = pi}, то есть угол, при котором vert dot {mathbf h}_i vert = 1. Следовательно, в записанном выше скалярном произведении остаётся одна переменная beta_1, которую можно вычислить, решив уравнение

dot {mathbf e}_{q_1}(beta_1) frac{dot {mathbf q}_e}{ vert dot {mathbf q}_e vert } = dot {mathbf e}_{q_1}(beta_1) dot{mathbf q}_{e_{n}} = 1, qquad (12)

полагая, что vert dot {mathbf e}_{q_1} (beta_1) vert = 1 . Теперь, зная beta_1, зависимость gamma_{q_1} = f(beta_1) и вектор dot {mathbf e}_{q_1}(beta_1), искомый кватернион dot {mathbf q} будет выглядеть так:

dot {mathbf q} = cos frac{gamma_{q_1}}{2} + dot {mathbf e}_{q_1} sin frac{gamma_{q_1}}{2}. qquad (13)

Осталось найти каждый из описанных выше элементов, чтобы решить задачу. Заметим, что объекты dot e_{d_2 }, dot e_{q_2}, dot h_2, beta_2, gamma_2, gamma_{q_2} определяются аналогично. Поэтому далее нижний индекс «1» или «2» буду заменять на » i «, подразумевая, что i = 1, 2 .

Кватернионы, которые будем искать

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

  • кватернион dot d_i: совмещает вектор dot{mathbf r}_i с dot{mathbf p}_i по кратчайшей траектории,

  • кватернион dot b_i: направляющий вектор биссектрисы угла между векторами dot{mathbf r}_i и dot{mathbf p}_i; векторы dot{mathbf d}_i и dot{mathbf b}_i определяют плоскость delta_i, в которой лежит искомый кватернион dot q,

  • кватернион dot e_{d_i}: сонаправлен с dot d_i; модуль векторной части dot e_{d_i} равен 1,

  • кватернион dot h_i(beta_i): поворачивает вектор dot{mathbf e}_{d_i} в плоскости delta_i на угол beta_i ; значение beta_i неизвестно,

  • зависимость gamma_{q_i} = f(beta_i): вычисляет gamma_{q_i} для построения искомого кватерниона dot q из dot e_{q_i},

  • кватернион dot e_{q_i} (beta_i): получен поворотом вектора dot{mathbf e}_{d_i} в плоскости delta_i на угол beta_i; из dot e_{q_i} будет получено решение,

  • кватернион dot q_e: нужен для вычисления угла beta_i,

  • и, наконец, результирующий кватернион dot q: получается из dot e_{q_i}, учитывая найденные beta_i и gamma_{q_i}.

Кватернион dot d_i

Найдём кватернион dot d_i, который совмещает dot {mathbf r}_i с dot {mathbf p}_i по кратчайшей траектории. Вектор dot {mathbf r}_i перемещается в плоскости lambda_i, а ось поворота перпендикулярна lambda_i и проходит через точку начала координат (рис. 3). Направляющий вектор этой оси может быть равен dot { mathbf r}_i times dot {mathbf p}_i . Так как vert dot {mathbf r}_i vert = vert dot {mathbf p}_i vert = 1, и vert dot {mathbf r}_i times dot {mathbf p}_i vert = vert dot {mathbf r}_i vert vert dot {mathbf p}_i vert sin gamma_i, то:

dot {mathbf r}_i times dot {mathbf p}_i = frac{ dot {mathbf r}_i times dot {mathbf p}_i }{ vert dot {mathbf r}_i times dot {mathbf p}_i  vert } vert dot {mathbf r}_i times dot {mathbf p}_i  vert = dot {mathbf s}_i sin gamma_i, qquad (14)

где dot {mathbf s}_i — единичный вектор, равный

dot {mathbf s}_i = frac{1}{sin gamma_i} 	begin{vmatrix} 		i & j & k \ 		r_i^1 & r_i^2 & r_i^3 \ 		p_i^1 & p_i^2 & p_i^3 	end{vmatrix} = is_i^x + js_i^y + ks_i^z, qquad (15)

где

s_i^x = frac{r_i^2 p_i^3 - r_i^3 p_i^2}{sin gamma_i}, quad 	s_i^y = frac{r_i^3 p_i^1 - r_i^1 p_i^3}{sin gamma_i}, quad 	s_i^z = frac{r_1^1 p_1^2 - r_i^2 p_i^1}{sin gamma_i}. qquad (16)

Произведение dot {mathbf s}_i sin gamma_i может представлять собой векторную часть некоторого кватерниона dot s_i, который выполняет поворот вектора dot {mathbf r}_i на угол 2 gamma_i в плоскости lambda_i: dot s_1 = cos gamma_i + dot {mathbf s}_i sin gamma_i. Поэтому кватернион поворота dot {mathbf d}_i на угол gamma_i равен

dot d_i = cos frac{gamma_i}{2} + dot {mathbf s}_i sin frac{gamma_i}{2} qquad (17)

и

dot p_i = dot d_i circ dot r_i circ dot d_i^{-1}.

Кватернион dot b_i

Найдём кватернион dot b_i. Он может быть получен из преобразования

dot b_i = dot d_{b_i} circ dot r_i circ dot d_{b_i}^{-1}, qquad (18)

где dot d_{b_i} — кватернион, выполняющий поворот вектора dot {mathbf r}_i на угол frac{gamma_i}{2}. Учитывая (17), он равен

dot d_{b_i} = cos frac{gamma_i}{4} + dot {mathbf s}_1 sin frac{gamma_a}{4}. qquad (19)

Подставим dot d_{b_i} из (19) в (18), выполним кватернионные умножения и, учитывая (14), получим:

begin{split} 		dot b_i = dot {mathbf r}_i cos^2 frac{gamma_i}{4} - dot {mathbf r}_i circ dot {mathbf s}_i sin frac{gamma_i}{4} cos frac{gamma_i}{4} + dot {mathbf s}_i circ dot {mathbf r}_i sin frac{gamma_i}{4} cos frac{gamma_i}{4} - dot {mathbf s}_i circ dot {mathbf r}_i circ dot {mathbf s}_i sin^2 frac{gamma_i}{4} = \ 		= dot {mathbf r}_i cos^2 frac{gamma_i}{4} - dot {mathbf r}_i times (dot {mathbf r}_i times dot {mathbf p}_i) frac{sin frac{gamma_i}{2}}{sin gamma_i} - ((dot {mathbf r}_i times dot {mathbf p}_i) times dot {mathbf r}_i ) times (dot {mathbf r}_i times dot {mathbf p}_i ) frac{sin^2 frac{gamma_i}{4}}{sin^2 gamma_i}. 	end{split}

Применяя правило «БАЦ минус ЦАБ» и упрощая, получаем

dot b_i =0 + (dot {mathbf r}_i + dot {mathbf p}_i) frac{sin frac{gamma_i}{2}}{sin gamma_i}. qquad (20)

Заметим, что vert dot {mathbf b}_i vert = 1.

Зависимость gamma_{q_1} = f(beta_1)

Рис. 9.

Рис. 9.

Найдём зависимость gamma_{q_1} = f(beta_1). Возьмём конус tau_1 из рис. 6, для удобства развернём его основанием вниз и изобразим все основные векторы и углы (рис. 9). Также добавим угол alpha_i = frac{pi}{2} - beta_1.

Будем находить зависимость угла gamma_{q_1}, соответствующего углу поворота вокруг dot {mathbf q}_{e_1} от dot {mathbf r}_1 к dot {mathbf p}_1, от значения угла beta_1, то есть от угла наклона dot {mathbf q}_{e_1} к плоскости векторов dot {mathbf r}_1, dot {mathbf p}_1 (т.е. к плоскости lambda_1). Заметим, что при beta_1 = 0 поворот выполняется по кратчайшей траектории вокруг mathbf{dot d}_1.

Из соотношений прямоугольных треугольников запишем:

begin{split} 		vert RR^{'} vert = vert dot {mathbf r} vert sin frac{gamma_1}{2}, quad 		vert dot {mathbf b}_1 vert = vert dot {mathbf r} vert cos frac{gamma_i}{2}, quad 		vert R^{'}O^{'} vert = vert dot {mathbf b}_1 vert sin alpha_1, 	end{split}

откуда vert R^{'}O^{'} vert = vert dot {mathbf r}_1 vert cos frac{gamma_1}{2} sin alpha_1. Так как tan frac{gamma_{q_1}}{2} = frac{vert RR^{'} vert }{vert R^{'}O^{'} vert} ), то

tan frac{gamma_{q_1} }{2} = vert dot {mathbf r}_1 vert sin frac{gamma_1}{2} frac{1}{cos frac{gamma_1}{2} sin alpha_1} = frac{1}{sin alpha_1} tan frac{gamma_i}{2},

откуда

gamma_{q_1} = 2 arctan (frac{1}{cos beta_1} tan frac{gamma_1}{2}). qquad (21)

Из выражения (21) видно, что при beta_1 = 0 значение gamma_{q_1} = gamma_1, а при beta_1 = frac{pi}{2} значение gamma_{q_1} = pi, что согласуется с утверждением 1. Заметим также, что угол gamma_{q_1} не зависит от длин векторов, а угол gamma_i полагается известным.

Кватернион dot h_i(beta_i)

Продолжим. Построим кватернион dot h_i. Поскольку он выполняет поворот dot{mathbf e}_{d_i} на угол beta_i в плоскости delta_i, то

dot h_i(beta_i) = cos frac{beta_i}{2} + dot{mathbf e}_{d_i} times dot{mathbf b}_i sin frac{beta_i}{2}, qquad (22)

полагая, что vert dot{mathbf e}_{d_i} vert = 1, vert dot{mathbf b}_i vert = 1. Учитывая (9), (18), выполнив некоторые преобразования, получим

begin{split}  		dot{mathbf e}_{d_i} times dot{mathbf b}_i = dot{mathbf r}_i (tan^{-2} gamma_i sin frac{gamma_i}{2} - tan^{-1} gamma_i cos frac{gamma_i}{2} - frac{sin frac{gamma_i}{2}}{sin^2 gamma_i})  		+ dot{mathbf p}_i (frac{cos frac{gamma_i}{2}}{sin gamma_i} - frac{cos gamma_i}{sin^2 gamma_i} sin frac{gamma_i}{2} + frac{sin frac{gamma_i}{2}}{sin^2 gamma_i}).  	end{split}

После упрощающих тригонометрических преобразований, подставляя в (22), получаем

dot h_i(beta_i) = cos frac{beta_i}{2} + (dot{mathbf p}_i - dot{mathbf r}_i) frac{cos frac{gamma_i}{2}}{sin gamma_i} sin frac{beta_i}{2}, qquad (23)

при этом vert dot h_i(beta_i) vert = 1.

Кватернион dot e_{q_i}(beta_i)

Найдём кватернион dot e_{q_i}. Выше мы записали выражение (9), которое определяет dot e_{q_i}. Приведём его здесь ещё раз: dot e_{q_i}(beta_i) = dot h_i(beta_i) circ dot e_{d_i} circ dot h_i^{-1}(beta_i). Подставляя сюда полученный результат (23) и выражение (9), после преобразований получим:

dot e_{q_i} = C(A^2 dot{mathbf r}_i times dot{mathbf p}_i -2AB(dot{mathbf r}_i + dot{mathbf p}_i)(cos gamma_i -1) - 2B^2 dot{mathbf r}_i times dot{mathbf p}_i (1-cos gamma_i)),

где A equiv cos frac{beta_i}{2}, B equiv frac{cos frac{gamma_i}{2}}{sin gamma_i } sin frac{beta_i}{2}, C equiv frac{1}{sin frac{gamma_i}{2}}. Упрощая, получаем:

dot e_{q_i} = frac{1}{sin gamma_i} (dot{mathbf r}_i times dot{mathbf p}_i cos beta_i + (dot{mathbf r}_i + dot{mathbf p}_i) sin frac{gamma_i}{2} sin beta_i), qquad (24)

при этом vert dot e_{q_i} vert = 1.

Кватернион dot q_e

Получим кватернион dot q_e. Как мы указывали выше, вектор этого кватерниона ортогонален каждому из векторов dot{mathbf h}_1 и dot{mathbf h}_2, то есть dot {mathbf q}_e equiv dot {mathbf h}_i(beta_i) times dot {mathbf h}_i(beta_i) (выражение (11)), и при этом vert dot{mathbf q}_e vert ne 1. Также мы отмечали, что угол beta_i не меняет направление вектора dot{mathbf h}_i, и поэтому можно выбрать такое beta_i, при котором длина dot{mathbf h}_i максимальна. Учитывая (23) при beta_i = pi, получаем:

dot h_1 = (dot{mathbf p}_1 - dot{mathbf r}_1) frac{cos frac{gamma_1}{2}}{sin gamma_1}, quad 	dot h_2 = (dot{mathbf p}_2 - dot{mathbf r}_2) frac{cos frac{gamma_2}{2}}{sin gamma_2}, qquad (25)

следовательно,

dot{mathbf q}_e = (dot{mathbf p}_1 - dot{mathbf r}_1) times  (dot{mathbf p}_2 - dot{mathbf r}_2) frac{cos frac{gamma_1}{2}}{sin gamma_1} frac{cos frac{gamma_2}{2}}{sin gamma_2}. qquad (26)

Нормированное значение

dot{mathbf q}_{e_n} = frac{ (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) }{vert (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) vert}. qquad (27)

Угол beta_i

Подставляем результаты в выражение (12) и получаем уравнение, которое нужно решить относительно beta_1:

frac{1}{sin gamma_1} (dot{mathbf r}_1 times dot{mathbf p}_1 cos beta_1 + (dot{mathbf r}_1 + dot{mathbf p}_1) sin frac{gamma_1}{2} sin beta_1) frac{ (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) }{vert (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) vert} = 1. qquad (28)

После преобразований получаем это уравнение в форме A cos beta_1 + B sin beta_1 = 1, которое и решаем:

beta_1 = arcsin frac{1}{sqrt{A^2 + B^2}} - arcsin frac{A}{sqrt{A^2 + B^2}}, qquad (29)

где

begin{split} 		A = frac{dot{mathbf r}_1 times dot{mathbf p}_1}{sin gamma_1} frac{ (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) }{vert (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) vert}, quad 		B = frac{sin frac{gamma_1}{2}}{sin gamma_1} (dot{mathbf r}_1 + dot{mathbf p}_1) frac{ (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) }{vert (dot{mathbf p}_1 - dot{mathbf r}_1) times (dot{mathbf p}_2 - dot{mathbf r}_2) vert} 	end{split}.

Решение

Зная beta_1, можно построить кватернион dot e_{q_1} из (24), подставить его в (13) и записать результат в виде:

	dot q =cos frac{gamma_{q_1}}{2} + frac{1}{sin gamma_1} (dot{mathbf r}_1 times dot{mathbf p}_1 cos beta_1 + (dot{mathbf r}_1 + dot{mathbf p}_1) sin frac{gamma_1}{2} sin beta_1) sin frac{gamma_{q_1}}{2}, qquad (30)

где

gamma_{q_1} = 2 arctan (frac{1}{cos beta_1} tan frac{gamma_1}{2}), qquad (31)

а beta_1 вычисляется из выражения (29).

Послесловие

Задача решена. Я попытался упростить итоговое выражение (30), но пока не получилось. В моделях оно работает, поэтому пока оставлю, как есть. На рис. 10 приведён простой пример нахождения ориентации ЛСК для того, чтобы затем определить R_a.

Рис. 10. Вращение ЛСК

Рис. 10. Вращение ЛСК

Вначале положение ЛСК (x^{'}, y^{'}, z^{'}) неизвестно, и мы полагаем, что оно может быть любым или, например, совпадающим с ГСК (то есть, мы «думаем», что оно совпадает, а на самом деле это не так). Измеренные координаты НС1′, НС2′ и НС3′ существенно отличаются от истинных положений НС1, НС2 и НС3 (рис. 10, а)). Зная координаты НС в ГСК, вычисляется кватернион поворота dot q по (30) и выполняется вращение. На рис. 10, б) показано дискретное вращение с интервалом 10 градусов от старого положения ЛСК к истинному. При этом измеренные координаты НС (показаны светло-серым цветом) всё более приближаются к истинным. На рис. 10, в) показано вычисленное истинное положение ЛСК, и мы теперь можем определить R_a, то есть решить навигационную задачу (точнее, часть навигационной задачи, связанной с определением координат).

На этом пока всё. Отмечу только, что в ближайшем будущем я попробую поработать над одним недостатком выражения (30). При gamma_1 близким к нулю, то есть когда ориентации ГСК и ЛСК мало отличаются, кватернион dot q вычисляется с ошибкой из-за множителя frac{1}{ sin gamma_1}. Это может приводить к значительным ошибкам вычисления ориентации ЛСК и, как результат, ошибкам определения положения R_a. Об этом в следующем материале.

Вращение фигуры в 3-х мерном пространстве

Матрицей поворота (или матрицей направляющих косинусов) называется ортогональная матрица, которая используется для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице.
Обычно считают, что, в отличие от матрицы перехода при повороте системы координат (базиса), при умножении на матрицу поворота вектора-столбца координаты вектора преобразуются в соответствии с поворотом самого вектора (а не поворотом координатных осей; то есть при этом координаты повернутого вектора получаются в той же, неподвижной системе координат). Однако отличие той и другой матрицы лишь в знаке угла поворота, и одна может быть получена из другой заменой угла поворота на противоположный; та и другая взаимно обратны и могут быть получены друг из друга транспонированием.

Матрица поворота в трёхмерном пространстве

Любое вращение в трехмерном пространстве может быть представлено как композиция поворотов вокруг трех ортогональных осей (например, вокруг осей декартовых координат). Этой композиции соответствует матрица, равная произведению соответствующих трех матриц поворота.
Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:
Вращение вокруг оси x:

Вращение вокруг оси y:

Вращение вокруг оси z:

После преобразований мы получаем формулы:
По оси Х
x’=x;
y’:=y*cos(L)+z*sin(L) ;
z’:=-y*sin(L)+z*cos(L) ;

По оси Y
x’=x*cos(L)+z*sin(L);
y’=y;
z’=-x*sin(L)+z*cos(L);

По оси Z
x’=x*cos(L)-y*sin(L);
y’=-x*sin(L)+y*cos(L);
z’=z;

Все три поворота делаются независимо друг от друга, т.е. если надо повернуть вокруг осей Ox и Oy, вначале делается поворот вокруг оси Ox, потом применительно к полученной точки делается поворот вокруг оси Oy.

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

Матрица поворота на угол

В двумерном пространстве поворот можно описать одним углом со следующей матрицей линейного преобразования в декартовой системе координат:

Поворот выполняется путём умножения матрицы поворота на вектор-столбец, описывающий вращаемую точку:

.

Координаты (x’,y’) в результате поворота точки (x,y) имеют вид:

,

.

Положительным углам при этом соответствует вращение вектора против часовой стрелки в обычной, правосторонней системе координат, и по часовой стрелке в левосторонней системе координат.

[править] Матрица поворота в трёхмерном пространстве

Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве являются:

· Вращение вокруг оси x:

,

· Вращение вокруг оси y:

,

· Вращение вокруг оси z:

.

Положительным углам при этом соответствует вращение вектора против часовой стрелки в правой системе координат, и по часовой стрелке в левой системе координат, если смотреть на плоскость вращении со стороны полупространства, где значения координат оси, вокруг которой осуществляется поворот, положительные. Правая система координат связана с выбором правого базиса (см. правило буравчика).

Свойства матрицы поворота.

Свойства матрицы поворота

Если — матрица, задающая поворот вокруг оси на угол ϕ, то:

·

·

·

· (след матрицы вращения)

· (матрица имеет единичный определитель).

· если строки (или столбцы матрицы) рассматривать как координаты векторов , то верны следующие соотношения):

o

o

o

· Матрица обратного поворота получается обычным транспонированием матрицы прямого поворота, т. о. .

24. Алгоритм Брезенхема для растеризации отрезка.

Алгоритм Брезенхе́ма (англ. Bresenham’s line algorithm) — это алгоритм, определяющий, какие точки двумерного растра нужно закрасить, чтобы получить близкое приближение прямой линии между двумя заданными точками. Это один из старейших алгоритмов в машинной графике — он был разработан Джеком Е. Брезенхэмом (Jack E. Bresenham) в компании IBM в 1962 году. Алгоритм широко используется, в частности, для рисования линий на экране компьютера. Существует обобщение алгоритма Брезенхэма для построения кривых 2-го порядка.

Алгоритм

Отрезок проводится между двумя точками — (x ,y ) и (x1,y1), где в этих парах указаны колонка и строка, соответственно, номера которых растут вправо и вниз. Сначала мы будем предполагать, что наша линия идёт вниз и вправо, причём горизонтальное расстояние x1x превосходит вертикальное y1y , т.е. наклон линии от горизонтали — менее 45°. Наша цель состоит в том, чтобы для каждой колонки x между x и x1, определить, какая строка y ближе всего к линии, и нарисовать точку (x,y).

Общая формула линии между двумя точками:

Поскольку мы знаем колонку x, то строка y получается округлением к целому следующего значения:

Однако, вычислять точное значение этого выражения нет необходимости. Достаточно заметить, что y растёт от y и за каждый шаг мы добавляем к x единицу и добавляем к y значение наклона

которое можно вычислить заранее. Более того, на каждом шаге мы делаем одно из двух: либо сохраняем тот же y, либо увеличиваем его на 1.

Что из этих двух выбрать — можно решить, отслеживая значение ошибки, которое означает — вертикальное расстояние между текущим значением y и точным значением y для текущего x. Всякий раз, когда мы увеличиваем x, мы увеличиваем значение ошибки на величину наклона s, приведённую выше. Если ошибка превысила 0.5, линия стала ближе к следующему y, поэтому мы увеличиваем y на единицу, одновременно уменьшая значение ошибки на 1. В реализации алгоритма, приведённой ниже, plot(x,y) рисует точку, а abs возвращает абсолютную величину числа:

function line(x0, x1, y0, y1) int deltax := abs(x1 – x0) int deltay := abs(y1 – y0) real error := 0 real deltaerr := deltay / deltax int y := y0 for x from x0 to x1 plot(x,y) error := error + deltaerr if error >= 0.5 y := y + 1 error := error – 1.0

Проблема такого подхода — в том, что с вещественными величинами, такими как error и deltaerr, компьютеры работают относительно медленно. Кроме того, при вычислениях с плавающей точкой может накапливаться ошибка. По этим причинам, лучше работать только с целыми числами. Это можно сделать, если умножить все используемые вещественные величины на deltax. Единственная проблема — с константой 0.5 — но в данном случае достаточно умножить обе части неравенства на 2. Получаем следующий код:

Умножение на 2 для целых чисел реализуется битовым сдвигом влево.

Теперь мы можем быстро рисовать линии, направленные вправо-вниз с величиной наклона меньше 1. Осталось распространить алгоритм на рисование во всех направлениях. Это достигается за счёт зеркальных отражений, т.е. заменой знака (шаг в 1 заменяется на -1), обменом переменных x и y, обменом координат начала отрезка с координатами конца.

[править] Рисование линий

Реализация на C++:

vo > -deltaY) if(error2 = 0) drawpixel(X1 + x, Y1 + y) drawpixel(X1 + x, Y1 – y) drawpixel(X1 – x, Y1 + y) drawpixel(X1 – x, Y1 – y) error = 2 * (delta + y) – 1 if ((delta 0) && (error > 0)) delta += 1 – 2 * –y continue x++ delta += 2 * (x – y) y–

Алгоритм сглаживания Ву.

Алгоритм Ву — это алгоритм разложения отрезка в растр со сглаживанием. Был предложен У Сяолинем (Xiaolin Wu, отсюда устоявшееся в русском языке название алгоритма) в статье, опубликованной журналом Computer Graphics в июле 1991 года. Алгоритм сочетает высококачественное устранение ступенчатости и скорость, близкую к скорости алгоритма Брезенхема без сглаживания.

Алгоритм

Горизонтальные и вертикальные линии не требуют никакого сглаживания, поэтому их рисование выполняется отдельно. Для остальных линий алгоритм Ву проходит их вдоль основной оси, подбирая координаты по неосновной оси аналогично алгоритму Брезенхема. Отличие состоит в том, что в алгоритме Ву на каждом шаге устанавливается не одна, а две точки. Например, если основной осью является Х, то рассматриваются точки с координатами (х, у) и (х, у+1). В зависимости от величины ошибки, которая показывает как далеко ушли пиксели от идеальной линии по неосновной оси, распределяется интенсивность между этими двумя точками. Чем больше удалена точка от идеальной линии, тем меньше ее интенсивность. Значения интенсивности двух пикселей всегда дают в сумме единицу, то есть это интенсивность одного пикселя, в точности попавшего на идеальную линию. Такое распределение придаст линии одинаковую интенсивность на всем ее протяжении, создавая при этом иллюзию, что точки расположены вдоль линии не по две, а по одной.

Результат работы алгоритма

Реализация в псевдокоде (только для линии по x):

function plot(x, y, c) is // рисует точку с координатами (x, y) // и яркостью c (где 0 ≤ c ≤ 1) function ipart(x) is return целая часть от x function round(x) is return ipart(x + 0.5) // округление до ближайшего целого function fpart(x) is return дробная часть x function draw_line(x1,y1,x2,y2) is if x2 BColor) and (C<>Color) then

PutPixel (x, y, Color);

PixelFill (x+1, y, BColor, Color);

PixelFill (x, y+1, BColor, Color);

PixelFill (x-1, y, BColor, Color);

PixelFill (x, y-1, BColor, Color);

Этот алгоритм не оптимизирован относительно использования стековой памяти и является одним из самых медленных алгоритмов закрашивания (в среднем только один из четырёх вызовов используется для закрашивания). Алгоритм не может заполнить области, ограниченные цветом заполнения. Можно построить подобный алгоритм и без рекурсии, если вместо стека использовать массивы.

Алгоритм закрашивания линиями.

Данный алгоритм получил широкое распространение в компьютерной графике. От приведенного ранее он отличается тем, что на каждом шаге закрашивания рисуется горизонтальная линия, которая размещается между пикселями контура. Данный алгоритм также рекурсивный, однако количество вложенных вызовов гораздо меньше (пропорционально длине линии). Схема алгоритма такова (см.рис.):

1.Имеется затравочная точка с координатами (xst, yst) и начальное направление действия рекурсивных вызовов dir=1. Параметры левой и правой границы вначале совпадают с координатой затравочной точки: xPL = xst, xPR = xst. Вызывается процедура LineFill, в которой:

2.Находятся xL и xR – левая и правая границы, между которыми проводится текущая горизонтальная линия.

3.Делается приращение у=у+dir и, между xL и xR, анализируется цвет пикселей над линией. Если он не совпадает с цветом заполнения, процедура LineFill вызывается рекурсивно с dir = 1 и xPL = xL, xLR = xR.

4.Делается приращение y=y–dir и, начиная от xL до предыдущего значения xPL анализируется цвет пикселей под линией. Если цвет пикселя отличается от цвета заполнения, процедура вызывается рекурсивно с dir = –1 и xPL = xL, xPR = xR.

5.Продолжая по той же горизонтали от предыдущего xPR до xR анализируется цвет под линией. Если цвет какого-либо пикселя отличается от цвета заполнения, процедура вызывается рекурсивно с dir = –1 и xPL = xL, xPR = xR.
Ниже приведен пример реализации этого алгоритма на языке С++:

void LineFill (int x, int y, int dir, int xPL, int xPR)

// в этой переменной будет храниться цвет пикселя

// УСТАНАВЛИВАЕМ ТЕКУЩИЕ ГРАНИЦЫ xL И xR

color = GetPixel (–xL,y);

// xL=xL-1 помещается в вызов функции

while (color != bcolor); // bcolor – цвет границы

color = GetPixel (++xR,y);

while (color !=bcolor);

Line (xL,y, xR,y, Mycolor);

//это может быть любая функция рисования линии

// АНАЛИЗИРУЕМ ПИКСЕЛИ НАД ЛИНИЕЙ

Описание алгоритма

Алгоритм разделяет плоскость на 9 частей прямыми, которые образуют стороны прямоугольника. Каждой из 9 частей присваивается четырёхбитный код. Биты (от младшего до старшего) значат «левее», «правее», «ниже», «выше». Иными словами, у тех трёх частей плоскости, которые слева от прямоугольника, младший бит равен 1, и так далее.

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

Реализация алгоритма для трёхмерной модели идентична двумерной реализации, за исключением того, что вместо четырёхразрядного кода применяется шестиразрядный (дополнительные два бита глубины).

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

Последнее изменение этой страницы: 2016-04-21; Нарушение авторского права страницы

Что такое матрица поворота?

Матрица поворота используется для поворота точек вокруг
системы координат. В то время как отдельные точки привязываются к новым координатам,
расстояния между ними не меняются.

Все вращения определяются через тригонометрические функции синус и косинус.

Для двумерной системы координат, матрица вращения такая:

Если угол А равен 0, то на выходе получаем единичную матрицу:

Если угол А равен +90 градусов, то матрица такова:

Если угол А равен -90 градусов, то матрица такова:

Углы поворота, взятые с обратным знаком равны транспонированию матрицы.

Если матрица вращения умножена на транспонированную,
в результате будет единичная матрица

Как матрицы вращения влияют на систему координат?

Матрицы вращения влияют на систему координат следующим образом:

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

Следуя этому правилу, в праворукой декартовой системе координат,
мы увидим следующие три вида:

Так как вращение на положительный угол создает вращение по часовой стрелке,
можно создать набор координат для каждого такого вращения.
Для упрощения рассмотрим поворот на +90:

Можно упростить так:

В матрице это будет так:

Это и есть те три базовые матрицы, которые используются в OpenGL.

Поворот системы координат

Василиса ЯВИКС — интеллектуальная поисковая система. Завтра уже здесь!

Ма́трицей поворо́та (или матрицей направляющих косинусов) называется ортогональная матрица, которая используется для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице.

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

Матрица поворота в двумерном пространстве

В двумерном пространстве поворот можно описать одним углом θ со следующей матрицей линейного преобразования в декартовой системе координат:

Поворот выполняется путём умножения матрицы поворота на вектор-столбец, описывающий вращаемую точку:

Координаты (x′,y′) в результате поворота точки (x, y) имеют вид:

Конкретные знаки в формулах зависят от того, является ли система координат правосторонней или левосторонней, и выполняется ли вращение по или против часовой стрелки. Верхний знак указан для обычного соглашения: правосторонняя система координат и положительное направление вращения против часовой стрелки (тот же знак верен для левосторонней координатной системы при выборе положительного направления вращения по часовой стрелке; в оставшихся двух комбинациях — нижний знак).

Матрица поворота в трёхмерном пространстве

Любое вращение в трёхмерном пространстве может быть представлено как композиция поворотов вокруг трёх ортогональных осей (например, вокруг осей декартовых координат). Этой композиции соответствует матрица, равная произведению соответствующих трёх матриц поворота.

Матрицами вращения вокруг оси декартовой системы координат на угол α в трёхмерном пространстве с неподвижной системой координат являются:

Положительным углам при этом соответствует вращение вектора против часовой стрелки в правой системе координат, и по часовой стрелке в левой системе координат, если смотреть против направления соответствующей оси. Например, при повороте на угол α∘ вокруг оси ось переходит в : ∘⋅. Аналогично, ∘⋅ и ∘⋅. Правая система координат связана с выбором правого базиса (см. правило буравчика).

Матрица поворота в -мерном пространстве

Совершенно аналогично могут быть записаны матрицы поворота конечномерного пространства любой более высокой размерности.

Надо только иметь в виду, что для размерностей пространства, не равных трём, невозможно указать единственную прямую, ортогональную двум данным прямым, а поэтому нельзя говорить о вращении вокруг какой-то оси, можно же говорить о вращении в какой-то плоскости. Все точки при повороте в пространстве любой размерности, начиная с 2, всегда движутся параллельно некоторой (двумерной) плоскости.

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

— матрица поворота в 5-мерном пространстве в плоскости ,

— матрица поворота в 7-мерном пространстве в плоскости .

  • При таком подходе знаки перед синусами расставлять даже легче, поскольку они определяются порядком перечисления осей плоскости вращения: какая названа первой, в той строке перед синусом минус.
  • Легко видеть, что матрица поворота в плоскости совпадает (что естественно) с матрицей поворота в плоскости и т. д. с точностью до замены угла поворота на противоположный.
  • Поэтому такие матрицы с переставленными индексами очевидно не независимы, и для получения произвольного поворота достаточно включить в композицию каждую плоскость только один раз, то есть, скажем, только α, а не α и α.
  • Исходя из этого, нетрудно сосчитать их общее количество: −, где n — размерность пространства.

Изменение оси поворота

Пусть — матрица поворота вокруг оси с ортом на угол α, — матрица поворота вокруг оси с ортом на тот же угол, причем

где — матрица поворота, изменяющая орт оси поворота . Тогда

где — транспонированная матрица.

Перестановочность поворотов

Если — матрица поворота вокруг оси с ортом на угол α, — матрица поворота вокруг оси с ортом на угол β,то ⋅ — матрица, описывающая поворот, являющийся результатом двух последовательно осуществленных поворотов ( и ), поскольку

При этом последовательность поворотов можно поменять, видоизменив поворот :

где матрица — матрица поворота на угол α вокруг оси c ортом повернутым с помощью поворота :

поскольку ⋅, так как матрица поворота является ортогональной матрицей ( — единичная матрица). Заметим, что коммутативности поворотов в обычном смысле нет, то есть

Выражение матрицы поворота через углы Эйлера

Последовательные повороты около осей на угол прецессии (α), угол нутации (β) и на угол собственного вращения (γ) приводят к следующему выражению для матрицы поворота:

Ось — ось X, повёрнутая первым поворотом (на α), — ось Z, повёрнутая первым и вторым поворотом (на α и β). Вследствие перестановочности поворотов приведённая матрица соответствует поворотам на углы γ, β, α вокруг осей Z, X, Z:

В случае, если повороты задаются в другой последовательности, матрица поворота находится перемножением матриц для вращения вокруг соответствующих декартовых осей координат, например:

  • 1) Поворот около осей:
  • 2) Соответственно:
  • 3)
  • 4)
  • 5)
  • 6)
  • 7)
  • 9)
  • 10)
  • 11)
  • 12)

Матрица поворота вокруг произвольной оси

Пусть ось вращения задана единичным вектором , а угол поворота θ.

Тогда матрица поворота в декартовых координатах имеет вид:

Выражение матрицы поворота через кватернион

Если задан кватернион, то соответствующая матрица поворота имеет вид:

Свойства матрицы поворота

Если — матрица, задающая поворот вокруг оси → на угол φ, то:

  • →→∀→
  • →→
  • →→−⁡φ→⋅→→⁡φ
  • ⁡−⁡φ (след матрицы вращения), где n — размерность пространства (размер матрицы).
  • (матрица имеет единичный определитель).
  • Матрица обратного поворота получается обычным транспонированием матрицы прямого поворота, т. о. −.
  • Для трёхмерного пространства (матриц ×): если строки (или столбцы матрицы) рассматривать как координаты векторов →→→, то верны следующие соотношения):
    • →→→
    • →⋅→→⋅→→⋅→
    • →×→→→×→→→×→→
  • Первые два свойства, означающие условие ортогональности матрицы, верны и для произвольной размерности пространства (размера матрицы).

Примечания

  1. Ортогональность матрицы означает, что её обратная матрица равна транспонированной матрице: A−1 = AT.
  2. То есть если смотреть на плоскость вращения со стороны полупространства, где значения координат оси, вокруг которой осуществляется поворот, положительные.
  3. О вращении в плоскости можно говорить и для трёхмерного пространства, например, вращение вокруг оси есть вращение в плоскости ; однако для трёхмерного пространства возможно и то и другое представление, и поэтому обычно, если вопрос сводится к случаю только этой размерности, выбирают представление (и обозначения) вращения вокруг оси как интуитивно несколько более простое.
  4. Для всех n строк (столбцов).

Литература

  • Лурье А. И. Аналитическая механика. — М.:Физматлит. — 1961. — 824 с.

Ссылки

  • Поворот плоскости. Матрица поворота

Операторы извлечения и вставки в поток, страница 2

1. Перегрузкаоператора присваивания.

2. Перегрузкабинарных операторов.

3. Перегрузкаунарных операторов.

4. Перегрузкаоператоров ++ и —.

5. Перегрузкаоператора вызова функции.

6. Перегрузкаоператора преобразования типа.

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

Проекции вектора можновычислить по координатам начала (точка А) и конца (точка В) использую следующуюформулу:

Вычисление координат конца вектора

Координаты конца (точка В) вектора можно вычислить по координатам начала(точка А) и проекциям вектора АВ использую следующую формулу:

Вычисление модуля вектора

Модуль вектора (длину)можно вычислить по теореме Пифагора:

Вычисление расстояния между двумя точками

Расстояние D междудвумя точка A и B можновычислить по теореме Пифагора:

Вычисление площади треугольника

Площадь S треугольника со сторонами a,b и с можно вычислить по формуле Герона:

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

Скалярное произведение векторов и можновычислить по следующей формуле:

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

Угол между векторами и можновычислить по следующей формуле:

Поворот вектора на заданный угол

Проекции вектора ,повёрнутого относительно вектора на угол , можно вычислить по следующей формуле:

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

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

Не трудно видеть, что скалярное произведение векторов и в этом случае равно нулю

Умножение вектора на число

Умножение вектора начисло К можно выполнить по следующей формуле:

Нетрудно видеть, что вектор в К раз длиннее вектора и параллелен вектору

Вычисления прямой, проходящей через две заданные точки

Уравнение прямой ,проходящей через точки и имеетвид:

Откуда легко получить:

Вычисление коэффициентов прямой, перпендикулярной заданной прямой

Две прямые и перпендикулярны друг другу, если:

Если прямая известна, то коэффициенты и прямой можно вычислить по следующим формулам:

Прямая проходитчерез точку , если:

Вычисление детерминанта

Детерминант матрицы размером 2´2 можно вычислить по следующей формуле:

Пересечение двух прямых

Задачу нахождения точки пересечения двух прямыхна плоскости можно свести к решению двух линейных уравнений с двумянеизвестными методом Крамера:

Вычисления прямой, перпендикулярной заданному вектору и проходящей череззаданную точку

Прямая перпендикулярнавектору с проекциями , если:

Прямая проходитчерез точку , если:

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

Прямая перпендикулярнавектору с проекциями , если:

Прямая проходитчерез точку , если:

Преобразования прямоугольных координат

Получим формулы, связывающие координаты точки при переходе от одной прямоугольной системы координат к другой прямоугольной системе координат. Рассмотрим три типа преобразований:

а) параллельный перенос;

б) поворот системы координат;

в) зеркальное отражение в оси абсцисс (изменение направления оси ординат на противоположное).

В каждом случае координаты точки в старой и новой системах координат связаны формулой (2.8). Поэтому достаточно найти вектор переноса начала координат и матрицу перехода от базиса к базису .

а) При параллельном переносе системы координат (рис.2.11,а) базис не изменяется, поэтому матрица перехода является единичной: . Находим координаты вектора переноса начала координат: . Тогда формулу (2.8) можно записать в виде

б) При повороте системы координат на угол (рис.2.11,6) начало новой системы координат совпадает с началом старой, поэтому вектор переноса нулевой: . Разлагая новые базисные векторы по старому базису, получаем Составим матрицу перехода, записывая координаты векторов по столбцам: . Тогда формулу (2.8) можно записать в виде

в) При зеркальном отражении в оси абсцисс (изменении направления оси ординат на противоположное) (рис.2.11,в) начало новой системы координат совпадает с началом старой, поэтому вектор переноса нулевой: . Разлагая новые базисные векторы по старому базису, получаем (так как ), или . Составим матрицу перехода, записывая координаты векторов по столбцам: . Тогда формулу (2.8) можно записать в виде .

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

Покажем, что любое преобразование прямоугольной системы координат сводится к последовательному применению рассмотренных преобразований, т.е. к композиции преобразований систем координат. Действительно, пусть на плоскости заданы две прямоугольные системы координат и . Сначала, если точки и не совпадают, выполним параллельный перенос старой системы координат на вектор , при этом получим систему координат .

Затем при помощи поворота на угол совместим вектор с вектором , при этом получим систему координат , где вектор либо совпадает с вектором , либо противоположен ему . В первом случае, когда обе системы и одноименные, никаких преобразований делать уже не надо, так как полученная система координат совпадает с заданной (рис.2.12,а). Во втором случае, когда системы и разноименные, для получения системы достаточно изменить направление оси ординат на противоположное, т.е.

выполнить зеркальное отражение в оси (рис.2.12,6). Формулы, связывающие старые и новые координаты точки, имеют вид:

– при одноименных системах координат (рис.2.12,а):

– при разноименных системах координат (рис.2.12,6):

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

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

Для преобразования (2.9) аналогичные формулы имеют вид:

2. При и из соотношений (2.10) получается преобразование изменяющее названия координатных осей (зеркальное отражение в прямой, содержащей биссектрису первого координатного угла).

3. Справедливо утверждение: любое преобразование прямоугольной системы координат на плоскости может быть представлено в виде композиции зеркальных отражений в некоторых прямых.

Для доказательства достаточно показать, что рассмотренные выше преобразования — параллельный перенос (рис.2.11,а) и поворот (рис.2.11,6) — можно представить при помощи композиции зеркальных отражений.

Действительно, параллельный перенос системы координат вдоль оси абсцисс (на вектор ) можно получить при помощи двух отражений: первое — относительно оси ординат (получим систему координат ) , а второе — относительно прямой , проходящей через точку на оси абсцисс параллельно оси ординат (рис.2.13,а).

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

Чтобы получить поворот на угол , нужно выполнить два зеркальных отражения (рис.2.13,6): первое — относительно оси ординат (получим систему ), а второе — относительно биссектрисы угла между векторами и .

4. Утверждение пункта 3 можно уточнить: любое преобразование прямоугольной системы координат на плоскости может быть представлено в виде композиции не более трех зеркальных отражений в некоторых прямых.

5. Преобразования координат (2.7) и (2.8) называются ортогональными, если матрица перехода ортогональная, т.е. . Нетрудно но показать, что преобразования (2.9),(2.10) ортогональные, поэтому любое преобразование прямоугольной системы координат является ортогональным.

Пример 2.5. Известны координаты точек и в прямоугольной системе координат на плоскости. Найти координаты точки в прямоугольной системе координат , полученной при помощи зеркального отражения в некоторой прямой системы (рис.2.14).

Решение. Находим вектор переноса начала системы координат , его длину и угол между векторами и , так как .

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

Отражение в оси представим в виде композиции следующих преобразований: параллельного переноса на вектор ; поворота на угол ; зеркального отражения в оси абсцисс (рис.2.12,6). Старые и новые координаты точки связаны формулой (2.10) при . Учитывая, что и

Подставляя старые координаты точки , получаем ее новые координаты:

Следовательно, точка имеет одинаковые координаты в обеих системах, т.е. точка лежит на оси симметрии .

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

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

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

а) параллельный перенос;

б) поворот вокруг координатной оси;

в) зеркальное отражение в координатной плоскости (изменение направления одной координатной оси на противоположное).

В каждом случае координаты точки в старой и новой системах координат связаны формулой (2.7). Поэтому достаточно найти вектор переноса начала координат и матрицу перехода от базиса к базису .

а) При параллельном переносе системы координат базис не изменяется, поэтому матрица перехода является единичной: . Находим координаты вектора переноса начала координат: . Тогда формулу (2.7) можно записать в виде

б) При повороте системы координат на угол (рис.2.11,б) вокруг оси аппликат начало новой системы координат совпадает с началом старой, поэтому вектор переноса нулевой: . Разлагая новые базисные векторы по старому базису, получаем

Составим матрицу перехода , записывая координаты векторов по столбцам. Тогда формулу (2.7) можно записать в виде

Очевидно, что система координат на плоскости при этом преобразовании поворачивается на угол .

в) При зеркальном отражении в плоскости (изменении направления оси аппликат на противоположное) начало новой системы координат совпадает с началом старой, поэтому вектор переноса нулевой: . Разлагая новые базисные векторы по старому базису, получаем

Составим матрицу перехода

Тогда формулу (2.7) можно записать в виде

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

Матрицы переходов в пунктах «а», «б» и «в» ортогональные (см. пункт 5 замечаний 2.3).

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

Углы Эйлера

Используя композицию, получим формулы преобразования координат точки в пространстве при переходе от старой прямоугольной системы к новой , имеющей то же начало и ту же ориентацию (т.е. новая система координат получается из старой поворотом вокруг начала координат ). Обе системы координат изображены на рис.2.15 (полужирными и двойными линиями соответственно).

Чтобы от системы перейти к системе нужно выполнить три поворота. Сначала проведем через точку перпендикуляр (линию узлов) к плоскости . Направление на этом перпендикуляре выберем так, чтобы ориентация системы координат совпадала бы с ориентацией системы координат . Если оси и совпадают, то ось выбирается совпадающей с осью .

Если оси и противоположно направлены, то и ось выбирается противоположно направленной оси . Затем последовательно сделаем три поворота:

– первый поворот выполним вокруг оси на угол от оси до оси (получим систему координат , оси и которой изображены штриховыми линиями на рис.2.15);

– второй поворот выполним вокруг оси на угол от оси до оси , при этом ось примет положение (получим систему координат , ось которой Рис.2.15 изображена двойной штриховой линией на рис.2.15);

– третий поворот выполним вокруг оси на угол от оси до оси .

Указанные углы называются углами Эйлера, в частности, угол называется углом прецессии, угол — углом нутации, а угол — углом чистого вращения.

Согласно пункту «б», запишем матрицы переходов от базиса к базису для указанных поворотов соответственно:

По свойству 1 (см. разд.2.2.1) получаем матрицу перехода от базиса прямоугольной системы координат к базису прямоугольной системы координат :

Отсюда следуют формулы для преобразования прямоугольных координат точки

Поскольку каждая из матриц ортогональная, то и их произведение также является ортогональной матрицей (см. пункт 5 замечаний 2.3).

Пример 2.6. Прямоугольная система координат получена из стандартной системы координат при помощи поворота на угол вокруг прямой, проходящей через начало координат и образующей равные углы с координатными осями (на рис.2.16 эта прямая изображена одной точкой , поскольку перпендикулярна плоскости рисунка). Требуется найти углы Эйлера.

Решение. Составим матрицу перехода от базиса к базису .

Сравнивая с матрицей , заключаем, что (так как и ); (так как и ); (так как и ).

Математический форум (помощь с решением задач, обсуждение вопросов по математике).

источники:

http://pcznatok.ru/kompjutery/matrica-povorota-na-ugol.html

http://glonass-std.ru/sistemy-navigatsii/povorot-sistemy-koordinat.html

Понравилась статья? Поделить с друзьями:
  • Как найти теплоемкость реакции
  • Как найти исправленную высоту
  • Как найти книга коран
  • Как составить аннотацию к рассказу волчишко
  • Как найти директ икс на компьютере