Trace:
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
|
csharp:zoom [2020/05/06 15:15] superuser created |
csharp:zoom [2022/12/06 04:41] (current) superuser |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | # С использованием матриц | ||
| + | <code:csharp> | ||
| + | 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); | ||
| + | </code> | ||
| + | ---- | ||
| Для реализации зума по Х необходимо спроецировать его из координат окна в локальное адресное пространство сцены. | Для реализации зума по Х необходимо спроецировать его из координат окна в локальное адресное пространство сцены. | ||
| Line 4: | Line 12: | ||
| Если локальные координаты вычисляются так: | Если локальные координаты вычисляются так: | ||
| + | |||
| + | ---- | ||
| <code:csharp> | <code:csharp> | ||
| Line 11: | Line 21: | ||
| ,где | ,где | ||
| - | elementLocationX - позиция элемента | + | * elementLocationX - позиция элемента |
| + | * sceneOffsetX - смещение сцены | ||
| + | * zoom - увеличение | ||
| - | sceneOffsetX - смещение сцены | ||
| - | |||
| - | zoom - увеличение | ||
| + | ---- | ||
| то проекция вычисляется тупо обратным порядком операций. | то проекция вычисляется тупо обратным порядком операций. | ||
| Например, мы хотим зумировать в центр окна. | Например, мы хотим зумировать в центр окна. | ||
| + | |||
| + | ---- | ||
| <code:csharp> | <code:csharp> | ||
| var windowTargetX = (window.Width / 2); | var windowTargetX = (window.Width / 2); | ||
| </code> | </code> | ||
| + | |||
| + | ---- | ||
| тогда проекция в локальные координаты будет | тогда проекция в локальные координаты будет | ||
| + | |||
| + | ---- | ||
| <code:csharp> | <code:csharp> | ||
| Line 33: | Line 49: | ||
| , где | , где | ||
| - | oldZoom - текущий коефициент увеличения(до изменения) | + | |
| + | * oldZoom - текущий коефициент увеличения(до изменения) | ||
| + | |||
| + | ---- | ||
| Новое смещение вычесляется так: | Новое смещение вычесляется так: | ||
| + | |||
| + | ---- | ||
| + | |||
| <code:csharp> | <code:csharp> | ||
| var xoffset = (Cx + sceneOffsetX ) * oldZoom / newZoom-Cx; | var xoffset = (Cx + sceneOffsetX ) * oldZoom / newZoom-Cx; | ||
| Line 41: | Line 63: | ||
| , где | , где | ||
| + | |||
| newZoom - коефициент увеличения после изменения | newZoom - коефициент увеличения после изменения | ||
| + | ---- | ||
| + | подставив значения и сократив получаем: | ||
| + | ---- | ||
| + | <code:csharp> | ||
| + | var xoffset = windowTargetX / newZoom - (windowTargetX / oldZoom - oldXoffset); | ||
| + | </code> | ||
