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

в 17:36, , рубрики: вращение, математика, матрица поворта, тригонометрия, Читальный зал

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

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

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

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

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

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

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

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

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

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

Вспомним теорему Пифагора: длина удочки равна сумме квадратов катетов — самой лески и расстоянию между рыбаком и тем местом, где леска погружена в воду — С=А в квадрате + 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.

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

На оставшееся расстояние также приходится — 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

Мы вплотную подобрались к матрице поворота.

Возьмём её вторую часть — получение точки 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.

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

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

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

<?php
if (isset($_GET['ok'])) {
$x= $_GET['x']*cos(1)-$y=$_GET['y']*sin(1);
$y= $_GET['x']*sin(1)+$y=$_GET['y']*cos(1);
}
?>

	<style>
			#rotation_martix {
		 position: absolute;
			top: <?=$x+300?>px;
			left: <?=$y+300?>px;
			background-color: #999;
			width: 10px;
			height: 10px;
			}
		</style>

<div id="rotation_martix">
</div>
<form action="i12.php" method="GET" >
<input type="submit" name="ok" value="ok">
<input type="text" name="x" value="<?=$x?>">
<input type="text" name="y" value="<?=$y?>">
</form>

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

Автор: Ivan Gavryushin

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js