Некоторое время уже ломаю голову как мне вычислить начальные параметры (матрицы) если есть финальная матрица преобразований. Простые случаи (меньше 3) преобразований не интересны - там вычислять нечего зная порядок. А вот если одновременно над объектом применены поворот (rotate), перенос (transform), масштабирование по вертикали и горизонтали (scale) и скос по 2м углам (skew)... Есть ли какая методика вычисления начальных параметров, если порядок трансформаций известен? Насколько я успел облазить гугл, то точно вернуть не получится вообще но приблизительные параметры как-то же наверняка можно подобрать, которые бы соответствовали конечной матрице. Буду рад любой информации, которая помешает комплексу неполноценности овладеть мною
Возможно, если ты попробуешь различные численные примеры и убедишься в том, что для заданного rk (конечного вектора) и преобразований Ar,At,As и Askew существует множество различных rn (начальный вектор), дающих rk, то получится, что вряд ли получится найти rn по rk. Если же нет, то возможно можно вначале получить какие-то ограничения на каждый элемент rn (x,y,z,) и, далее, перебор ?
Упрощенно есть матрица вида Код (Text): [x1 x2] [x3 x4] полученная путем умножения матриц Код (Text): [Sx 0]\/[Cos0 Sin0]\/[1 tgA] [0 Sy]/\[-Sin0 Cos0]/\[tgB 1] Вот задача и найти эти матрицы. Получается система из 4-х уравнения с 5ю неизвестными. Вот так, как в анекдоте, и трахаюсь с этими 5ю неизвестными Из ограничений - ну 3 угла - от 0 до 360 каждый и масштабирование границ не имеет - поле для перебора, скажем так, огромное
Если можно, все же уточни условие. Известна пара rn,rk, надо найти X ? Или известно множество пар rn, rk и опять надо найти X ? Или есть матрица X, надо представить ее в виде трех матриц - найти (Sx, ... B) ? PS Это для скольки координат ? Двух (x,y) ?
Да, есть только х1..х4 (собсно есть a, b, c, d, e, f - результирующая матрица), для 2D все, т.е. только x,y
а в виде fpu или псевдо-кода или на пальцах? хотя я кажется нашел метод устранения одного неизвестного - проверяю...
Я немного подумал - в общих чертах, без выкладок Насчет skew я не нашел внятного описания, поэтому примем его и все остальное, те: (перенос+трансформ+масштаб)+skew. Так вот, я полагаю, что первые три можно задать как поворот плюс растяжка (сжатие) радиуса, те: a'=a+delat_a; r'=r*k; в радиальных координатах (r,a) или матрица: [k*cos0 k*sin0] [-k*sin0 k*cos0] Те три преобразования в общем случае описываются всего 3-мя параметрами. А если ты хочешь получить 4-е параметра, то это будет бесконечное множество решений. Если что не так - сорри
Все верно, для трех и менее преобразований все очень просто, фактически в твоем случае там даже 2 параметра - косинус через синус можно выразить. В общем решение такое, точнее их 2, но смысл один и тот же - скос по горизонтали (tgA) можно выразить как вращение или наоборот (т.е. если у нас объект был скошен на 5 градусов и повернут на 12, то в результате либо вращение либо скос в конце равен 17 градусам). Для объекта эти операции равнозначны, т.е. смысл конечной матрицы не изменился, а мы получаем возможность избавиться от мешающей нам 5й переменной и при этом значительно упрощаем поиск неизвестных параметров.
На самом деле все достаточно просто Смотреть надо в сторону матричных разложений: 1. Полярного (почти то, что надо) 2. SVD 3. В собственном базисе. Почему первое - это почти то, что надо. Полярное (оно же QR-разложение) - суть приведение матрицы к произведению двух, одна из которых ортогональная (как раз те самые синус-косинус) и верхнетреугольной. Верхнетреугольная имеет вид [a b] [0 c] Представляя ее в виде произведения диагональной и верхнетреугольной, получаем искомое разложение. Дополнительный плюс - tg A = 0. Усе. PS: Читаем http://mathworld.wolfram.com/QRDecomposition.html и ссылки в некоторой eps-окрестности.
aSL Спасибо, хоть терминологию буду знать А на имплементацию этого метода есть ссылки/решения, а то я системой уравнений решил, может более элегантное решение есть?
Да не за что. Проблема-то классическая. И решена кучей способов лет эдак 200 назад точно. Как показывает практика, гугл рулит. Готовых реализаций - море. (И даже больше). А почитать, например, можно в: http://algolist.manual.ru/maths/linalg/index.php