Здравствуйте, nicolas1, Вы писали:
N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?
Каким образом афинное преобразование можно задать матрицей 2x2?
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, nicolas1, Вы писали:
N>>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)? Mab>Каким образом афинное преобразование можно задать матрицей 2x2?
Полная матрица размером 3х3.
3я строка: 0 0 1
3-й столбец :
dx
dy
1
Интересуют данные, которые находятся в подматрице 2х2 (угол(ы) поворота, масштабы) начиная с верхнего левого угла матрицы 3х3.
Понятно. Значит имеется в виду обычное линейное преобразование. Ну с ним-то вроде все просто: ищем собственные значения матрицы -- они дают коэффициенты растяжения/сжатия. Далее, ищем собственный вектор -- из него вычисляется угол повотора.
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, nicolas1, Вы писали:
Mab>Понятно. Значит имеется в виду обычное линейное преобразование. Ну с ним-то вроде все просто: ищем собственные значения матрицы -- они дают коэффициенты растяжения/сжатия. Далее, ищем собственный вектор -- из него вычисляется угол повотора.
Можно тут подробнее, или ссылку указать где почитать...
Здравствуйте, lazyden, Вы писали:
L>Здравствуйте, nicolas1, Вы писали:
N>>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)?
L>Матрица преобразования = маштабирование на поворот (в общем случае, A0!=A1) L>
Здравствуйте, nicolas1, Вы писали:
N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)? N>Отбразываем перенос.
Здравствуйте, nicolas1, Вы писали:
N>Отражение не учитывается. Задаю отрицательный масштаб SY, вычисляю. Выдает положительный. Неверно?
Оба варианта дают одинаковый результат — не всегда можно однозначно отнести минус к коеф.маштаба/к углу.
(да еще — в коде очепятка — сравниваются не cosa, sina, а их абсолютные значения )
N>Что-то слышал про сингулярное разложение матрицы (svd). Как этим пользоваться?
Это что-то сложное и очень далекое от моего курса линейной алгебры .
Здравствуйте, nicolas1, Вы писали:
N>Как определить парамерты преобразования (угол(ы) поворота, масштабы) из матрицы афинного преобразования (2 х 2)? N>Отбразываем перенос.
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, nicolas1, Вы писали:
N>>Можно тут подробнее, или ссылку указать где почитать... Mab>Сгодится любой вузовский курс линейной алгебры.
Возникает вопрос, если были shear или преобразование высчитывалось по МНК контрольных точек, вообще имеется ли правильный ответ?
Здравствуйте, nicolas1, Вы писали: N>Возникает вопрос, если были shear или преобразование высчитывалось по МНК контрольных точек, вообще имеется ли правильный ответ?
Вопрос не понял Что такое "правильный ответ"...?
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, nicolas1, Вы писали: N>>Возникает вопрос, если были shear или преобразование высчитывалось по МНК контрольных точек, вообще имеется ли правильный ответ? Mab>Вопрос не понял Что такое "правильный ответ"...?
Для полной декомпозиции (чтобы воспроизвести это преобразование по параметрам) надо еще извлечь shear_x и shear_y.
Здравствуйте, Mab, Вы писали:
Mab>Понятно. Значит имеется в виду обычное линейное преобразование. Ну с ним-то вроде все просто: ищем собственные значения матрицы -- они дают коэффициенты растяжения/сжатия. Далее, ищем собственный вектор -- из него вычисляется угол повотора.
Очевидно, это неправильно
А что, интересно, предлагается делать, если собственных чисел у матрицы вообще нет?
Конечно, надо использовать разложение матрицы в виде:
A = U * sqrt(A`*A), где A` — сопряженная (транспонированная матрица)
Тогда собственные числа матрицы sqrt(A`*A) дадут коэффициенты растяжения/сжатия,
собственные вектора этой матрицы — оси, вдоль которых происходит это растяжение/сжатие
А из матрицы U, которая унитарна, находится угол поворота и оси отражения
Здравствуйте, Аноним, Вы писали:
А>Очевидно, это неправильно А>А что, интересно, предлагается делать, если собственных чисел у матрицы вообще нет?
Мдя... чего-то я ерунду сказал Собственных (вещественных) векторов нет уже у любого нетривиального поворота.
Здравствуйте, Аноним, Вы писали:
А>Конечно, надо использовать разложение матрицы в виде: А>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 — ортогональная матрица, общий вид ее в двумерном случае довольно прост, поскольку угол всего один
Вот, собственно, и весь алгоритм
Надесь, хоть чем-то помог