Форум программистов, компьютерный форум, киберфорум
Igor3D
Войти
Регистрация
Восстановить пароль

Формулы поворота

Запись от Igor3D размещена 10.03.2025 в 13:13. Обновил(-а) Igor3D 23.03.2025 в 18:44
Показов 2796 Комментарии 5
Метки math

Добрый день

Тема
Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости".

x' = x * cos(a) - y * sin(a)
y' = y * cos(a) + x * sin(a)

Как бы Вы их объяснили первокурсникам? Желательно "под запись", т.е. что должно быть у детей в конспектах?
Идея "написания конспекта" оказалась неожиданно интересной. Вот что получилось

Формулы поворота

1. Сами формулы
x' = x * cos(a) - y * sin(a)
y' = x * sin(a) + y * cos(a)

Эти формулы могут быть использованы для поворота 2D вектора/координаты (x, y) вокруг точки (0, 0) на угол a. Положительный угол соответствует вращению против часовой стрелки. Говорят также CCW (CounterColckWise)

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

cos(a + b) = cos(a) * cos(b) - sin(a) * sin(b)
sin(a + b) = cos(a) * sin(b) + sin(a) * cos(b)

В равенствах умножим обе части на r - длину вектора (x, y) и заменим параметрические координаты на декартовы

x = r * cos(b)
y = r * sin(b)

x' = r * cos(a + b)
y' = r * sin(a + b)

3. Данные формулы часто записываются в виде матриц
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{pmatrix}cos(a)& -sin(a)\\sin(a) & cos(a)\end{pmatrix}
Важно: данная запись в нотации "column major" широко используемой во многих приложениях, напр OpenGL. Матрица применяется "слева", т.е. строка матрицы множится на вектор-столбец (трансформируемой) координаты

4. Эти же формулы используются для поворота 3D векторов/координат. В этом случае x и y не числа(скаляры), а взаимо-перпендикулярные 3D вектора равной длины (но необязательно единичной). Других ограничений на исходные вектора не накладывается, их координаты могут быть любыми, необязательно совпадать с осями/плоскостями СК.

Вращение происходит в плоскости определяемой этой парой векторов и проходящей через начало координат (0, 0, 0). Осью вращения будет нормаль к этой плоскости проходящая через начало координат. Вектор нормали z вычисляется как z = cross(x, y)

5. На практике часто возникает задача повернуть один вектор (считаем его вектором x) вокруг заданной заданной оси z. Для упрощения расчетов всегда считаем вектор z единичным/номированным.

5.1 Сначала рассмотрим частный случай когда x и z перпендикулярны. Считаем что вектора x, y и z образуют "правую" тройку. Для нее каждая ось получается векторным произведением двух предыдущих, т.е.

x = cross(y, z)
y = cross(z, x)
z = cross(x, y)

Отсюда нужный y = cross(z, x) и повернутый вектор
x' = x * cos(a) - y * sin(a)

Положительный угол поворота a здесь соответствует вращению по часовой (ось z направлена на наблюдателя). Можно было считать исходным вектор y, вычислить x для правой тройки и применить вторую формулу. Расчеты и результат получаются те же

5.2 Теперь рассмотрим общий случай: повернуть вектор x вокруг заданной заданной оси z причем эти вектора (в общем случае) не перпендикулярны
В этом случае вращается лишь часть вектора: его проекция на плоскость вращения. При этом угол между исходным и повернутым векторами может быть от заданного a (если ось перпендикулярна) до нуля (если ось коллинеарна). Представим x в виде суммы 2 векторов: проекцию на ось поворота и проекцию на плоскость поворота

x1 = z * dot(x, z) // x1 = проекция на ось поворота, она не вращается
x2 = x - x1 // оставшаяся часть x2 = проекция на плоскость поворота, вращаем ее (см 5.1)

// повернутый вектор
x' = x1 + x2 * cos(a) + cross(z, x2) * sin(a)

Разложение вектора на 2 части/компоненты - очень простой но и очень эффективный (базовый) прием
Метки math
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 5
Комментарии
  1. Старый комментарий
    Здравствуйте.

    Как бы Вы их объяснили первокурсникам?
    Я бы начал объяснение с того, как преобразуется базис старой системы координат и уже потом с помощью матрицы перехода получил бы формулы для x', y'.

    Например, так:

    Рассмотрим новый базис (e1',e2') в новой системе координат, повернутый на угол (a) против часовой стрелки, относительно старой системы координат:

    e1'=(cos(a),sin(a))
    e2'=(-sin(a),cos(a))

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

    M =
    [cos(a) -sin(a)
    sin(a) cos(a)]

    Умножаем матрицу перехода на вектор-столбец [x,y] и получаем:

    x' = x * cos(a) - y * sin(a)
    y' = y * cos(a) + x * sin(a)
    Запись от mikello размещена 10.03.2025 в 21:38 mikello вне форума
  2. Старый комментарий
    Аватар для sporta1982
    А я тупой я для себя так объясняю.
    Повернули систему координат против часовой стрелки на угол A.
    Имеется точка M. Рассуждаем в правом квадранте нашей "старой" прямоугольной системы координат.
    В "старой" системе координат :

    x= L*cosB. Где B - это угол между осью абсцисс , и линией L которая соединяет точку (0,0) и точку M(x,y) в "старой" системе
    координат.

    x' = L*cos(B-A). - это координата x' после поворота в "новой" системе координат .
    По тригонометрии : x'=LcosB*cosA+L*sinB*sinA.

    Дальше в "старой" системе координат y=L*sinB.

    y'=L*sin(B-A) - это координата y' после поворота в "новой" системе координат.
    По тригонометрии : y'= L*sinB*cosA-L*cosB*sinA.

    Произведем подстановки:
    x'=x*cosA+y*sinA
    y'=y*cosA-x*sinA.

    А теперь "отбросим" "новую" систему координат. И скажем что, x' и y' это координаты точки в нашей
    "старой" системе. И по сути теперь, x' и y' это координаты точки M' в нашей "старой" системе координат.
    И по сути это формула поворота точки M(x,y) находящейся на расстоянии L от точки (0,0) в нашей "старой"
    системе координат, но только по часовой стрелки.

    Без всяких векторов , матриц и так далее. Просто точка, и формулы тригонометрии.
    Запись от sporta1982 размещена 13.03.2025 в 13:32 sporta1982 вне форума
  3. Старый комментарий
    sporta1982,

    Без всяких векторов , матриц и так далее.
    Первокурсники знают, что такое базисы, векторы, матрицы, а если не знают, то пора их этому обучать, а то так и останутся на уровне 9-10 класса.
    Запись от mikello размещена 13.03.2025 в 17:02 mikello вне форума
  4. Старый комментарий
    Аватар для sporta1982
    Первокурсники знают, что такое базисы, векторы, матрицы, а если не знают, то пора их этому обучать, а то так и останутся на уровне 9-10 класса.
    Это мне напоминает про вопрос о линейных искажениях, что то я такое не из лекций сказал , ответ был простой :"но это физический смыл". Пятерочники и сами разберутся, а троечникам и не надо...
    Запись от sporta1982 размещена 13.03.2025 в 18:58 sporta1982 вне форума
  5. Старый комментарий

    Не по теме:

    Это моя первая запись в блоге, не понял куда текст вставлять :)

    Запись от Igor3D размещена 14.03.2025 в 21:56 Igor3D вне форума
    Обновил(-а) Igor3D 23.03.2025 в 18:45
 
Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru