79 votes

Comment programmer un fractal?

Je n'ai aucune expérience en programmation de fractales. Bien sûr, j'ai déjà vu les célèbres images de Mandelbrot et autres.

Pouvez-vous me fournir des algorithmes simples pour les fractales.

Le langage de programmation n'est pas vraiment important, mais je suis plus familier avec actionscript, C#, Java.

Je sais que si je cherche des fractales sur Google, je trouverai beaucoup d'informations (compliquées) mais j'aimerais commencer avec un algorithme simple et m'amuser avec.

Les suggestions pour améliorer l'algorithme de base sont également les bienvenues, comme comment les rendre dans ces belles couleurs, etc.

6 votes

En fonction des réponses à cette question, j'ai créé un gist sur GitHub avec un mandelbrot animé en javascript utilisant l'élément canvas. gist.github.com/1853604

61voto

abelenky Points 28063

La programmation du Mandelbrot est facile.
Mon code rapide et peu soigné est ci-dessous (pas garanti sans bug, mais un bon aperçu).

Voici l'aperçu : L'ensemble de Mandelbrot se trouve dans la grille complexe entièrement à l'intérieur d'un cercle de rayon 2.

Alors, commencez par balayer chaque point de cette zone rectangulaire. Chaque point représente un nombre complexe (x + yi). Itérer ce nombre complexe :

[nouvelle valeur] = [ancienne valeur]^2 + [valeur d'origine] tout en suivant deux choses :

1.) le nombre d'itérations

2.) la distance de [nouvelle valeur] de l'origine.

Si vous atteignez le nombre maximum d'itérations, vous avez terminé. Si la distance de l'origine est supérieure à 2, vous avez terminé.

Une fois terminé, coloriez le pixel d'origine en fonction du nombre d'itérations effectuées. Puis passez au pixel suivant.

public void MBrot()
{
    float epsilon = 0.0001; // La taille du pas à travers les axes X et Y
    float x;
    float y;
    int maxIterations = 10; // augmenter cela vous donnera un fractal plus détaillé
    int maxColors = 256; // Changez selon votre affichage.

    Complex Z;
    Complex C;
    int iterations;
    for(x=-2; x<=2; x+= epsilon)
    {
        for(y=-2; y<=2; y+= epsilon)
        {
            iterations = 0;
            C = new Complex(x, y);
            Z = new Complex(0,0);
            while(Complex.Abs(Z) < 2 && iterations < maxIterations)
            {
                Z = Z*Z + C;
                iterations++;
            }
            Screen.Plot(x,y, iterations % maxColors); //en fonction du nombre d'itérations, colorez un pixel
        }
    }
}

Certains détails ont été omis :

1.) Apprenez exactement ce qu'est le carré d'un nombre complexe et comment le calculer.

2.) Découvrez comment traduire la région rectangulaire (-2,2) en coordonnées à l'écran.

29voto

Federico A. Ramponi Points 23106

Vous devriez en effet commencer par l'ensemble de Mandelbrot, et comprendre ce qu'il est vraiment.

L’idée qui se cache derrière est relativement simple. Vous commencez avec une fonction de variable complexe

f(z) = z2 + C

où z est un variable complexe et C est une constante complexe. Maintenant vous itérez en commençant à z = 0, c'est-à-dire que vous calculez z1 = f(0), z2 = f(z1), z3 = f(z2) et ainsi de suite. L'ensemble de ces constantes C pour lesquelles la séquence z1, z2, z3, ... est bornée, c'est-à-dire ne tend pas vers l'infini, est l'ensemble de Mandelbrot (l'ensemble noir sur la figure de la page Wikipedia).

En pratique, pour dessiner l'ensemble de Mandelbrot vous devriez :

  • Choisir un rectangle dans le plan complexe (disons, du point -2-2i au point 2+2i).
  • Couvrir le rectangle avec une grille rectangulaire de points adaptée (disons, 400x400 points), qui seront transformés en pixels sur votre écran.
  • Pour chaque point/pixel, laissez C être ce point, calculez, disons, 20 termes de la séquence itérée correspondante z1, z2, z3, ... et vérifiez s'il "tend vers l'infini". En pratique, vous pouvez vérifier, pendant l'itération, si la valeur absolue de l'un des 20 termes est supérieure à 2 (si l'un des termes l'est, les termes suivants sont garantis d'être non-bornés). Si un z_k fait, la séquence "tend vers l’infini"; sinon, vous pouvez considérer qu'elle est bornée.
  • Si la séquence correspondant à un certain point C est bornée, dessinez le pixel correspondant sur l'image en noir (car il appartient à l'ensemble de Mandelbrot). Sinon, dessinez-le dans une autre couleur. Si vous voulez vous amuser et produire de jolis graphiques, dessinez-le dans des couleurs différentes en fonction de la grandeur de abs(20ème terme).

