Увеличение и перемещение изображения по координатам

Проблема выставить конкретную координату на картине по центру окна приложения.

Есть такой простенький код:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Define child Canvas elements
            var myCanvas1 = new Canvas();
            myCanvas1.Background = Brushes.Red;
            myCanvas1.Height = 5;
            myCanvas1.Width = 5;
            Canvas.SetTop(myCanvas1, 91);
            Canvas.SetLeft(myCanvas1, 310);

            Zoom.Children.Add(myCanvas1);

            this.MouseWheel += MainWindow_MouseWheel; ;
            Zoom.MouseLeftButtonDown += image_MouseLeftButtonDown;
            Zoom.MouseLeftButtonUp += Image_MouseLeftButtonUp;
            Zoom.MouseMove += image_MouseMove;
            Zoom.MouseRightButtonDown += Image_MouseRightButtonDown;

        }

        private void Image_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            
        }

        private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Zoom.ReleaseMouseCapture();
        }

        private Point origin;  // Original Offset of image
        private Point start;   // Original Position of the mouse

        private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (Zoom.IsMouseCaptured) return;
            Zoom.CaptureMouse();

            start = e.GetPosition(border);
            origin.X = Zoom.RenderTransform.Value.OffsetX;
            origin.Y = Zoom.RenderTransform.Value.OffsetY;
        }

        private void image_MouseMove(object sender, MouseEventArgs e)
        {
            if (!Zoom.IsMouseCaptured) return;
            Point p = e.MouseDevice.GetPosition(border);

            Matrix m = Zoom.RenderTransform.Value;
            m.OffsetX = origin.X + (p.X - start.X);
            m.OffsetY = origin.Y + (p.Y - start.Y);

            Zoom.RenderTransform = new MatrixTransform(m);
        }

        private void MainWindow_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
        {
            Point p = e.MouseDevice.GetPosition(Zoom);

            Matrix m = Zoom.RenderTransform.Value;
            if (e.Delta > 0)
                m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
            else
                m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);

            Zoom.RenderTransform = new MatrixTransform(m);
        }       

    }

и xaml

<Grid>
        <Grid>
            <Border x:Name="border" BorderBrush="SaddleBrown" BorderThickness="3"  HorizontalAlignment="Left" VerticalAlignment="Top">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <Canvas x:Name="Zoom" Grid.ColumnSpan="2" Width="500" Height="500" Grid.RowSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                        <Canvas.Background>
                            <ImageBrush ImageSource="1.jpg"/>
                        </Canvas.Background>
                    </Canvas>
                    
                    <Border BorderBrush="Black" BorderThickness="1" Grid.ColumnSpan="2" />
                    <Border BorderBrush="Black" BorderThickness="1" Grid.RowSpan="2" />
                    
                </Grid>

            </Border>
            
        </Grid>       

    </Grid>

Все работает хорошо, изображение увеличивается, перемещается и в целом отрабатывается корректно.

В данном случае у меня есть необходимость центрировать изображение по красной точке.

Картинка

Если не увеличивать изображение, тогда можно спокойно передать координаты и процентировать изображение. Но если изображение увеличивать изменяя масштаб, тогда появляются проблемы.

В общем, подскажите, как мне центрировать изображение по конкретным координатам на изображении, с учетом того, что изображение может увеличиваться.

Пробовал рассчитывать координаты с учетом данных, которые указаны в матрице "Determinant", "M11", "M22", но как я только не пробовал считать, всегда данные выдавали огромную погрешность и чем ближе изображение увеличивается тем больше погрешность и точка уезжает за край экрана. Возможно я что-то не так считаю.


Ответы (0 шт):