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

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

10.02.2025, 22:29. Показов 8887. Ответов 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
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 2
04.03.2025, 22:03  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от u235 Посмотреть сообщение
А про величину угла поворота забыли?
Верно, спасибо что напомнили. Итого 3 аргумента
0
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 951
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
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 2
05.03.2025, 16:45  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Есть два вектора скорости и "чайника".
Возможно Вы усмотрели связь с другой темой (где фигурировал чайник), но это не так, темы никак не связаны
0
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 951
06.03.2025, 09:04
Обсуждение очень длинное и запутанное, не могли бы вы переформулировать вопрос с учетом уже высказанного.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 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
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 951
06.03.2025, 17:01
Непонятно " их координаты могут быть любыми, необязательно совпадать с осями/плоскостями СК."
Непонятно, что за плоскость определяемая двумя векторами (этого было бы достаточно) зачем еще какая-то ось, которая одна она была бы достаточна для определения условий вращения.
Пункт 5 понятен и может быть реализован. Похожим на высказанный мною ранее методом. Пункты 5.1 и 5.2 изложение деталей пункта 5.
Если ваш комментарий можно свести к задаче вращения вектора вокруг заданной оси с возможным изменением 3Dугла между ними, то перечитайте мой предыдущий комментарий. По моему, структура решения там описана.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 2
06.03.2025, 17:45  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Непонятно " их координаты"..
Непонятно, что за плоскость..
На любую критику есть прекрасный ответ типа "предложите лучше". Пожалуйста, слушаю Вас

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

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

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

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

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

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

Вы можете это сделать не капризничая и не привлекая десяток новых сущностей?
0
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 951
08.03.2025, 16:36
Форма постановки задачи не правильная. Я могу работать с заранее заданными формулами. Если можно 2 - 3 фразами поставьте задачу, ничего не добавляя о форме ее решения.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 2
08.03.2025, 20:06  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Форма постановки задачи не правильная. Я могу работать с заранее заданными формулами. Если можно 2 - 3 фразами поставьте задачу, ничего не добавляя о форме ее решения.
Ну так вот
Цитата Сообщение от Igor3D Посмотреть сообщение
Требуется 5.2 - показать как данные формулы используются для поворота 3D вектора вокруг произвольной оси.
Что тут неправильного (или непонятного) ?
0
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 951
09.03.2025, 08:25
Наконец-то понял, что вы не ищете решение о повороте вектора, а ищете объяснение формулы. Это не ко мне. У каждого есть предел. Ранее в бурсе этот предел назывался "ослиный мост". У меня таким пределом является соотношение неопределенностей в квантовой механике.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 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
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 951
09.03.2025, 15:18
Судя по тексту, вам все понятно, возможно вам помогло общее продолжительное обсуждение. Единственно, что я хочу заметить ваш язык сильно отличается от моего. В моем у вектора есть только величина и направление, все остальное это параметры описания вектора.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,047
Записей в блоге: 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] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru