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);
