Как увеличить точку (математика за ней) - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над фрактальной графикой.Мне нужно иметь возможность увеличить конкретную точку.

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

scale_change = zoom * ((button == SCROLL_DOWN) ? ZOOM_INC : -ZOOM_INC);
zoom += scale_change;
center->x -= (mouse->x - (IMG_SIZE / 2)) * scale_change;
center->y -= (mouse->y - (IMG_SIZE / 2)) * scale_change;

Я предполагаю, что некоторая ее часть слишком упрощена?Есть какая-то переменная, которую я не учитываю? работает , если не двигать мышь.

1 Ответ

0 голосов
/ 24 февраля 2019

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

Я знаю, что вы работаете в 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 использует обратную матрицу преобразования, чтобы узнать, где находится мышь относительно преобразованного изображения.Затем матрица преобразования переводится, масштабируется и переводится обратно, чтобы масштабировать матрицу преобразования вокруг этой точки.

...