Формулы поворота
Показов 2796
Комментарии 5
Метки math
Добрый день Тема Формулы поворота 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
Комментарии
-
Здравствуйте.
Например, так:
Рассмотрим новый базис (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 -
А я тупой я для себя так объясняю.
Повернули систему координат против часовой стрелки на угол 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,
Запись от mikello размещена 13.03.2025 в 17:02 -
Запись от sporta1982 размещена 13.03.2025 в 18:58 -
Не по теме:
Это моя первая запись в блоге, не понял куда текст вставлять :)
Запись от Igor3D размещена 14.03.2025 в 21:56
Обновил(-а) Igor3D 23.03.2025 в 18:45