70 votes

Comment programmer une fractale?

Je n'ai aucune expérience avec la programmation des fractales. Offcours j'ai vu le fameux Mandelbrot images et ces.

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

Langage de programmation n'importe pas vraiment, mais je suis plus familier avec actionscript, c#, java.

Je sais que si je google fractales, je reçois beaucoup de (compliquée) de l'information. Mais je voudrais commencer avec un algorithme simple et de jouer avec elle.

Des Suggestions pour améliorer l'algorithme de base sont également les bienvenus, comme la façon de faire dans ces belles couleurs et ces.

Merci!

53voto

abelenky Points 28063

La programmation de la Mandelbrot est facile.
Mon quick-n-sale code est ci-dessous (il n'est pas garanti être exempt de bogues, mais un bon aperçu).

Voici les grandes lignes: La Mandelbrot-ensemble se trouve dans le Complexe de la grille complètement à l'intérieur d'un cercle de rayon 2.

Donc, commencer par la numérisation de chaque point dans cette zone rectangulaire. Chaque point représente un nombre Complexe (x + yi). Itérer que nombre complexe:

[new value] = [old-value]^2 + [original-value] tout en gardant la trace de deux choses l'une:

1.) le nombre d'itérations

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

Si vous atteignez le nombre Maximum d'itérations, vous avez terminé. Si la distance de l'origine est plus grand que 2, vous avez terminé.

Quand c'est fait, la couleur du pixel d'origine en fonction du nombre d'itérations de la boucle que vous avez fait. Ensuite, passez à la prochaine pixel.

    public void MBrot()
    {
        float epsilon = 0.0001; // The step size across the X and Y axis
        float x;
        float y;
        int maxIterations = 10; // increasing this will give you a more detailed fractal
        int maxColors = 256; // Change as appropriate for your display.

        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, maxColors % iterations); // depending on the number of iterations, color a pixel.
            }
        }
    }

Certains détails de la gauche sont les suivants:

1.) Apprendre exactement ce que le Carré d'un nombre Complexe est et comment le calculer.

2.) Comprendre comment traduire le (-2,2) zone rectangulaire de l'écran des coordonnées.

26voto

Federico A. Ramponi Points 23106

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

L'idée derrière cela est relativement simple. Vous commencez avec une fonction de variable complexe

f(z) = z^2 + C

où z est un complexe de variable et C est un complexe constante. Maintenant à vous de le parcourir à partir de z = 0, c'est à dire vous calculer z1 = f(0), z2 = f(z1), z3 = f(z2) et ainsi de suite. L'ensemble de ces constantes C pour lesquels la séquence z1, z2, z3, ... est bornée, c'est à dire qu'il ne va pas à l'infini, est l'ensemble de Mandelbrot (l'ensemble noir dans la figure sur la page de Wikipedia).

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

  • Choisissez un rectangle dans le plan complexe (par exemple, à partir du point -2-2i au point 2+2i).
  • Couvrir le rectangle à l'aide d'une grille rectangulaire de points (par exemple, 400x400 points), qui sera associé à pixels sur votre écran.
  • Pour chaque point/pixel, laissez-C en ce point, de calculer, de, disons, 20 termes correspondants de l'itéré séquence z1, z2, z3, ... et vérifier si elle est "à l'infini". Dans la pratique, vous pouvez vérifier, lors de l'itération, si la valeur absolue de l'un des 20 termes est supérieure à 2 (si l'une des conditions n', les conditions de la garantie illimitée). Si certains z_k n', la séquence "à l'infini"; sinon, vous pouvez le considérer comme délimitée.
  • Si la séquence correspondant à un certain point, C est borné, de dessiner le pixel correspondant sur l'image en noir (pour elle appartient à l'ensemble de Mandelbrot). Sinon, dessinez-en une autre couleur. Si vous voulez avoir du plaisir et de produire assez de parcelles, de dessiner dans des couleurs différentes en fonction de l'ampleur de l'abs(20e terme).

Le fait d'étonnantes sur les fractales est la façon dont nous pouvons obtenir extrêmement complexe (en particulier, la frontière de l'ensemble de Mandelbrot) facile et apparemment anodins exigences.

Profitez-en!

9voto

luser droog Points 9030

Si les nombres complexes vous donner un mal de tête, il ya un large éventail de fractales qui peut être formulée à l'aide d'un L-système. Cela nécessite un couple de couches en interaction, mais chacun est intéressant dans son propre droit.

D'abord vous avez besoin d'une tortue. Avant, Arrière, Gauche, Droite, Stylo, Stylo-bas. Il y a beaucoup de formes amusantes à faire avec de la tortue des graphiques à l'aide de la tortue de la géométrie, même sans un L-système de conduite. Recherche pour "logos" ou "Tortue graphique". Plein LOGO système est en fait un Lisp environnement de programmation à l'aide d'un sans parenthèse Cambridge polonais de la syntaxe. Mais vous n'avez pas à aller près que, loin d'obtenir quelques jolies images à l'aide de la tortue concept.

Ensuite, vous avez besoin d'une couche d'exécuter un L-system. Les L-systems sont liées à la Post-systèmes et Semi-Thue systèmes, et comme les virus tel, ils chevauchent la frontière de Turing Complet. Le concept de chaîne de réécriture. Elle peut être implémentée comme une macro-expansion ou une procédure avec des contrôles supplémentaires lié à la récursivité. Si à l'aide de macro-expansion (comme dans l'exemple ci-dessous), vous aurez toujours besoin d'une procédure pour des symboles de la carte à la tortue de commandes et la procédure d'itérer à travers la chaîne de caractères ou un tableau pour exécuter l'encodage de la tortue programme. Pour bornée-la récursivité de la procédure établie (par exemple.), vous intégrez la tortue commandes dans les procédures et ajouter la récursivité contrôles au niveau de chaque procédure ou facteur à une fonction de gestionnaire.

Voici un exemple de Pythagore Arbre en postscript à l'aide de macro-expansion et une très abrégée ensemble de la tortue des commandes. Pour quelques exemples en python et mathematica, voir mon code défi de golf.

ps l-system pythagoras tree luser-droog

8voto

Greg Hewgill Points 356191

Il y a un grand livre intitulé Chaos et Fractales qui a exemple simple de code à la fin de chaque chapitre qui met en œuvre certaines fractales ou d'autres exemple. Il y A longtemps quand j'ai lu ce livre, je me suis converti chaque exemple de programme (de Base dialecte) dans une applet Java qui s'exécute sur une page web. Les applets sont ici: http://hewgill.com/chaos-and-fractals/

L'un des échantillons est une simple mise en œuvre de Mandelbrot.

6voto

Paxinum Points 1010

Le triangle de Sierpinski et la courbe de Koch sont des types spéciaux de flammes fractales. Des flammes fractales sont un très généralisée type de Iterated function system, puisqu'il utilise des fonctions non linéaires.

Un algorithme pour IFS:es sont comme suit:

Start with a random point.

Répétez la suite de nombreuses fois (un million au moins, selon la taille de l'image finale):

Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.

Si le point est en dehors de l'écran, choisissez au hasard un nouveau à l'intérieur de l'écran à la place.

Si vous voulez de belles couleurs, laissez la couleur dépend de la dernière utilisation de la transformation.

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: