Найти центр масштаба (внутри области просмотра), учитывая два преобразования (центр увеличения) - PullRequest
0 голосов
/ 03 октября 2018

Проблема: объект масштабируется внутри моего окна просмотра.Я знаю масштаб, размер и положение до и после шкалы.Я не знаю центра расширения - это то, что я хочу найти.

Мои типы данных:

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

Таким образом, с учетом двух преобразований, описывающих размер и положение оригинала и масштабированноеобъект и размер области просмотра - как я могу узнать центр увеличения .. Например, если объект был масштабирован от положения мыши - как узнать, где была мышь во время масштабирования?

1 Ответ

0 голосов
/ 04 октября 2018

У нас есть преобразования 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 является точкой фиксации этого преобразования.Т.е. T * c = c.Другими словами, это собственный вектор, соответствующий собственному значению 1. И это:

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