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