给定两个变换(放大中心),找到比例中心(视口内)

Find center of scale (inside viewport), given two transforms (center of enlargement)

问题: 一个对象在我的视口内缩放。我知道比例、大小和比例前后的位置。我不知道放大的中心 - 这是我想要找到的。

我的数据类型:

transform t =  {x: 0, y: 0, kx: 1, ky: 1}

x, y => 对象到视口原点的偏移量

kx, ky => 对象的 x 和 y 比例

我有数据:

var sizeOfViewport = {width, height}
var originalSizeOfObject = {width, height} // in my case same as viewport size
var transformBefore // offset to viewport origin and scale
var transformAfter // offset to viewport origin and scale

所以给定两个描述原始对象和缩放对象的大小和位置以及视口大小的变换 - 我如何找出放大的中心..例如,如果对象是从鼠标缩放的position - 如何找出鼠标在缩放过程中的位置..?

我们有转换 T1(之前)和 T2(之后)。从这些,我们可以计算相对变换 T,这样(假设列向量约定):

T2 = T * T1
 T = T2 * T1^-1

然后,我们要找到这个相对变换的中心。插入变换变量,我们得到:

    / kx2   0   x2 \   / kx1   0   x1 \^-1
T = |  0   ky2  y2 | * |  0   ky1  y1 |
    \  0    0    1 /   \  0    0    1 /

    / kx2   0   x2 \   / 1/kx1   0    -x1/kx1 \
  = |  0   ky2  y2 | * |   0   1/ky1  -y1/ky1 |
    \  0    0    1 /   \   0     0       1    /

    / kx2/kx1     0      -kx2 * x1 / kx1 + x2 \
  = |    0     ky2/ky1   -ky2 * y1 / ky1 + y2 |
    \    0        0                1          /

现在中心c就是这个变换的固定点。 IE。 T * c = c。换句话说就是特征值1对应的特征向量,就是:

 c = / (-kx2 * x1 + kx1 * x2) / (kx1 - kx2) \
     \ (-ky2 * y1 + ky1 * y2) / (ky1 - ky2) /