![]() |
|
![]() ![]() ![]() |
|
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
Есть формула поворота
я хотел её переписать в форме преобразования в виде матриц c=cos(theta),s=sin(theta) ![]() но непонятно почему так получается, что первая матрица матрица с +, а третья с - , хотя вроде как должно было быть наоборот по логике, т.е. мы сначала вычитаем из точки приводя её в (0,0), потом поворачиваем относительно (0,0) и потом опять прибавляем что вычли. Это сообщение отредактировал(а) mrgloom - 23.12.2013, 17:20 |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Есть две формулы умножения вектора и матрицы.
V*M1=V2 M2*V=V2 Более всего популярна вторая. Вот и получается что формулу с матрицами надо читать с права на лево. |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну мы то вроде как матрицы умножаем, а не вектор и матрицу.
и всё таки не понятно почему преобразования надо читать справа налево. а или имелось ввиду перемножения окончательной матрицы и точки-вектора? т.е. V*M1=V2 тут вектор-точка строка M2*V=V2 тут вектор-точка столбец Это сообщение отредактировал(а) mrgloom - 24.12.2013, 09:31 |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Вектор 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 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
еще столкнулся с такой проблемой, делая несколько преобразований(повороты вокруг разных точек) получается, что при перемножении матриц преобразований накапливается погрешность и например при повороте (в сумме) на 360 градусов изображение в итоге не равно изображению с углом поворота =0.
как этого можно избежать? Это сообщение отредактировал(а) mrgloom - 27.12.2013, 13:54 |
|||
|
||||
OpenGL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.4.2008 Репутация: нет Всего: нет |
Вроде погрешность можно немного уменьшить, если нормализовывать получающиеся матрицы: должно выполняться условие c^2+s^2=1, а значит надо c и s делить на d = sqrt(c^2+s^2). А вообще полностью - никак. Иррациональные числа же.
|
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
Поворот вокруг любой точки всегда можно заменить на поворот вокруг центра объекта и сдвиг. Тогда повороты можно накапливать отдельно (в виде суммы углов), а сдвиги отдельно.
Погрешность суммы углов будет меньше, чем перемножения кучи матриц. А если углы задавать, например целым количеством градусов, погрешности углов не будет вообще. Погрешность сдвигов, конечно, остаётся. -------------------- qqq |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |