# С использованием матриц 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);