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

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

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



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

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

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


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

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


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

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

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


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

sin(a) = 3/ 4.2= 0.7
cos(a) = 3/ 4.2 = 0.7

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

3/0.7= 4.2

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

3*0.7= 2.1

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


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

Заголовок спойлера
<?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  method="GET" >
<input type="submit" name="ok" value="ok">
<input type="text" name="x" value="<?=$x?>">
<input type="text" name="y" value="<?=$y?>">
</form>



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

Комментарии (23)


  1. BosonBeard
    18.11.2017 22:14
    +1

    Ожидал увидеть в статье, ну прям вот матрицу — матрицу, не увидел, но статья от этого менее полезной не стала =)


    1. FadeToBlack
      19.11.2017 07:54

      Потому что это можно объяснить проще и без матриц. На арифметике я уснул.


      1. Sultansoy
        19.11.2017 12:47

        А мне как раз таки решения с матрицами нравились намного больше и казались легче, но это скорее всего эффект математического анализа.
        За статью спасибо, показали еще один прикольный способ, как объяснить студентам повороты.


        1. dcc0 Автор
          19.11.2017 12:49

          Вы преподаете математику?


          1. Sultansoy
            20.11.2017 08:28

            Иногда приходится преподавать математику. Чаще правда дискретную, но всяко бывает.
            Так то я программист, но учился на прикмате, поэтому иногда просят помочь.


        1. FadeToBlack
          20.11.2017 07:46

          Если вы понимаете структуру матриц трансформации, что они состоят из базисных векторов, записанных в однородных координатах проективной геометрии, вам, конечно, одинаково понятны любые записи и любые объяснения. Но штурм девственного мозга программистов, которые не знают(забыли) матчасть — задача творческая. Тут нужен подход индивидуальный, так что для покрытия большинства умов требуется более, чем один подход к объяснению.


  1. lobzanoff
    19.11.2017 12:33

    Надеюсь, это опечатка: "длина удочки равна сумме квадратов катетов". Квадрат длины, конечно. А вообще, конечно, спасибо — очень наглядно и доходчиво!


    1. dcc0 Автор
      19.11.2017 12:44

      Да


  1. SanQri
    19.11.2017 13:28

    Почему в топе хабра математика первый курс без математики?


    1. FadeToBlack
      20.11.2017 07:51

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


      1. AllexIn
        20.11.2017 21:35
        -1

        Умеют.
        Просто, к сожалению, часто математику не дают по шагам, а дают «вот так, потому что...». И всё. В итоге матрицы знаешь, формулы знаешь, а как они выведены — нет.


        1. dcc0 Автор
          20.11.2017 23:41

          Случайно минус поставил. С телефона. И на нем стрелки смотрят в одну сторону.
          В общем + в карму от меня тогда.


          1. FadeToBlack
            21.11.2017 08:11

            fixed


        1. FadeToBlack
          21.11.2017 08:10

          На мой практический взгляд программиста-самоучки и законченного троечника, с точки зрения традиционной системы образования, как выводятся формулы — интересно только небольшому количеству людей, которые способы воспринимать абстрактную информацию, «висящую в воздухе» (читай, математикам). Лично мне кажется, что должны быть примеры практического применения для каждой из формул, тогда все обретает смысл, легче усваивается и так далее. Возможно, это моя личная особенность.


  1. maxzhurkin
    19.11.2017 17:40

    А как Пифагор попал на Хуанхе?
    Это же самое интересное!


    1. Germanets
      19.11.2017 18:06

      Ждите статью «О параллельных вселенных простыми словами» на Geektimes)


    1. mifa
      20.11.2017 07:03

      Гуманитария вопрос :)


  1. sgrechnev
    19.11.2017 18:23

    Постараюсь сделать свою критику максимально конструктивной.


    1. Согласен с BosonBeard: если уж имеется отсылка к каким-то формулам, то стоит их хоть где-то прописать. Иначе читаешь

      Возьмём её вторую часть…
      Если применить первую часть формулы...
      и думаешь, а что же это за формула?
      И если для y есть хоть какая-то формула, то для x только конкретные вычисления.
    2. Фактические неточности.
      Если быть точным, то, пожалуй, A·sin(alpha) показывает, как делят гипотенузу sin^2(alpha) и cos^2(alpha), т.к.
      A·sin(alpha) = C·sin^2(alpha)
      (с учётом ОТТ).


    3. Обозначения и написание чисел.
      Во-первых, традиционно в геометрии длины обозначаются строчными буквами, прописными — точки (но, конечно, это уж совсем не страшно).
      Во-вторых, писать числа то с одной точностью, то с другой — как-то не очень хорошо. Тогда уж лучше остаться в общих обозначения a, b, c.

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


    1. dcc0 Автор
      19.11.2017 18:55

      Окей. Все пункты принял к сведению.


      1. sgrechnev
        19.11.2017 20:18

        Благодарю!
        Вот ещё момент, который сразу не заметил, но, думаю, стоит как-то поправить:
        "… можно поэкспериментировать со следующим кодом, который вращает блок CSS div, который выступает в роли точки вращения."
        С точки зрения русского языка, лучше написать иначе, что-то вроде "… кодом, вращающим CSS-div вокруг блока-точки вращения."


  1. pilot911
    19.11.2017 19:42

    допишите, пож-та, связь с матрицей и ее функциональность, то есть почему именно матрицей удобно оперировать


  1. Psychosynthesis
    20.11.2017 02:50

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


    1. FadeToBlack
      20.11.2017 07:54

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