матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 07:02
Оценка:
Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?
Отбразываем перенос.
Re: матрица -> парамерты преобразования
От: Mab Россия http://shade.msu.ru/~mab
Дата: 31.03.06 07:22
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?

Каким образом афинное преобразование можно задать матрицей 2x2?
Re[2]: матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 07:45
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, nicolas1, Вы писали:


N>>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?

Mab>Каким образом афинное преобразование можно задать матрицей 2x2?

Полная матрица размером 3х3.
3я строка: 0 0 1
3
-й столбец :
dx
dy
1

Интересуют данные, которые находятся в подматрице 2х2 (угол(ы) поворота, масштабы) начиная с верхнего левого угла матрицы 3х3.
Re[3]: матрица -> парамерты преобразования
От: Mab Россия http://shade.msu.ru/~mab
Дата: 31.03.06 07:52
Оценка:
Здравствуйте, nicolas1, Вы писали:

Понятно. Значит имеется в виду обычное линейное преобразование. Ну с ним-то вроде все просто: ищем собственные значения матрицы -- они дают коэффициенты растяжения/сжатия. Далее, ищем собственный вектор -- из него вычисляется угол повотора.
Re[4]: матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 07:55
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, nicolas1, Вы писали:


Mab>Понятно. Значит имеется в виду обычное линейное преобразование. Ну с ним-то вроде все просто: ищем собственные значения матрицы -- они дают коэффициенты растяжения/сжатия. Далее, ищем собственный вектор -- из него вычисляется угол повотора.


Можно тут подробнее, или ссылку указать где почитать...
Re: матрица -> парамерты преобразования
От: andrey.def Россия  
Дата: 31.03.06 07:57
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?


здесь

там немного теории. Вполне достаточно , чтобы получить необходимые результаты.
Re[5]: матрица -> парамерты преобразования
От: Mab Россия http://shade.msu.ru/~mab
Дата: 31.03.06 07:59
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Можно тут подробнее, или ссылку указать где почитать...

Сгодится любой вузовский курс линейной алгебры.
Re: матрица -> парамерты преобразования
От: lazyden  
Дата: 31.03.06 08:31
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?


Матрица преобразования = маштабирование на поворот (в общем случае, A0!=A1)
 | SX 0  |   |  cosA0 sinA0 |   |  SX*cosA0 SX*sinA0 |
 | 0  SY | * | -sinA1 cosA1 | = | -SY*sinA1 SY*cosA1 |


Пусть
 |  SX*cosA0 SX*sinA0 |    | ScaleX      RotateSkew0 |
 | -SY*sinA1 SY*cosA1 | == | RotateSkew1 ScaleY      |


Тогда
 A0=arctan2( RotateSkew0,ScaleX);
 A1=arctan2(-RotateSkew1,ScaleY);

 cosa=cos(A0); sina=sin(A0);
 if (cosa > sina) SX=ScaleX/cosa
 else SX=RotateSkew0/sina;

 cosa=cos(A1); sina=sin(A1);
 if (cosa > sina) SY=ScaleY/cosa
 else SY=-RotateSkew1/sina;


Все
Re[2]: матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 08:51
Оценка:
Здравствуйте, lazyden, Вы писали:

L>Здравствуйте, nicolas1, Вы писали:


N>>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?


L>Матрица преобразования = маштабирование на поворот (в общем случае, A0!=A1)

L>
L> | SX 0  |   |  cosA0 sinA0 |   |  SX*cosA0 SX*sinA0 |
L> | 0  SY | * | -sinA1 cosA1 | = | -SY*sinA1 SY*cosA1 | 
L>


L>Пусть

L>
L> |  SX*cosA0 SX*sinA0 |    | ScaleX      RotateSkew0 |
L> | -SY*sinA1 SY*cosA1 | == | RotateSkew1 ScaleY      |
L>


L>Тогда

L>
L> A0=arctan2( RotateSkew0,ScaleX);
L> A1=arctan2(-RotateSkew1,ScaleY);

