О матрице поворота простыми словами

Когда Пифагор плыл по реке Хуанхэ, он увидел у берега, в лодке, задремавшего рыбака, в конической шляпе и с бамбуковой удочкой в руках.

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

Продолжим историю


-wnj-k82ym4zg1owxqh9cntnp0q.png


Треугольные очертания лодки, шляпы и удочки над водой настолько поразили философа-математика, что он застыл как заворожённый.

Удочка рыбака аккуратно зависла над гладью вод Жёлтой Реки под углом, равным 45 градусам.

Лёгкий туман стелился над водой… и вдруг — поклёв. Рыбак потянул удочку, и она стала быстро набирать высоту, длина лески (катет А) стала расти на глазах, а расстояние от рыбака до самой лески стало уменьшаться (катет B). И самое интересное — длина самой удочки совсем не изменилась — телескопических удочек ещё не было, — даже когда она описала в воздухе дугу и оказалась почти над головой рыбака, под углом 90 градусов. Длина лески сравнялась с длиной удочки — катушки тогда уже были, —, а расстояние между рыбаком и леской изменилось до 0, леска оказалась в руках рыбака.

kzg6vds9d_bw-5agdcdrrufbebo.gif


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

Ностальгируем и думаем дальше…


Вспомним теорему Пифагора: длина удочки равна сумме квадратов катетов — самой лески и расстоянию между рыбаком и тем местом, где леска погружена в воду — С=А в квадрате + B в квадрате.

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

Окунёмся в поиски


1) найдём то, как соотносится между собой длина лески с длиной удочки — синус угла а.
2) найдём то, как соотносится длина отрезка между рыбаком и местом погружения лески с длиной удочки — косинус а. Считаем:

sin (a) = 3/ 4.24264068712 = 0.70710678118.
cos (a) = 3/ 4.24264068712 = 0.70710678118.


А теперь порассуждаем
Что будет если катет А разделить на sin (a)?! т.е.:

3/0.70710678118 = 4,2


Получаем длину удочки — гипотенузу.
А если мы умножим катет А на sin (а)?!

3×0.70710678118 = 2,12132034354


Отметим это расстояние на гипотенузе — 2.1.

nnq1i0crruprgwoj4fptvj51tjq.png


На оставшееся расстояние также приходится — 2.1, так как очевидно:

4.2–2.1=2.1


Это означает, то как в текущий момент времени синус и косинус делят гипотенузу. Поскольку квадрат гипотенузы это 4.2×4.2, то вопрос: что будет если 4.2 умножить на 2.1?! На ту самую её часть, с которой связан один из катетов:

4.2×2.1 = 9, (корень: 3)


Тоже самое для второго катета.

Нашли катеты. И убедились в том, что со времён Пифагора ничего не изменилось.

Далее


Теперь ещё раз осуществим умножение катета А на sin (a), катета B на cos (a).

3×0.7= 2,1
3×0.7 = 2,1

Суммируем:

2.1 + 2.1 =4.2


или 

3×0.7 + 3×0.7 =4.2

Мы вплотную подобрались к матрице поворота.
Возьмём её вторую часть — получение точки y:

y=x*sin (Ф)+y*cos (Ф)


И сравним с вычислениями выше:

3×0.7 + 3×0.7 = 4.2
y=x*sin (Ф)+y*cos (Ф)


Как две капли воды. Y в нашем случае окажется равным 4.2.
Если применить первую часть формулы к вычислениям, то получим:

3×0.7 — 3×0.7 = 0


Иными словами случится так:

x станет 0 — рыбак поймает леску.
y станет 4.2 — леска сравняется с длиной удочки.

Помним, что для вычисления x синус и косинус меняются местами.

Ф в данном случае равно 45 градусам (Ф = 0.7) и при таком угле синус и косинус равны, что удобно для примера. В остальных случаях очевидно величины для синуса и косинуса будут другие. Например, для 40 градусов: cosdegree (40) = 0,7660444431, sindegree (40) = 0,6427876097 (если вы не согласны, обращайтесь в Яндекс, я пользовался его калькулятором).

В итоге


Применяя формулу к новым значениям x, y несколько раз — в цикле, наглядно увидим движение по окружности, каждый раз на 45 градусов.

Если требуется сдвинуть вектор-удочку на один градус, то его и подставляем в формулу на место Ф.

Как происходит вычисление тригонометрических функций?!
Как известно, для вычисления косинуса и синуса угла обычно используются готовые функции. Согласно информации по ссылке вычисление и точность зависят от системы. Для unix-систем есть по крайней мере два варианта: функция, написанная в недрах компании IBM и встроенная инструкция fsin на Ассемблере. Есть также библиотека fdlibm с достаточно наглядным кодом и комментариями, по которым видно, что синус и косинус вычисляются в этой библиотеке через число pi.

А вдруг автор этой статьи все придумал?


Если у вас на компьютере есть веб-сервер и интерпретатор языка PHP, то можно поэкспериментировать со следующим кодом, который вращает блок CSS div, который выступает в роли точки вращения.

Файл index.php


Заголовок спойлера


		

<    div id="rotation_martix">


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

© Habrahabr.ru