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

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

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

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

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

Вы можете это сделать не капризничая и не привлекая десяток новых сущностей?
0
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
08.03.2025, 16:36
Форма постановки задачи не правильная. Я могу работать с заранее заданными формулами. Если можно 2 - 3 фразами поставьте задачу, ничего не добавляя о форме ее решения.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,036
Записей в блоге: 2
08.03.2025, 20:06  [ТС]
Цитата Сообщение от VAF34 Посмотреть сообщение
Форма постановки задачи не правильная. Я могу работать с заранее заданными формулами. Если можно 2 - 3 фразами поставьте задачу, ничего не добавляя о форме ее решения.
Ну так вот
Цитата Сообщение от Igor3D Посмотреть сообщение
Требуется 5.2 - показать как данные формулы используются для поворота 3D вектора вокруг произвольной оси.
Что тут неправильного (или непонятного) ?
0
59 / 59 / 4
Регистрация: 10.06.2023
Сообщений: 949
09.03.2025, 08:25
Наконец-то понял, что вы не ищете решение о повороте вектора, а ищете объяснение формулы. Это не ко мне. У каждого есть предел. Ранее в бурсе этот предел назывался "ослиный мост". У меня таким пределом является соотношение неопределенностей в квантовой механике.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,036
Записей в блоге: 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
Сообщений: 949
09.03.2025, 15:18
Судя по тексту, вам все понятно, возможно вам помогло общее продолжительное обсуждение. Единственно, что я хочу заметить ваш язык сильно отличается от моего. В моем у вектора есть только величина и направление, все остальное это параметры описания вектора.
0
1975 / 831 / 115
Регистрация: 01.10.2012
Сообщений: 5,036
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru