Лучшим подходом, вероятно, является использование матрицы преобразования для масштабирования изображения и определения точки на масштабированном изображении, над которой находится ваша мышь, чтобы вы могли выполнять преобразование на основе этой точки.
Я знаю, что вы работаете в C, но я создал пример в js, потому что он позволяет мне проще демонстрировать рабочий код.Нажмите на изображение и используйте Z и X для увеличения и уменьшения.https://jsfiddle.net/7ekqg8cb/
Большая часть кода реализует умножение матриц, инверсию матриц и преобразование точек матриц.Важная часть:
var scaledMouse = transformPoint(mouse);
matrixMultiplication([1, 0, scaledMouse.x,
0, 1, scaledMouse.y,
0, 0, 1]);
var scale = 1.2;
if (direction) {
matrixMultiplication([scale, 0, 0,
0, scale, 0,
0, 0, 1]);
}
else {
matrixMultiplication([1/scale, 0, 0,
0, 1/scale, 0,
0, 0, 1]);
}
matrixMultiplication([1, 0, -scaledMouse.x,
0, 1, -scaledMouse.y,
0, 0, 1]);
transformPoint использует обратную матрицу преобразования, чтобы узнать, где находится мышь относительно преобразованного изображения.Затем матрица преобразования переводится, масштабируется и переводится обратно, чтобы масштабировать матрицу преобразования вокруг этой точки.