Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2

Объясните формулы "матрица вращения на плоскости"

10.02.2025, 22:29. Показов 8977. Ответов 109
Метки нет (Все метки)

Добрый день

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

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

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

Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2025, 22:29
Ответы с готовыми решениями:

Угловая скорость вращения тела на плоскости
Добрый день! У меня простая задача, просто хочу уточнить, правильно ли я понимаю решение. Есть вращение диска на плоскости вокруг своей...

Поверхность вращения. Построение двумерного графика в 3д плоскости.
Задание:отобразить в левой системе координат поверхность вращения вокруг оси OZ кривой z=4/x^2 при y=0. У меня проблема с построением...

Матрица вращения
Здравствуйте! Я совсем молодой пользователь МатЛаба. Возникла проблема с решением задачи в матлабе. Нужно используя ротационную...

109
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
04.03.2025, 22:03  [ТС]
Цитата Сообщение от u235 Посмотреть сообщение
А про величину угла поворота забыли?
Верно, спасибо что напомнили. Итого 3 аргумента
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
05.03.2025, 08:54
Попробую еще раз: Есть два вектора скорости и "чайника". Первый движение первого задано, требуется, чтобы второй вектор был направлен под задаваемым углом к вектору скорости. Как им управлять. В плоском случае задача проста, если рассматривать в полярных координатах. Тогда угол между векторами просто разность их углов. Уравнение diff(alpha(t), t) = k*(alpha[v](t)-alpha(t)) решает задачу. Остаются только технически проблемы: определения направления векторов, техника организации изменения положения и т.п.
В пространственном случае все много сложнее но интереснее. Использование сферических переменных приводит к очень сложным формулам. Проще использовать уже обговоренное выражение для угла между векторами угол=отношению скалярного произведения к произведению модулей перемножаемых векторов. Если для простоты рассматривать единичные модули то: AngleT := v[1](t)*s[1]+v[2](t)*s[2]+v[3](t)*s[3] Эту формулу я не буду превращать в уравнение управления углом. Но из нее видно, что даже в случае постоянства скорости мы можем вертеться, а в случае переменной скорости мы можем осуществлять различные сценарии управления, так как уравнение одно, а параметров управления два. Общая картина достаточно сложная, что возможно объясняет длительность нашего обсуждения.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
05.03.2025, 16:45  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Есть два вектора скорости и "чайника".
Возможно Вы усмотрели связь с другой темой (где фигурировал чайник), но это не так, темы никак не связаны
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
06.03.2025, 09:04
Обсуждение очень длинное и запутанное, не могли бы вы переформулировать вопрос с учетом уже высказанного.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
06.03.2025, 15:30  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Обсуждение очень длинное и запутанное
Согласен, но это (объективная) проблема любого форума. Во многих темах есть "жемчужное зерно", но отыскать его в куче обсуждения нереально Ну значит надо писать как хороший сериал который можно смотреть (у нас читать) с любого места.

Не видно смысла менять исходный вопрос, все там нормально и коротко. А вот мое объяснение про повороты в 3D слабовато, надо улучшить. Предлагаю так

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 причем эти вектора (в общем случае) не перпендикулярны
...
Продолжите объяснение
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
06.03.2025, 17:01
Непонятно " их координаты могут быть любыми, необязательно совпадать с осями/плоскостями СК."
Непонятно, что за плоскость определяемая двумя векторами (этого было бы достаточно) зачем еще какая-то ось, которая одна она была бы достаточна для определения условий вращения.
Пункт 5 понятен и может быть реализован. Похожим на высказанный мною ранее методом. Пункты 5.1 и 5.2 изложение деталей пункта 5.
Если ваш комментарий можно свести к задаче вращения вектора вокруг заданной оси с возможным изменением 3Dугла между ними, то перечитайте мой предыдущий комментарий. По моему, структура решения там описана.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
06.03.2025, 17:45  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Непонятно " их координаты"..
Непонятно, что за плоскость..
На любую критику есть прекрасный ответ типа "предложите лучше". Пожалуйста, слушаю Вас

