Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поворот вокруг произвольной точки 
:(
    Опции темы
mrgloom
Дата 23.12.2013, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Есть формула поворота
Код

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) и потом опять прибавляем что вычли.

Это сообщение отредактировал(а) mrgloom - 23.12.2013, 17:20
PM MAIL   Вверх
Pavia
Дата 23.12.2013, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Есть две формулы умножения вектора и матрицы. 

V*M1=V2
M2*V=V2

Более всего популярна вторая.
Вот и получается что формулу с матрицами надо читать с права на лево.
PM MAIL   Вверх
mrgloom
Дата 24.12.2013, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



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


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

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

Это сообщение отредактировал(а) mrgloom - 24.12.2013, 09:31
PM MAIL   Вверх
Pavia
Дата 24.12.2013, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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


PM MAIL   Вверх
mrgloom
Дата 27.12.2013, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) mrgloom - 27.12.2013, 13:54
PM MAIL   Вверх
OpenGL
Дата 28.12.2013, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Вроде погрешность можно немного уменьшить, если нормализовывать получающиеся матрицы: должно выполняться условие c^2+s^2=1, а значит надо c и s делить на d = sqrt(c^2+s^2). А вообще полностью - никак. Иррациональные числа же.
PM MAIL   Вверх
maxim1000
Дата 28.12.2013, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



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

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

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


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.