Подтвердить что ты не робот

Извлечение, масштабные значения из матрицы преобразования 2d

как я могу извлечь значения поворота, масштабирования и сдвига из матрицы преобразования 2d? я имею в виду, что a имеет 2d-преобразование

matrix = [1, 0, 0, 1, 0, 0]

matrix.rotate(45 / 180 * PI)
matrix.scale(3, 4)
matrix.translate(50, 100)
matrix.rotate(30 / 180 * PI)
matrix.scale(-2, 4)

теперь моя матрица имеет значения [a, b, c, d, tx, ty]

позволяет забыть о описанных выше процессах и представить, что мы имеем только значения a, b, c, d, tx, ty

как я могу найти общие значения вращения и масштабирования через a, b, c, d, tx, ty

извините за мой английский

Спасибо за ваш прогресс

ИЗМЕНИТЬ

Я думаю, что это должен быть ответ где-то...

Я просто попытался в Flash Builder (AS3), как этот

   var m:Matrix = new Matrix;
   m.rotate(.25 * Math.PI);
   m.scale(4, 5);
   m.translate(100, 50);
   m.rotate(.33 * Math.PI);
   m.scale(-3, 2.5);

   var shape:Shape = new Shape;
   shape.transform.matrix = m;

   trace(shape.x, shape.y, shape.scaleX, shape.scaleY, shape.rotation);

а выход:

x = -23.6 
y = 278.8 
scaleX = 11.627334873920528 
scaleY = -13.54222263865791 
rotation = 65.56274134518259 (in degrees)
4b9b3361

Ответ 1

Не все значения a, b, c, d, tx, ty приведут к действительной последовательности вращения. Я полагаю, что приведенные выше значения являются частью однородной матрицы вращения 3x3 в 2D

    | a  b  tx |
A = | c  d  ty |
    | 0  0  1  |

который преобразует координаты [x, y, 1] в:

[x', y', 1] = A * |x|
                  |y|
                  |z|
  • Таким образом, установите traslation в [dx, dy]=[tx, ty]
  • Шкала sx = sqrt(a² + c²) и sy = sqrt(b² + d²)
  • Угол поворота t = atan(c/d) или t = atan(-b/a), так же как и они должны быть одинаковыми.

В противном случае у вас нет действительной матрицы вращения.


Вышеприведенное преобразование расширяется до:

x' = tx + sx (x Cos θ - y Sin θ)
y' = ty + sy (x Sin θ + y Cos θ)

когда порядок вращения, затем масштаб и затем перевод.

Ответ 2

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

Это работает только в том случае, если x и y всегда масштабируются одинаково (равномерное масштабирование).

Учитывая вашу матрицу m, которая претерпела серию преобразований,

var translate:Point;
var rotate:Number;
var scale:Number;

// extract translation
var p:Point = new Point();
translate = m.transformPoint(p);
m.translate( -translate.x, -translate.y);

// extract (uniform) scale
p.x = 1.0;
p.y = 0.0;
p = m.transformPoint(p);
scale = p.length;

// and rotation
rotate = Math.atan2(p.y, p.x);

Там вы идете!

Ответ 3

Если при масштабировании вы масштабировались на одну и ту же сумму в x и y, то определитель матрицы, то есть ad-bc, который сообщает вам мультипликатор области, также скажет вам линейное изменение масштаба - это будет - квадратный корень определителя. atan (b/a) или лучше atan2 (b, a) сообщит вам полный угол, через который вы повернули.

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