L> cosa=cos(A0); sina=sin(A0);
L> if (cosa > sina) SX=ScaleX/cosa
L> else SX=RotateSkew0/sina;

L> cosa=cos(A1); sina=sin(A1);
L> if (cosa > sina) SY=ScaleY/cosa
L> else SY=-RotateSkew1/sina;
L>


L>Все


Отражение не учитывается. Задаю отрицательный масштаб SY, вычисляю. Выдает положительный. Неверно?

Что-то слышал про сингулярное разложение матрицы (svd). Как этим пользоваться?
Re: матрица -> парамерты преобразования
От: minorlogic Украина  
Дата: 31.03.06 09:13
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?

N>Отбразываем перенос.

Ищи "Graphics Gems" Matrix Decomposition.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: матрица -> парамерты преобразования
От: lazyden  
Дата: 31.03.06 09:23
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Отражение не учитывается. Задаю отрицательный масштаб SY, вычисляю. Выдает положительный. Неверно?

Оба варианта дают одинаковый результат — не всегда можно однозначно отнести минус к коеф.маштаба/к углу.
 |  SX*cosA0 SX*sinA0 |
 | -SY*sinA1 SY*cosA1 |

 SX=1 SY=-1 A0=A1=0 => | 1  0 |
                       | 0 -1 |

 SX=1 SY=1 A0=0 A1=180 => | 1  0 |
                          | 0 -1 |

(да еще — в коде очепятка — сравниваются не cosa, sina, а их абсолютные значения )

N>Что-то слышал про сингулярное разложение матрицы (svd). Как этим пользоваться?

Это что-то сложное и очень далекое от моего курса линейной алгебры .
Re: матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 09:45
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?

N>Отбразываем перенос.


кому интересно нашел http://www.gamedev.ru/forum/?group=2&topic=904

проверяю сейчас.
Re[6]: матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 10:02
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, nicolas1, Вы писали:


N>>Можно тут подробнее, или ссылку указать где почитать...

Mab>Сгодится любой вузовский курс линейной алгебры.

Возникает вопрос, если были shear или преобразование высчитывалось по МНК контрольных точек, вообще имеется ли правильный ответ?
Re[7]: матрица -> парамерты преобразования
От: Mab Россия http://shade.msu.ru/~mab
Дата: 31.03.06 10:06
Оценка:
Здравствуйте, nicolas1, Вы писали:
N>Возникает вопрос, если были shear или преобразование высчитывалось по МНК контрольных точек, вообще имеется ли правильный ответ?
Вопрос не понял Что такое "правильный ответ"...?
Re[8]: матрица -> парамерты преобразования
От: nicolas1  
Дата: 31.03.06 10:24
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, nicolas1, Вы писали:

N>>Возникает вопрос, если были shear или преобразование высчитывалось по МНК контрольных точек, вообще имеется ли правильный ответ?
Mab>Вопрос не понял Что такое "правильный ответ"...?

Для полной декомпозиции (чтобы воспроизвести это преобразование по параметрам) надо еще извлечь shear_x и shear_y.
Re[4]: неправильно
От: Аноним  
Дата: 31.03.06 13:16
Оценка: +1
Здравствуйте, Mab, Вы писали:

Mab>Понятно. Значит имеется в виду обычное линейное преобразование. Ну с ним-то вроде все просто: ищем собственные значения матрицы -- они дают коэффициенты растяжения/сжатия. Далее, ищем собственный вектор -- из него вычисляется угол повотора.



Очевидно, это неправильно
А что, интересно, предлагается делать, если собственных чисел у матрицы вообще нет?

