Ключ к пониманию того, как это сделать, состоит в том, чтобы понять, что делает строка coords =
:
coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth))
Фактически, значения x
и y
, которые вы просматриваете, которые соответствуют координатам экранного пикселя, переводятся в соответствующую точку на рассматриваемой комплексной плоскости. Это означает, что экранная координата (0,0)
будет преобразована в верхнюю левую область, которая просматривается на (-2,1.25)
, и (1,0)
будет таким же, но сместится на 1/500 расстояния (при условии, что окно шириной 500 пикселей) между -2
и 0.5
x-координата.
Это именно то, что делает эта строка - я расширю только бит X-координаты с более иллюстративными именами переменных, чтобы указать это:
mandel_x = mandel_start_x + (screen_x / screen_width) * mandel_width
(переменные mandel_
относятся к координатам на комплексной плоскости, переменные screen_
относятся к экранным координатам отображаемого пикселя.)
Если вы хотите затем взять область экрана для увеличения, вы хотите сделать то же самое: взять экранные координаты верхней левой и нижней правой области, перевести их в координаты комплексной плоскости, и сделайте их новыми переменными uleft и lright. т.е. чтобы увеличить поле, ограниченное экранными координатами (x1, y1) .. (x2, y2), используйте:
new_uleft = (uleft[0] + (x1/size[0]) * (xwidth), uleft[1] - (y1/size[1]) * (ywidth))
new_lright = (uleft[0] + (x2/size[0]) * (xwidth), uleft[1] - (y2/size[1]) * (ywidth))
(Очевидно, вам потребуется пересчитать размер, xwidth, ywidth и другие зависимые переменные на основе новых координат)
Если вам интересно, математика, лежащая в основе множества Мандельброта, не так уж сложна (просто сложна).
Все, что он делает, это берет определенную координату, рассматривая ее как комплексное число, а затем многократно возводя в квадрат ее и добавляя к ней исходное число.
Для некоторых чисел выполнение этого приведет к тому, что результат будет расходиться, постоянно увеличиваясь до бесконечности при повторении процесса. Для других он всегда будет оставаться ниже определенного уровня (например, очевидно (0,0, 0,0) никогда не станет больше в этом процессе. Мандельброт (черная область) - это те координаты, которые не расходятся. Было показано, что если любое число выше квадратного корня из 5, оно будет расходиться - ваш код просто использует 2.0
в качестве его приближения к sqrt(5)
(~ 2.236
), но это не будет иметь большого значения.
Обычно области, которые расходятся, наносятся на график с количеством итераций процесса, который требуется им для того, чтобы превысить это значение (переменная trials
в вашем коде), то есть то, что создает цветные области.