Как настроить панорамирование после масштабирования?

У меня есть представление, встроенное в React. В упрощенном виде он состоит из рабочей области, расположенной абсолютно по отношению к области просмотра. Окно просмотра имеет тот же размер, что и окно браузера. Обычно (но не всегда) рабочая область больше окна просмотра, как показано на рисунке ниже.

Пользователь может панорамировать рабочее пространство, открывая различные его области в окне просмотра. Панорамирование устанавливает отрицательное смещение рабочей области по отношению к области просмотра, выраженное в пикселях (PanX и PanY).

Рисунок 1. Масштаб рабочей области 1.

Пользователь также может увеличивать и уменьшать масштаб. Масштабирование выполняется с фиксированными шагами, в данном примере с коэффициентом 0,25, т. е. +0,25 для увеличения и -0,25 для уменьшения. Это влияет на масштаб, который, в свою очередь, влияет на размер рабочей области. На рисунке 2 ниже пользователь увеличил масштаб на один шаг (масштаб +0,25).

Рисунок 2: Масштаб рабочей области 1,25.

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

Что я хочу сделать, так это то, что центр области просмотра должен оставаться в центре после того, как пользователь увеличил или уменьшил масштаб. Для этого мне нужно настроить PanX и PanY, чтобы окно просмотра оставалось в центре той точки рабочей области, где оно было центрировано до масштабирования.

Рисунок 3: Рабочая область после масштабирования

Итак, мой вопрос: Как мне удерживать область просмотра в центре одной и той же точки в рабочей области при увеличении и уменьшении масштаба?

Вычисление должно привести к новым значениям, которые я могу установить для PanX и PanY для рабочей области, которая центрирует окно просмотра. Имейте в виду, что окно просмотра можно расположить где угодно, если ни одно из его краев не находится за пределами рабочей области (как на рисунке ниже).

Рисунок 4: область просмотра внутри рабочей области

Заранее спасибо!


person tkahn    schedule 17.10.2018    source источник


Ответы (1)


Если вы хотите, чтобы все, что находится в центре экрана, оставалось в центре экрана, определите:

const centerX = screen.width / 2;
const centerY = screen.height / 2;

Затем, когда вы масштабируете значение scale (например, 0,25 или -0,25), вам нужно настроить PanX и PanY:

PanX -= scale * centerX;
PanY -= scale * centerY;

Я написал руководство здесь, в котором используется SVG и немного другая система преобразования, но в основном это одно и то же.

person Peter Collingridge    schedule 19.10.2018