From 70f73d00d1e907338b93e1d1dde1014cd9b6fd12 Mon Sep 17 00:00:00 2001 From: ti_mo Date: Tue, 21 Oct 2025 22:46:44 +0200 Subject: [PATCH] added zoom feature --- .../Views/MainWindow.axaml.cs | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/DelauneyTriangulation/Views/MainWindow.axaml.cs b/DelauneyTriangulation/Views/MainWindow.axaml.cs index 21883c3..463fffe 100644 --- a/DelauneyTriangulation/Views/MainWindow.axaml.cs +++ b/DelauneyTriangulation/Views/MainWindow.axaml.cs @@ -1,9 +1,13 @@ +using System; +using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Shapes; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Media; +using Avalonia.VisualTree; +using DelauneyTriangulation.ViewModels; namespace DelauneyTriangulation.Views; @@ -12,12 +16,24 @@ public partial class MainWindow : Window private bool _isPanning; private Point _panStart; private Vector _panOffset = new(); + + private double _scale = 1.0; + private const double MinScale = 0.2; + private const double MaxScale = 8.0; + private readonly TranslateTransform _panTransform = new(); + private readonly ScaleTransform _scaleTransform = new(); + private readonly TransformGroup _transformGroup = new(); public MainWindow() { InitializeComponent(); - SceneContent.RenderTransform = _panTransform; + + _transformGroup.Children.Add(_scaleTransform); + _transformGroup.Children.Add(_panTransform); + SceneContent.RenderTransform = _transformGroup; + + if (DataContext is MainWindowViewModel vm) vm.View = this; } private void OnTitleBarPointerPressed(object? sender, PointerPressedEventArgs e) @@ -64,6 +80,24 @@ public partial class MainWindow : Window private void Scene_OnWheel(object? sender, PointerWheelEventArgs e) { + var mouse = e.GetPosition(Scene); + + var oldScale = _scale; + var factor = Math.Pow(1.1, e.Delta.Y); + var newScale = Math.Clamp(oldScale * factor, MinScale, MaxScale); + var applied = newScale / oldScale; + + _scale = newScale; + _scaleTransform.ScaleX = _scaleTransform.ScaleY = _scale; + _panOffset = new Vector( + mouse.X - applied * (mouse.X - _panOffset.X), + mouse.Y - applied * (mouse.Y - _panOffset.Y) + ); + + _panTransform.X = _panOffset.X; + _panTransform.Y = _panOffset.Y; + + e.Handled = true; } } \ No newline at end of file