IMI docs

Trace: zoom

Csharp:zoom

This is an old revision of the document!


# С использованием матриц

TransformationMatrix *= Matrix.CreateTranslation(-_lastMousePosition.X, -_lastMousePosition.Y, 0);
            if (e.Delta > 0)
            {
                TransformationMatrix *= Matrix.CreateScale(0.9f);
            }
            else
            {
                TransformationMatrix *= Matrix.CreateScale(1f/0.9f);
            }
            TransformationMatrix *= Matrix.CreateTranslation(_lastMousePosition.X, _lastMousePosition.Y, 0);


Для реализации зума по Х необходимо спроецировать его из координат окна в локальное адресное пространство сцены.

Если локальные координаты вычисляются так:


var centerX = (elementLocationX + sceneOffsetX) * zoom;

,где

  • elementLocationX - позиция элемента
  • sceneOffsetX - смещение сцены
  • zoom - увеличение

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

Например, мы хотим зумировать в центр окна.


var windowTargetX = (window.Width / 2);


тогда проекция в локальные координаты будет


var Cx = windowTargetX / oldZoom - sceneOffsetX;

, где

  • oldZoom - текущий коефициент увеличения(до изменения)

Новое смещение вычесляется так:


var xoffset = (Cx  + sceneOffsetX ) * oldZoom / newZoom-Cx;

, где

newZoom - коефициент увеличения после изменения


подставив значения и сократив получаем:


var xoffset = windowTargetX / newZoom - (windowTargetX / oldZoom - oldXoffset);