У меня есть набор Мандельброта, который я хочу увеличить. Мандельброт рассчитывается вокруг центральной координаты, размера Мандельброта и уровня масштабирования. Оригинальный Мандельброт сосредоточен вокруг
действительный = -0,6 и им = 0,4 с размером 2 в реальном и им.
Я хочу иметь возможность щелкнуть точку на изображении и рассчитать новую, увеличенную вокруг этой точки.
Окно, содержащее его, имеет размер 800x800px, поэтому я подумал, что клик в правом нижнем углу будет равен реальному центру = 0,4 и im = -0,6, а клик в верхнем левом углу будет реальным = -1,6, а im = 1.4
Я рассчитал это с:
для реальных ценностей
800a + b = 0,4 => a = 0,0025
0a + b = -1,6 => b = -1,6
для мнимых значений
800c + d = -0,6 => c = -0,0025
0c + d = 1.4 => d = 1.4
Однако, это не работает, если я продолжу с размером Мандельброта 2 и уровнем масштабирования 2. Я что-то упускаю из-за координат с уровнями масштабирования?
У меня были похожие проблемы с увеличением моего C # Mandelbrot. Мое решение состояло в том, чтобы вычислить разницу от позиции щелчка до центра в процентах, умножить это на максимальное количество единиц (ширина / масштаб * 0,5, ширина = высота, масштаб = n * 100) от центра и добавить это к вашему текущему значение. Так что мой код был такой (при условии, что я получаю sx
а также sy
как параметры из клика):
double[] o = new double[2];
double digressLRUD = width / zoom * 0.5; //max way up or down from the center in coordinates
double shiftCenterCursor_X = sx - width/2.0; //shift of cursor to center
double shiftCenterCursor_X_percentage = shiftCenterCursor_X / width/2.0; //shift in percentage
o[0] = x + digressLRUD * shiftCenterCursor_X_percentage; //new position
double shiftCenterCursor_Y = sy - width/2.0;
double shiftCenterCursor_Y_percentage = shiftCenterCursor_Y / width/2.0;
o[1] = y - digressLRUD * shiftCenterCursor_Y_percentage;
Это работает, но вам придется обновить масштаб (я использую его для умножения на 2).
Другой момент — переместить выбранный центр в центр изображения. Я сделал это с помощью некоторых расчетов:
double maxRe = width / zoom;
double centerRe = reC - maxRe * 0.5;
double maxIm = height / zoom;
double centerIm = -imC - maxIm * 0.5;
Это принесет вам координаты, которые вы должны передать свой алгоритм, так что он будет отображать выбранное место.
Других решений пока нет …