Le fait stupéfiant à propos des fractales est comment nous pouvons obtenir un ensemble extrêmement complexe (en particulier, le frontière de l'ensemble de Mandelbrot) à partir d'exigences simples et apparemment innocentes.

Amusez-vous bien!

10voto

luser droog Points 9030

Si les nombres complexes vous donnent mal à la tête, il existe une large gamme de fractales qui peuvent être formulées à l'aide d'un L-system. Cela nécessite quelques couches interactives, mais chacune est intéressante à sa manière.

Tout d'abord, vous avez besoin d'une tortue. Avancer, Reculer, Gauche, Droite, Stylo en haut, Stylo en bas. Il y a beaucoup de formes amusantes à créer avec des graphiques de tortue en utilisant même la géométrie de la tortue sans même avoir besoin d'un L-system pour le piloter. Recherchez "graphiques LOGO" ou "graphiques Turtle". Un système LOGO complet est en fait un environnement de programmation Lisp utilisant une syntaxe polonaise de Cambridge non parenthésée. Mais vous n'avez pas besoin d'aller aussi loin pour obtenir de jolies images en utilisant le concept de la tortue.

Ensuite, vous avez besoin d'une couche pour exécuter un L-system. Les L-systemes sont liés aux systèmes de Post et aux systèmes de Semi-Thue, et comme des virus, ils franchissent la frontière de la complétude de Turing. Le concept est de réécriture de chaîne. Il peut être implémenté en tant qu'expansion de macro ou en tant qu'ensemble de procédures avec des contrôles supplémentaires pour limiter la récursion. Si vous utilisez une expansion de macro (comme dans l'exemple ci-dessous), vous aurez toujours besoin d'un ensemble de procédures pour mapper les symboles aux commandes de la tortue et une procédure pour itérer à travers la chaîne ou le tableau pour exécuter le programme de tortue encodé. Pour un ensemble de procédures à récursion limitée (par exemple.), vous embarquez les commandes de la tortue dans les procédures et ajoutez des vérifications de niveau de récursion à chaque procédure ou facteur pour le transférer à une fonction de gestion.

Voici un exemple d'Arbre de Pythagore en postscript utilisant l'expansion de macro et un ensemble très abrégé de commandes de tortue. Pour quelques exemples en python et mathematica, consultez mon défi de code golf.

ps l-system pythagoras tree luser-droog

0 votes

L'image a été créée en utilisant la technique décrite ici pour combiner un petit extrait de code avec une petite illustration.

8voto

Greg Hewgill Points 356191

Il existe un excellent livre appelé Chaos and Fractals qui contient des exemples de code simple à la fin de chaque chapitre qui mettent en œuvre un fractal ou un autre exemple. Il y a longtemps, quand j'ai lu ce livre, j'ai converti chaque programme exemple (dans un certain dialecte Basic) en un applet Java qui s'exécute sur une page web. Les applets se trouvent ici : http://hewgill.com/chaos-and-fractals/

Un des exemples est une implémentation simple du Mandelbrot.

6voto

Paxinum Points 1010

Le triangle de Sierpinski et la courbe de Koch sont des types spéciaux de fractales de flammes. Les fractales de flammes sont un type très généralisé de système de fonctions itérées, car elles utilisent des fonctions non linéaires.

Un algorithme pour les SIF :es est le suivant :

Commencez avec un point aléatoire.

Répétez ce qui suit de nombreuses fois (au moins un million, en fonction de la taille de l'image finale) :

Appliquez l'une des N transformations prédéfinies (transformations matricielles ou similaires) au point. Un exemple serait de multiplier chaque coordonnée par 0,5. Tracez le nouveau point sur l'écran.

Si le point est à l'extérieur de l'écran, choisissez aléatoirement un nouveau point à l'intérieur de l'écran à la place.

Si vous voulez de belles couleurs, laissez la couleur dépendre de la dernière transformation utilisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X