| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Поворот вокруг произвольной точки |
| Автор: mrgloom 23.12.2013, 17:18 | ||
Есть формула поворота
я хотел её переписать в форме преобразования в виде матриц c=cos(theta),s=sin(theta) ![]() но непонятно почему так получается, что первая матрица матрица с +, а третья с - , хотя вроде как должно было быть наоборот по логике, т.е. мы сначала вычитаем из точки приводя её в (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 |
| Поворот вокруг любой точки всегда можно заменить на поворот вокруг центра объекта и сдвиг. Тогда повороты можно накапливать отдельно (в виде суммы углов), а сдвиги отдельно. Погрешность суммы углов будет меньше, чем перемножения кучи матриц. А если углы задавать, например целым количеством градусов, погрешности углов не будет вообще. Погрешность сдвигов, конечно, остаётся. |