Увеличение и перемещение изображения по координатам
Проблема выставить конкретную координату на картине по центру окна приложения.
Есть такой простенький код:
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", но как я только не пробовал считать, всегда данные выдавали огромную погрешность и чем ближе изображение увеличивается тем больше погрешность и точка уезжает за край экрана. Возможно я что-то не так считаю.
