Elija un punto, cualquier punto y … bueno, apúntelo con un vector.
Recuerda donde estaba.
No voy a dibujar a escala aquí, sino que tomo el vector que tenía, duplique su ángulo y cuadre su longitud. Agregue el que comenzó al resultado.
Hazlo de nuevo, dobla el ángulo, cuadra la longitud y agrega el punto de partida.
…y otra vez…
A medida que continuamos haciendo esto, los resultados trazan una especie de espiral ligeramente doblada:
Aquí hay una pequeña lucha de poder, con cero e infinito tirando de nuestra espiral, ya que estamos cuadrando la longitud, las distancias más pequeñas que 1 saldrán más cortas que en el paso anterior y tirarán hacia el origen, mientras que las distancias más de 1 tienden a crecer hacia el infinito. Sin ninguna otra ceremonia, eso crearía una línea límite en el círculo del radio 1, donde los puntos internos pertenecen al origen y los puntos externos viajan al infinito y más allá.
Como seguimos agregando el punto de partida a cada paso, no es tan fácil predecir exactamente dónde terminará el proceso. Incluso si estamos momentáneamente dentro del círculo de la unidad, agregar el punto de partida puede llevarnos afuera, o puede traer un punto distante de regreso al interior, y quién sabe qué pasará después.
El conjunto de Mandelbrot consta de los puntos de partida que producen espirales en el origen cuando aplica este proceso a ellos. Dado que es difícil saber qué puntos lo hacen sin intentarlo, es mejor hacer que una computadora haga todos los cálculos. Usemos el lenguaje de programación Python para eso, tiene una notación ordenada para números complejos, y nuestro proceso pivot-stretch-and-add se simplifica al siguiente z = z * z + c cuando lo escribe con números complejos.
Primero, necesitaremos una sección 2D del avión, lo haré 640 por 480 puntos porque soy sentimental con respecto a las resoluciones de imagen:
matemáticas de importación
ancho = 640
altura = 480
imagen = [[[255 para c en rango (3)] para x en rango (ancho) para y en rango (altura)]
Luego, tenemos que lidiar con el hecho de que las coordenadas de la imagen son enteros, pero nuestros puntos interesantes se encuentran cerca del origen. Revisando la altura y el ancho de la imagen, traduzca las coordenadas y y x en números de coma flotante entre más y menos 1.25, y centre las coordenadas x ligeramente a la izquierda, porque la mitad derecha del avión no contiene mucho Mandelbrot fascinante acción:
para y en rango (altura):
imag = (y- (altura / 2)) / flotante (altura) * 2.5
para x en rango (ancho):
real = ((x- (ancho / 2)) / flotante (ancho) * 2.5) -0.5
Luego, necesitamos insertar el proceso de prueba para cada punto. He impuesto los límites arbitrarios que estamos satisfechos después de un máximo de 255 pasos (porque el formato de imagen proporciona 255 intensidades de color para diferenciar puntos), y esos puntos más allá de una distancia de 2.5 cuentan como perdidos hasta el infinito.
z = complejo (real, imag)
c = z
para i en rango (255):
z = z * z + c
if (abs (z)> 2.5):
imagen [y] [x] = [i, i, i]
descanso
La parte final es simplemente volcar el gráfico resultante en un archivo de imagen, que estará en formato PPM (de nuevo, porque es fácil).
Aquí está todo el programa en una sola pieza, por completo:
matemáticas de importación
ancho = 640
altura = 480
imagen = [[[255 para c en rango (3)] para x en rango (ancho)] para y en rango (altura)]
para y en rango (altura):
imag = (y- (altura / 2)) / flotante (altura) * 2.5
para x en rango (ancho):
real = ((x- (ancho / 2)) / flotante (ancho) * 2.5) -0.5
z = complejo (real, imag)
c = z
para i en rango (255):
z = z * z + c
if (abs (z)> 2.5):
imagen [y] [x] = [i, i, i]
descanso
salida = abierto ('mandelbrot_set.ppm', 'w')
output.write ("P6" + str (ancho) + "" + str (alto) + "255 \ n")
para y en rango (altura):
para x en rango (ancho):
output.write (bytearray (imagen [y] [x]))
output.close ()
Tarda un poco en ejecutarse, crea este gráfico en un archivo llamado “mandelbrot_set.ppm”,
y Bob es tu tío.