Цитата Сообщение от VAF34 Посмотреть сообщение
Если ваш комментарий можно свести к задаче вращения вектора вокруг заданной оси с возможным изменением 3Dугла между ними,то перечитайте мой предыдущий комментарий. По моему, структура решения там описана.
Ни о каком "изменении 3Dугла" я не помышлял. Требуется объяснить/показать как формулы поворота стартового поста применить для вращения 3D векторов. Продолжите 5.2
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
06.03.2025, 18:05
Цитата Сообщение от Igor3D Посмотреть сообщение
как формулы поворота стартового поста применить для вращения 3D векторов
Во-первых, нужно определить, как будет задаваться "трёхмерный" угол. Его можно задать двумя векторами. Кстати, я не заметил определения вектора ("объект, обладающий следующими свойствами..."). А можно задать "трёхмерный" угол как три "двумерных" угла - углы между проекциями этих векторов на координатные плоскости. Тогда "трёхмерный" поворот можно задать как сумму трёх "двумерных" поворотов. Перемножив три матрицы "двумерных" поворотов, дополненные единицей в соответствующем столбце/строке, можно получить одну матрицу для "трехмерного" поворота.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
06.03.2025, 18:50  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Во-первых, нужно определить, как будет задаваться "трёхмерный" угол.
Откуда такое горячее желание попридираться? Как-то Вы не очень этим интересовались напр при обсуждении скалярного произведения (косинус какого-такого угла?). Я знаю "трехгранный" (телесный) угол, "двугранный" (с плоскостью) но никогда не слышал про "трехмерный". Да, угол между векторами, без затей, просто "угол"

Цитата Сообщение от Shamil1 Посмотреть сообщение
Кстати, я не заметил определения вектора ("объект, обладающий следующими свойствами...").
А что такое "точка"? А "прямая"? И.т.п. Кстати, это интересные вопросы/ответы (на вику не надейтесь). Но согласитесь, так любую мысль можно довести до абсурда. Всегда есть какой-то уровень понимания на который мы вправе рассчитывать, напр школьный. Иначе утонем в полемиках

Так что у нас с 5.2? Это ж классика (марксизма-ленинизма)
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
07.03.2025, 10:30
Обсуждение превратилось в спор из-за нечеткого представления проблемы. Что такое "поворот стартового поста "
Очень не приятно, что представив полную картину, описывающую поведение двух изменяющихся векторов в 3D пространстве, я не могу донести ее до заинтересованных в решении.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,894
07.03.2025, 11:19
Цитата Сообщение от Igor3D Посмотреть сообщение
Да, угол между векторами, без затей, просто "угол"
Вы не можете повернуть трехмерный вектор на 45 градусов. Потому что, существует бесконечное количество векторов, расположенных под углом 45 градусов к заданному.

Цитата Сообщение от Igor3D Посмотреть сообщение
А что такое "точка"? А "прямая"?
Вы рассказываете "вчерашнему школьнику" про вектора, но даже не объяснили, что это такое. Школьники (без доп.подготовки) могут знать про "направленный отрезок" и про "свободный вектор". С высшей алгеброй они не знакомы.

В отличии от направленного отрезка, на который можно посмотреть, вектор - это абстракция. Её можно только определить.

Цитата Сообщение от Igor3D Посмотреть сообщение
Так что у нас с 5.2? Это ж классика (марксизма-ленинизма)
Я до сих пор не понял, что в пункте 4 написано. Поэтому с 5.2 даже не пытаюсь разобраться.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
07.03.2025, 16:36  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вы не можете повернуть трехмерный вектор на 45 градусов. Потому что, существует бесконечное количество векторов, расположенных под углом 45 градусов к заданному.
Да, нужно определить что такое "поворот 3D вектора вокруг произвольной оси". И 5.2 для этого - самое место. Я бы начал так
При повороте вокруг произвольной оси угол между исходным и повернутым векторами в общем случае не равен углу поворота. Напр если исходный вектор совпадает/коллинеарен с осью поворота, то повернутый вектор равен исходному..
Ну и развейте мысль. Или объясните сами как считаете нужным
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вы рассказываете "вчерашнему школьнику" про вектора, но даже не объяснили, что это такое.
Для этого была первая лекция где рассказывалось что такое вектора, как они складываются и.т.п. Мы не можем и не должны объяснять все "до упора" в одной теме
Цитата Сообщение от VAF34 Посмотреть сообщение
я не могу донести ее до заинтересованных в решении.
А кто Вам мешает? Доносите
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
08.03.2025, 12:20
Так вы упираетесь, меняете постановку задачи, не отвечаете по вопросы (зачем еще ось, если есть уже два вектора). Повторяю, что если вы еще раз, кратко, четко опишите систему и желаемое вами, может быть мы продвинемся.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
08.03.2025, 15:49  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Так вы упираетесь, меняете постановку задачи, не отвечаете по вопросы (зачем еще ось, если есть уже два вектора). Повторяю, что если вы еще раз, кратко, четко опишите систему и желаемое вами, может быть мы продвинемся.
Требуется 5.2 - показать как данные формулы используются для поворота 3D вектора вокруг произвольной оси. Ничего не менялось, "как применять формулу" входит в "объясните" стартового поста. Это можно сделать 2-3 четкими фразами вкупе с 2-3 строчками псевдокода (меньше чем объем данного поста).

