IMI docs

Trace: nhibernate wpf zoom

Csharp:zoom

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

TransformationMatrix = TransformationMatrix
                * Matrix.CreateTranslation(-_lastMousePosition.X, -_lastMousePosition.Y, 0)
                * Matrix.CreateScale((e.Delta > 0) ? 0.9f : (1f / 0.9f))
                * 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);