Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Поворот вокруг произвольной точки


Автор: mrgloom 23.12.2013, 17:18
Есть формула поворота
Код

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy

я хотел её переписать в форме преобразования в виде матриц
c=cos(theta),s=sin(theta)
user posted image
но непонятно почему так получается, что первая матрица матрица с +, а третья с - , хотя вроде как должно было быть наоборот по логике, т.е. мы сначала вычитаем из точки приводя её в (0,0), потом поворачиваем относительно (0,0) и потом опять прибавляем что вычли.

Автор: Pavia 23.12.2013, 17:48
Есть две формулы умножения вектора и матрицы. 

V*M1=V2
M2*V=V2

Более всего популярна вторая.
Вот и получается что формулу с матрицами надо читать с права на лево.

Автор: mrgloom 24.12.2013, 09:06
ну мы то вроде как матрицы умножаем, а не вектор и матрицу.
и всё таки не понятно почему преобразования надо читать справа налево.


а или имелось ввиду перемножения окончательной матрицы и точки-вектора?

т.е.
V*M1=V2  тут вектор-точка строка
M2*V=V2 тут вектор-точка столбец

Автор: Pavia 24.12.2013, 10:35
Вектор V  нам надо переместить в x,y
M1=[1 0 -x; 0 1 -y; 0 0 1];
Для этого вектор V перемножается с M1
M1*V0=V1

Затем V1 надо повернуть.
M2=[c -s 0; s c 0; 0 0 1]
M2*V1=V2

И делаем ещё одно перемещение  V2 
M3=[1 0 x; 0 1 y; 0 0 1];
M3*V2=V3

Откуда имеем.
M3*M2*M1*V0=V3


Автор: mrgloom 27.12.2013, 13:53
еще столкнулся с такой проблемой, делая несколько преобразований(повороты вокруг разных точек) получается, что при перемножении матриц преобразований накапливается погрешность и например при повороте (в сумме) на 360 градусов изображение в итоге не равно изображению с углом поворота =0.

как этого можно избежать?

Автор: OpenGL 28.12.2013, 08:10
Вроде погрешность можно немного уменьшить, если нормализовывать получающиеся матрицы: должно выполняться условие c^2+s^2=1, а значит надо c и s делить на d = sqrt(c^2+s^2). А вообще полностью - никак. Иррациональные числа же.

Автор: maxim1000 28.12.2013, 10:13
Поворот вокруг любой точки всегда можно заменить на поворот вокруг центра объекта и сдвиг. Тогда повороты можно накапливать отдельно (в виде суммы углов), а сдвиги отдельно.

Погрешность суммы углов будет меньше, чем перемножения кучи матриц. А если углы задавать, например целым количеством градусов, погрешности углов не будет вообще.

Погрешность сдвигов, конечно, остаётся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)