Конечно, надо использовать разложение матрицы в виде:
A = U * sqrt(A`*A), где A` — сопряженная (транспонированная матрица)

Тогда собственные числа матрицы sqrt(A`*A) дадут коэффициенты растяжения/сжатия,
собственные вектора этой матрицы — оси, вдоль которых происходит это растяжение/сжатие

А из матрицы U, которая унитарна, находится угол поворота и оси отражения
Re[5]: неправильно
От: Mab Россия http://shade.msu.ru/~mab
Дата: 31.03.06 18:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Очевидно, это неправильно

А>А что, интересно, предлагается делать, если собственных чисел у матрицы вообще нет?
Мдя... чего-то я ерунду сказал Собственных (вещественных) векторов нет уже у любого нетривиального поворота.
Re[5]: неправильно
От: nicolas1  
Дата: 01.04.06 04:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Конечно, надо использовать разложение матрицы в виде:

А>A = U * sqrt(A`*A), где A` — сопряженная (транспонированная матрица)

А>Тогда собственные числа матрицы sqrt(A`*A) дадут коэффициенты растяжения/сжатия,

А>собственные вектора этой матрицы — оси, вдоль которых происходит это растяжение/сжатие

А>А из матрицы U, которая унитарна, находится угол поворота и оси отражения


Можно увидеть как это делается в развернутой форме для матрицы 2х2?
Re[6]: неправильно
От: Аноним  
Дата: 01.04.06 17:31
Оценка:
Здравствуйте, nicolas1, Вы писали:

N>Можно увидеть как это делается в развернутой форме для матрицы 2х2?



Я затрудняюсь, ибо записать целиком алгоритм даже для матрицы 2х2 — слишком долгая и нудная работа
Могу лишь попытаться описать его в общих чертах, без деталей

Итак, пусть есть матрица А = [a,b],[c,d]] (внутри записаны строчки)

1) убедимся, что определитель не равен нулю (ad-bc!=0)

2) найдем матрицу В = A~ * A, где A~ — транспонированная матрица, это все легко сосчитать
B = [[a^2+c^2, ab+cd], [ab+cd, b^2+d^2]]

3) найдем 2 собственных числа матрицы B, которые являются корнями квадратного уравнения
x^2 — (a^2+b^2+c^2+d^2)*x + (ad-bc)^2 = 0

4) найдем 2 собственных вектора матрицы B, v1 и v2, каждый из которых соответствует своему собственному числу
Ищутся они исходя из равенств (B — x1*E)*v1 = 0 и аналогичного равенства для второго вектора
(здесь E — единичная матрица, и 0 — нулевой вектор)

5) найденные векторы v1 и v2 соответствуют 2 ортогональным осям, вдоль которых происходит растяжение/сжатие
Соответсвующие коэффициенты растяжения/сжатия — это sqrt(x1) и sqrt(x2)

6) далее, введем матрицу Ф=[v1,v2], то есть матрицу, в строчках(!) которой записаны единичные (!) собственные векторы
Введем матрицу Ф~ — траспонированную Ф, то есть наши векторы (единичные!) в ней будут записаны в столбцах(!)
Обозначим T — диагональную матрицу, у которой на диагоналях стоят собственные числа х1 и х2
Обозначим sqrt(T) — диагональную матрицу, у которой на диагоналях стоят числа sqrt(x1) и sqrt(x2)

Тогда должно выполняться равенство B = Ф~ * T * Ф
Теперь введем матрицу sqrt(B), которую определим по формуле sqrt(B) = Ф~ * sqrt(T) * Ф

7) теперь осталось только сосчитать матрицу повотора U из равенства A = U * sqrt(B),
то есть U = A * sqrt(B)^(-1)

Заметим, что sqrt(B)^(-1) = Ф~ * sqrt(T)^(-1) * Ф,

где sqrt(T)^(-1) — матрица, обратная к sqrt(T), то есть диагональная матрица,
на дигоналях которой стоят числа 1/sqrt(x1) и 1/sqrt(x2)

То есть окончательно имеем,
U = A * Ф~ * sqrt(T)^(-1) * Ф

8) далее из вида матрицы U находим углы и отражения
Поскольку U — ортогональная матрица, общий вид ее в двумерном случае довольно прост, поскольку угол всего один


Вот, собственно, и весь алгоритм
Надесь, хоть чем-то помог
Re[7]: неправильно
От: nicolas1  
Дата: 02.04.06 08:15
Оценка:
Здравствуйте, Аноним, Вы писали:

Это называется сингулярное разложение матрицы (svd)?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.