Вы можете это сделать не капризничая и не привлекая десяток новых сущностей?
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
08.03.2025, 16:36
Форма постановки задачи не правильная. Я могу работать с заранее заданными формулами. Если можно 2 - 3 фразами поставьте задачу, ничего не добавляя о форме ее решения.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
08.03.2025, 20:06  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Форма постановки задачи не правильная. Я могу работать с заранее заданными формулами. Если можно 2 - 3 фразами поставьте задачу, ничего не добавляя о форме ее решения.
Ну так вот
Цитата Сообщение от Igor3D Посмотреть сообщение
Требуется 5.2 - показать как данные формулы используются для поворота 3D вектора вокруг произвольной оси.
Что тут неправильного (или непонятного) ?
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
09.03.2025, 08:25
Наконец-то понял, что вы не ищете решение о повороте вектора, а ищете объяснение формулы. Это не ко мне. У каждого есть предел. Ранее в бурсе этот предел назывался "ослиный мост". У меня таким пределом является соотношение неопределенностей в квантовой механике.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
09.03.2025, 13:33  [ТС]

Не по теме:

Цитата Сообщение от VAF34 Посмотреть сообщение
Наконец-то понял, что вы не ищете решение о повороте вектора, а ищете объяснение формулы. Это не ко мне. У каждого есть предел. Ранее в бурсе этот предел назывался "ослиный мост". У меня таким пределом является соотношение неопределенностей в квантовой механике.
Я так понял, вопрос оказался недостоин Вашего (высокого) класса :) Как хотите, но просьба в следующий раз не засорять топик

Ладно, обойдемся без квантов
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 части/компоненты - очень простой но и очень эффективный (базовый) прием
Не удержался от последней (назидательной) фразы Не раз видел как последнюю формулу изрядно "раздувают" обходясь без x1 и x2. Впечатление что делается это умышленно чтобы задавить начинающего огромными страшными вычислениями
0
60 / 60 / 4
Регистрация: 10.06.2023
Сообщений: 964
09.03.2025, 15:18
Судя по тексту, вам все понятно, возможно вам помогло общее продолжительное обсуждение. Единственно, что я хочу заметить ваш язык сильно отличается от моего. В моем у вектора есть только величина и направление, все остальное это параметры описания вектора.
0
1976 / 832 / 115
Регистрация: 01.10.2012
Сообщений: 5,062
Записей в блоге: 2
10.03.2025, 13:00  [ТС]
Вот финальный "конспект студента"
Кликните здесь для просмотра всего текста
Формулы поворота

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 части/компоненты - очень простой но и очень эффективный (базовый) прием
К сожалению, коллективного творчества не получилось Возлагал надежды на товарища с котом, но увы. Ладно, как получилось - так и получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.03.2025, 13:00

Матрица вращения
Нужно чтобы вместо Х вращалась буква П. Вот сам код uses crt,graph; const minXm=-100;maxXm=2000; minYm=2000; maxYm=-100; ...

Матрица вращения (X->Y->Z)
Добрый день. Подскажите как составить матрицу вращения, если знаю координаты вектора в начальном и конечном положении.

Метод косоугольного вращения. Матрица поворота
Доброго времени суток. В факторном анализе в статистике есть метод косоугольное вращение. Пишу программу для его реализации и не могу...

Матрица вращения облака точек вида x,y,z
Добрый день господа сочувствующие! Никто не подскажет способ и функционал для матрицы вращения облака точек вида x,y,z. Проще выражаясь...

В какой момент времени после начала вращения платформы груз начнет соскальзывать, объясните как решать
Здравия, соратники! Разъясните,пожалуйста, как решать задачу Google не помог На краю вращающейся платформы радиуса R=1,0 м лежит груз. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru