Conjunto de Mandelbrot




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Mandel_I
{
    public partial class Form1 : Form
    {
        static double currentmaxr = 0;
        static double currentminr = 0;
        static double currentmaxi = 0;
        static double currentmini = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap img = MandelbrotSet(pictureBox1, 2, -2, 2, -2);
            pictureBox1.Image = img;
        }

        static Bitmap MandelbrotSet(PictureBox pictureBox1, double maxr, double minr, double maxi, double mini)
        {
            currentmaxr = maxr;
            currentmaxi = maxi;
            currentminr = minr;
            currentmini = mini;
            Bitmap img = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            double zx = 0;
            double zy = 0;
            double cx = 0;
            double cy = 0;
            double xjump = ((maxr - minr) / Convert.ToDouble(img.Width));
            double yjump = ((maxi - mini) / Convert.ToDouble(img.Height));
            double tempzx = 0;
            int loopmax = 1000;
            int loopgo = 0;
            for (int x = 0; x < img.Width; x++)
            {
                cx = (xjump * x) - Math.Abs(minr);
                for (int y = 0; y < img.Height; y++)
                {
                    zx = 0;
                    zy = 0;
                    cy = (yjump * y) - Math.Abs(mini);
                    loopgo = 0;
                    while (zx * zx + zy * zy <= 4 && loopgo < loopmax)
                    {
                        loopgo++;
                        tempzx = zx;
                        zx = (zx * zx) - (zy * zy) + cx;
                        zy = (2 * tempzx * zy) + cy;
                    }
                    if (loopgo != loopmax)
                        img.SetPixel(x, y, Color.FromArgb(loopgo % 128 * 2, loopgo % 32 * 7, loopgo % 16 * 14));
                    else
                        img.SetPixel(x, y, Color.Black);

                }
            }
            return img;

        }
    }
}



Transcribo el articulo de A.K. Devdney, en el que se desarrolla el Conjunto de Mandelbrot, publicado en la revista de Investigación y Ciencia de Enero 1988,

Articulo original en PDF:

https://www.scientificamerican.com/media/inline/blog/File/Dewdney_Mandelbrot.pdf

EL OBJETO MAS COMPLEJO DE LA MATEMÁTICA

"El conjunto de Mandelbrot cavila en silente complejidad, en el centro de una vasta lámina bidimensional de números, llamada plano complejo. Cuando a estos números se les aplica reiteradamente una cierta operación, los situados en el exterior del conjunto huyen, despavoridos, hacia el infinito. Los números del interior permanecen en él, donde danzan y vagabundean de un lado a otro. En la proximidad de la frontera, erráticos vaivenes de minuciosa coreografía, señalan el comienzo de la inestabilidad. Acontece aquí una infinita regresión de minucioso detalle, que nos deja estupefactos por su variedad, su complejidad y su insólita belleza.

El conjunto recibe su nombre en honor de Benoit Mandelbrot, investigador numerario del Centro de Investigaciones Thomas J. Watson de la IBM en Yorktown Heights, Nueva York. A partir de sus trabajos con forma geométricas, Mandelbrot ha desarrollado un campo llamado geometría fractal, estudio matemático de formas que tienen dimensión fraccionaria. En particular, la frontera del conjunto de Mandelbrot es una fractal, aunque también es mucho mas.





Benoit Mandelbrot se concibe mejor como refugiado. Nació en Varsovia en 1924 en el seno de una familia judía lituana; su padre era vendedor ai por mayor de trajes, y su madre, dentista. Los Mandelbrot, atentos a la situación geopolítica, se trasladaron a París en 1936, atraídos parcialmente por la presencia en aquella ciudad del tío de Benoit, el matemático Szolen Mandelbrojt. Declarada la guerra, la familia se anticipó una vez más a los nazis. Abandonó sus bienes, salvo unas cuantas maletas, y se incorporó a la riada de fugitivos que atascó las carreteras del sur de París. Llegó, al fin a la ciudad de Tulle. Durante cierto tiempo, Benoit vivió como aprendiz de fabricante de herramientas, peligrosamente visible a causa de su estatura y su educación. Fue época de visiones y miedos inolvidables; pero, mas tarde, recordó escasas penalidades personales, y rememoró en cambio, su amistad en Tulle y otros lugares con profesores, algunos de ellos eruditos distinguidos, también desplazados por la contienda. En conjunto, su formación fue irregular y entrecortada. Afirmó después que jamas había aprendido el alfabeto, ni, lo que resultaba más singular, la tabla de multiplicar más allá del cinco.

Merced a un programa relativamente sencillo, un ordenador puede convertirse en una especie de microscopio con el que observar la frontera del conjunto de Mandelbrot. En teoría, se puede escudriñar cualquier porción del conjunto, y hacerlo con tanta aproximación como se quiera. Desde la lejanía, el conjunto recuerda un odio gordezuelo, yacente sobre un costado y cubierto de verrugas. En el interior de la figura es de negrura siniestra; la envuelve un halo blanco azulado, como de arco eléctrico, que va dando paso a azules más profundos y a bandas negras, conforme nos adentramos en los dominios más exteriores del plano.

Al acercarnos al conjunto de Mandelbrot, descubrimos que cada verruga es una diminuta figura de forma muy similar a la del conjunto paterno. Sin embargo, al hacer Zoom con nuestro microscopio, para observar con más detalle estas diminutas figurillas, se abre ante nosotros un motivo de muy diferente diseño: una lujuriante orgía de zarcillos y voluta de aspecto orgánico, que se abren es espiras y verticilos y en hileras. Al amplificar un voluta se nos revela todavía una nueva escena: la voluta está formada por pares de verticilos entrelazados por puentes de filigrana. La ampliación del puente muestra otras dos espiras que brotan de su centro. En el centro de este centro, por así decirlo, se encuentra un puente cuádruple con cuatro volutas más, y en el centro de éstas, otra versión del conjunto de Mandelbrot.

Mas la versión amplificada no es del todo igual al conjunto de Mandelbrot. Al seguir amplificando parecen ir reapareciendo objetos similares, en los que una inspección minuciosa revela siempre nuevas diferencias. La situación prosigue indefinidamente, siempre igual, siempre infinitamente diferente y sobrecogedoramente encantadora.

Mandelbrot descubrió que, al paso de la escala de medición se hace más pequeña, la longitud medida de un litoral aumenta sin límite: Las bahías y penínsulas revelan subbahías y subpeninsulas más minúsculas, al menos hasta la escala atómica, en la que el proceso se acaba por fin. Quizá.

La dimensión fractal representa el medio de ponderar cualidades que, de otra suerte, carecerían de definición clara, como el grado de escabrosidad, discontinuidad o irregularidad de un objeto. Una costa serpenteante, por ejemplo, pese a su en cuanto a la longitud, posee cierto grado escabrosidad. Mandelbrot especificó modos de calcular la dimensión fraccional de los objetos reales, dada una técnica para construir una figura o dados algunos datos, y permitió que su geometría reclamase ciertos presupuestos sobre las pautas irregulares que había estudiado en la naturaleza. Un presupuesto era que el grado de irregularidad permanece constante a diferentes escalas. Esta pretensión acostumbra ser sorprendentemente afinada. Una y mil veces, el mundo exhibe irregularidad regular.

Mandelbrot dio con el adjetivo Fractus, derivado del verbo Frangere, -romper-. La resonancia de los principales vocablos ingleses afines -Fracture, -fractura-, y fraction, -fracción- se le antojó idónea. Y creó la palabra Fractal (sustantivo y adjetivo).

"Un fractal es una manera de ver lo infinito con el ojo de la mente".

La mente no puede visualizar la interminable auto inclusión de la complejidad. Sin embargo, para quien dispone de la capacidad de pensar sobre la forma como un geómetra, este género de repetición de la estructura, a escala de tenuidad creciente, abre un mundo entero. Mandelbrot caracterizó la dimensión fraccional con ayuda de técnicas de matemáticos del principio de este siglo, que habían sido olvidadas. Y la imaginación era lo único que avanzaba en la contemplación de un universo de detalles progresivamente más sutiles.

Fractal significa, sobre todo Autosemejante. La autosemejanza quiere decir simetría dentro de una escala. Implica recurrencia, pauta en el interior de pauta.

El vocablo fractal denota un procedimiento de descripción, cálculo y pensamiento sobre las figuras irregulares y fragmentadas, dentadas y descoyuntadas, figuras que van desde las lineas cristalinas de los copos de nieve al polvo discontinuo de las galaxias. Una curva fractal implica una estructura organizadora oculta en la detestable complicación de esas formas.

Cabe ahora describir el proceso iterativo que engendra al conjunto de Mandelbrot. Se parte de la expresión Z^2+C, donde Z es número complejo que puede tomar distintos valores (una variable), y C es un cierto número complejo fijo. Hagamos, inicialmente, que Z sea igual al número complejo 0. El cuadrado de Z es entonces 0, y el resultado de sumarle C a Z^2 es, sencillamente, C. Ahora sustituyamos por el valor así obtenido la Z de la expresión Z^2+C.

La nueva suma es C^ 2+ C. Volvamos a sustituir la Z por este valor. La suma siguiente es (C^2+C)^2+C. Prosigamos con este proceso, tomando siempre el resultado del último cálculo como valor inicial para el nuevo.

Cuando el proceso de iteración prosigue, en este caso concreto, indefinidamente, los números complejos resultantes van, haciéndose progresivamente mayores.

Dado que los números complejos se corresponden con puntos del plano complejo, podemos aplicar aquí la noción de distancia. El tamaño de un número complejo, o como se le llama en matemáticas, su módulo, es sencillamente su distancia al número complejo 0. Tal distancia es la longitud de la hipotenusa de un triángulo rectángulo, cuyos catetos son las partes real e imaginaria del número complejo. Así pues, para hallar el tamaño, o módulo, del número, se elevan al cuadrado sus partes real e imaginaria, se suman estos cuadrados y se extrae la raíz cuadrada de esta suma.

Cuando los números complejos, merced al proceso iterativo que acabo de describir, alcanzan un cierto tamaño, crecen después muy rápidamente; tanto así, que tras unas cuantas iteraciones más, rebasan la capacidad de cualquier ordenador. Entonces podemos despreciar todos los números que tienden al infinito. El conjunto de Mandelbrot es el conjunto de todos los números complejos C para los cuales el tamaño de Z^2+C permanece acotado, esto es, sus infinitas iteraciones pueden quedar todas encerradas en un circulo.

Un posible desarrollo del programa:

Comenzamos con la preparación de una matriz bidimensional llamada IMAGEN, necesaria para almacenar y conservar las imágenes en ella. Los elementos de esta tabla son elementos individuales de la imagen a mostrar, llamados píxeles, dispuestos en formación rectangular. Por ejemplo 640x480 etc. Cuando mayor se la matriz más grande sera la espera, aunque también mayor la resolución y detalles de las imágenes.

A fin de examinar cualquier porción del plano complejo. Se especifica el ángulo inferior izquierdo del recuadro a estudiar dando el número complejo que le corresponde. Dos de las variables del programa, AVERTICE y BVERTICE, permiten proporcionar, respectivamente, las partes real e imaginaria del número. La longitud de cada uno de los lados del recuadro se especifica mediante variables LADO.

La segunda parte del programa sirve para ajustar la matriz IMAGEN a fin de adaptarla al recuadro que interese; para ello se calcula el valor de una variable llamada VANO. VANO es la distancia que, dentro del cuadrado, media entre dos píxeles adyacentes. Para calcular el valor de VANO se divide LADO entre el número de filas y de columnas de que conste IMAGEN.

El alma del programa es su tercera parte. Se hace en ella la búsqueda de los números complejos C que componen el conjunto de Mandelbrot, y se asignan colores a los números que se encuentren, en un sentido especial, próximos. El procedimiento tiene que determinarse una vez por cada elemento de imagen, o píxel, y, por consiguiente, la matriz de 640 por 480 exige 307.200 cómputos independientes. Supongamos que el programa se encuentra actualmente trabajando en la fila M y la columna N. La tercera parte se descompone en cuatro pasos:

1.- Calcular un número complejo C que se supone que representa al pixel: súmese NxVAMO al valor de AVERTICE, a fin de calcular la parte real de C, que será denotada AC; súmese MxVANO a BVERTICE, para hallar la parte imaginaria de BC de C. No es necesario que I intervenga en el programa.

2.-Asignar a una variable compleja Z (cuyas partes real e imaginaria son, respectivamente AZ y BZ) el valor 0 + 0I. Asignar a una variable entera llamada RECUENTO el valor 0.

3.-Efectuar repetidamente los tres paso siguientes hasta que, o bien el módulo de Z sea mayor que 2, o hasta que la variable RECUENTO rebase el valor 1000; lo que antes se produzca:




                                       Z < Z ^ 2 + C
                                       RECUENTO <---- RECUENTO + 1
                                       MODULO <------ MODULO de Z


A que se debe la gran importancia del número 2. Muy sencillo un resultado inmediato de la teoría de las iteraciones de transformaciones complejas permite asegurar que las iteraciones de Z divergen hacia el infinito si , y solamente si, en alguna de las etapas del proceso iterativo, Z llega a tener módulos mayor o igual que 2. Resulta que una elevada proporción de puntos, cuyo destino final es el infinito rebasan ya en unas cuantas iteraciones la cota 2. Conforme aumenta la variable RECUENTO, los parientes más lentos de aquellos van haciéndose progresivamente más raros.

4- Asignación de un color a IMANGEN (M,N), en función del valor alcanzado por RECUENTO al finalizar el paso 3. Presentación en la pantalla del píxel correspondiente. Obsérvese que el color de un píxel tan sólo es función de uno de los números de su diminuto dominio, a saber, el situado en su vértice noreste; el comportamiento de ese número representa entonces el comportamiento del píxel entero. El plan de asignación de colores exige agrupar en subgamas el intervalo de valores que RECUENTO haya alcanzado en la matriz; a cada subgama se le asigna entonces un único color. Aquellos píxeles cuyas correspondientes Z rebasen la cota 2 en unas pocas iteraciones se colorearán de rojo. Aquellos otros cuyas Z no lleguen al módulo 2, sino tras relativamente muchas iteraciones, se tiñen de violeta, que es el otro extremo del espectro cromático. Y los píxeles para los cuales el módulo de Z se conserva inferior a 2, aún después de 1000 iteraciones, se consideraran pertenecientes al conjunto de Mandelbrot. y deben colorearse de negro.

Es prudente dejar sin especificar los colores en tanto no se haya determinado el intervalo de valores que tomará RECUENTO en el «recuadro que se esté estudiando. Cuando este intervalo sea estrecho, puede repartirse en él la totalidad de los colores del espectro. Así pues como sugerencia en el paso 4 solamente se asigna a cada elemento de la matriz IMAGEN el valor correspondiente de RECUENTO.

Un programa independiente puede encargarse después de inspeccionar la matriz, determinar los valores mínimo y máximo que en ella alcanza RECUENTO y luego distribuir el espectro de colores de conformidad con los valores obtenidos. Quien haya llegado hasta aquí podrá sin lugar a dudas idear planteamientos viables.

Quien no tenga un monitor de color puede hacerlo igualmente en blanco y negro. Aquellos números complejos para los cuales el módulo de Z llegue a ser mayor de 2 antes de R iteraciones se colorean de blanco; los restantes de negro. El valor R puede ajustarse a voluntad. Para no tener que esperar noches enteras los resultados del programa, la matriz puede hacerse de pongamos por caso de 100 filas por 100 columnas, y reducir el número de iteraciones de 1000 a 100.

La potencia de ampliación de un ordenador personal dependen en gran medida de su microprocesador y de su capacidad para tratar el tamaño efectivo de los números que la maquina sea capaz de manipular. Un 8088 esta diseñado para manipular datos de 16 bits, utilizando la doble precisión permite aumentar la longitud de cada número hasta 32 bits, con esta doble precisión pueden lograrse ampliaciones del orden de 30.000 aumentos. Con una programación adecuada, inspirada en la idea de ensartar en una larga ristra estos números, la precisión numérica puede ser de cientos de dígitos significativos. La amplificación del conjunto de Mandelbrot teóricamente alcanzable con tales precisiones es mucho mayor que la necesaria para resolver en partículas el núcleo atómico.

Otro posible desarrollo del programa:

No perdamos de vista la función:  Z <-------- Z^2 + C

Z y C son números complejos compuestos por su parte real y parte imaginaria. Por medio de la multiplicación y adición de números complejos, respectivamente, se eleva al cuadrado Z y se le suma la constante C. La formula cobra vida al iterarla, esto es, al aplicarla repetidamente utilizando cada vez el valor recién obtenido de Z para calcular el siguiente. La correspondiente sucesión de números complejos queda plasmada en un extraño vaivén sobre el plano complejo. En cada iteración, el número complejo recién obtenido se encuentra a cierta distancia de su predecesor. En el proceso de cómputo del conjunto de Mandelbrot, la distancia desempeña un papel crítico.


                                              N <------0
                                              mientras N < 100 y MAG(Z) < 2
                                                          Z <----------Z^2 + C
                                                          N <----------N + 1
                                               colorear el punto estudiado.

El algoritmo concede a Z un máximo de 100 iteraciones para que llegue a 2. Dado que existe un número relativamente pequeño de posibles evadidos que no logran alcanzar la magnitud 2 en 100 iteraciones, el discriminante no es exacto al 100 por ciento. Evidentemente, se podrían conceder 1000 iteraciones, obteniéndose una imagen un poco más precisa, pero tal proceder resulta muy lento.

La magnitud (valor absoluto, o módulo) de un número complejo A+Bi es sencillamente la raíz cuadrada de A^2+B^2, esto es, la distancia que lo separa del complejo 0.

En el algoritmo anterior tenemos un contador N que asoma a vida con valor 0. En el bucle "mientras" que controla el proceso de iteración, el contador N se incrementa en una unidad por cada iteración. El bucle "mientras" prosigue dando vuelvas al manubrio de la fórmula fundamental en tanto N no alcance el valor 100 y la magnitud de Z se mantenga por debajo de 2. En cuanto deje de cumplirse alguna de las dos condiciones, el algoritmo sale del bucle. La asignación de colores queda al tanto de cada uno.

Evidentemente, el color utilizado habrá de ser alguna función sencilla de N, que mide la lentitud con que Z escapó o fracasó en su intento de evasión. Hay que tener igualmente presente que el punto a dibujar debe venir dado en un par de coordenadas de pantalla que serán ciertamente diferentes de las coordenadas del número complejo que se represente allí.

El programa habrá de contener una sección independiente destinada al cómputo de la magnitud de Z, denotada MAG(Z) en el algoritmo precedente. Casi ningún lenguaje de programación a excepción del lenguaje C es capaz de el manejo de números complejos directamente. Sera preciso conservar Z en dos partes, a las que podemos llamar X (la parte real) e Y (la parte imaginaria); el valor C puede recibir idéntico tratamiento y expresarse por ejemplo, A y B. El siguiente algoritmo ya se aproximaría más a un programa susceptible de ejecución:

                                   N <----------- 0
                                   mientras N < 100 y X^2 + Y^2 < 4
                                         XX <--------- X^2-Y^2+A
                                           Y < ---------- 2XY + B
                                           X < ---------- XX
                                           N < ---------- N + 1
                                           coloréese el punto estudiado.


Ya se habra percatado de un pequeño truco introducido en esta variante del proceso fundamental; en lugar de comparar la raíz cuadrada de la cantidad X^2+Y^2 con 2, el algoritmo compara directamente con 4. Aunque el resultado es el mismo, se evita así la continua invocación de la función raíz cuadrada, que es de ejecución lenta. La variable XX alberga el valor de X en tanto se obtiene el nuevo valor de Y. De este modo, el valor viejo de X queda a salvo para el cáculo de la nueva Y. Finalmente, se asigna a X el valor provisionalmente guardado en XX.

Un último desarrollo del programa:

De la unión de los dos programas anteriores podría resultar:

                                         VANO <--------- LADO/1OO
                                         A <-------------- AVERTICE

                                         desde J <--------1 hasta 100
                                                  A<------------ A+VANO
                                                  B<------------ BVERTICE
                                                  desde K <-------- 1 hasta 100
                                                            B<--------- B+VANO
                                                            X <-------- 0
                                                            Y <-------- 0
                                                  [algoritmo fundamental]

El algoritmo básico queda arropado en el interior de un bucle que, sistemáticamente, modifica el número complejo C en lugar de sus partes real e imaginaria. Si la imagen ha de tener (pongamos por caso) 100 por 100 pixeles (elementos de imagen), debería disponerse un bucle doble como el anterior.
Antes de atacar el anterior grupo de instrucciones el programa permite al usuario introducir el número complejo que ha de aposentarse en uno de los vértices del cuadrado que interese. Tal punto tiene las coordenadas AVERTICE y BVERTICE, que son los valores mínimos que tomarán A y B en el cuadrado. Este cuadrado cuya especificación también corre a cargo de cada uno. Viene a ser una ventana a través de la cual podamos curiosear. Podemos hacerla, muy pequeña, lo cual tendría por efecto la ampliación de toda la pantalla de la porción microscópica del conjunto sobre la que hayamos abierto nuestra ventana. El programa tiene pues, que pedirnos que le demos un valor para el lado, la anchura que tendrá la imagen sobre el plano complejo. El algoritmo calcula entonces el VANO de separación que media entre números complejos sucesivos a dar a A y B los incrementos adecuados.

Los valores de los índices J y K no intervienen en ninguno de los cálculos que figuran en el bucle doble, por lo que se dispone de libertad para modificarlos y darles forma más útil. Por ejemplo en lugar de hacer que J y K recorran los valores de 1 a 100, podrían recorrer cada uno 100 valores consecutivos de coordenadas de pantalla. Cuando el algoritmo básico ha decidido qué color debe asignarse a la iteración de Z, se colorea de ese tono la cuadrícula de coordenadas (J,K).

En lugar de comparar con 2 la magnitud de la iteración Z, hágase con 100 o incluso con 1000. Después de todo, cuando la magnitud rebasa el valor 2, aumenta muy rápidamente, y alcanza los valores mencionados en unas pocas iteraciones más.


Tanto este articulo como el siguiente programa corresponde a la especie de revista que publicamos entre mi hermano y yo en los años 80/90 que se llamaba Discovery the Chaos. Estaba hecha a base de fotocopias encuadernadas.



SCREEN 12

DEFDBL A-Z

A% = 640 'Resolucion Horizontal
B% = 480 'Resolucion Vertical
M% = 200 'Numero de interaciones por punto

PMIN = -2.25 ' Plano complejo
PMAX = 0.75 'Plano complejo
QMIN = -1.5 'Plano complejo
QMAX = 1.5 'Plano complejo
CMAX% = 10000 'Nivel de detalle

DP = (PMAX - PMIN) / (A% - 1)
DQ = (QMAX - QMIN) / (B% - 1)
FOR NP% = 0 TO A% - 1
          FOR NQ% = 0 TO B% - 1
                    P = PMIN + NP% * DP
                    Q = QMIN + NQ% * DQ
                    K% = 0
                    X = 0
                    Y = 0
                    610 '
                    XN = (X * X) - (Y * Y) + P
                    Y = 2 * X * Y + Q
                    X = XN
                    K% = K% + 1
                    IF (X * X) + (Y * Y) > M% THEN C% = K%: GOTO 690
                    IF K% = CMAX% THEN C% = 0: GOTO 690
                    680 GOTO 610
                    690 PSET (NP%, NQ%), C%
          NEXT NQ%
NEXT NP%

720 A$ = INKEY$: IF A$ = "" THEN 720







--------------------------------------------------------------------------------------------


1 IF x& = 0 THEN SCREEN 13 ELSE iter% = 0
2 x& = (x& + 123) MOD 64000
3 im2 = im * im
4 IF iter% THEN im = 2 * re * im + (CSNG(x& \ 320) / 100 - 1) ELSE im = 0
5 IF iter% THEN re = re * re - im2 + (CSNG(x& MOD 320) / 120 - 1.9) ELSE re = 0
6 iter% = iter% + 1
7 IF ABS(re) + ABS(im) > 2 OR iter% > 254 THEN PSET (x& MOD 320, x& \ 320), iter% ELSE GOTO 3
8 IF LEN(INKEY$) = 0 THEN GOTO 1




---------------------------------------------------------------------------------------------

SCREEN 13
WINDOW (-2, 1.5)-(2, -1.5)
FOR x0 = -2 TO 2 STEP .01
    FOR y0 = -1.5 TO 1.5 STEP .01
        x = 0
        y = 0

        iteration = 0
        maxIteration = 1000

        WHILE (x * x + y * y <= (2 * 2) AND iteration < maxIteration)
            xtemp = x * x - y * y + x0
            y = 2 * x * y + y0

            x = xtemp

            iteration = iteration + 1
        WEND

        IF iteration <> maxIteration THEN
            c = iteration
        ELSE
            c = 0
        END IF

        PSET (x0, y0), c + 32
    NEXT
NEXT






https://www.scientificamerican.com/media/inline/blog/File/Dewdney_Mandelbrot.pdf

https://guciek.github.io/web_mandelbrot.html#-0.5;0;2;1000

http://hirnsohle.de/test/fractalLab/

http://fract.al/

http://illuminations.nctm.org/activity.aspx?id=3513

https://sites.google.com/site/mandelbulber/home



No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.