IMI docs

Trace:

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
csharp:zoom [2020/05/06 15:16]
superuser
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 34: Line 50:
 , где , где
  
-oldZoom - текущий коефициент увеличения(до изменения)+  * oldZoom - текущий коефициент увеличения(до изменения) 
 + 
 +----
  
 Новое смещение вычесляется так: Новое смещение вычесляется так:
 +
 +----
 +
 <​code:​csharp>​ <​code:​csharp>​
 var xoffset = (Cx  + sceneOffsetX ) * oldZoom / newZoom-Cx; var xoffset = (Cx  + sceneOffsetX ) * oldZoom / newZoom-Cx;
Line 45: Line 66:
 newZoom - коефициент увеличения после изменения newZoom - коефициент увеличения после изменения
  
 +----
  
 +подставив значения и сократив получаем:​
  
 +----
  
 +<​code:​csharp>​
 +var xoffset = windowTargetX / newZoom - (windowTargetX / oldZoom - oldXoffset);​
 +</​code>​