Maison  >  Article  >  Java  >  Exemple de code sur la fractale de Mandelbrot

Exemple de code sur la fractale de Mandelbrot

零下一度
零下一度original
2017-07-23 10:23:111321parcourir

Il existe principalement les types de fractales suivants avec lesquels l'auteur a été en contact jusqu'à présent :

1. Fractale similaire à Clifford. Les caractéristiques de cette fractale sont : les coordonnées initiales de la fractale sont (0,0). Après un grand nombre d'itérations à travers les coordonnées initiales, une série de points est obtenue et la courbe fractale est tracée en fonction des points obtenus. Ce type de fractale a des paramètres limités et peut être mis en œuvre très simplement.

2. Fractale comme la fougère IFS. Cette fractale a plus de paramètres que la précédente. Il convient de noter qu'il existe une valeur P dans la liste des paramètres de la fractale de fougère IFS. Cette valeur représente la probabilité que chaque ensemble de paramètres différents apparaisse si cette valeur est inutile. est impossible d'obtenir les graphismes souhaités.

3. Fractale comme Mandelbrot. Cette fractale implique la connaissance des nombres complexes et des algorithmes d’évasion temporelle. Essentiellement, il s'agit d'un ensemble d'une série de points sur le plan complexe. L'algorithme d'échappement temporel est utilisé pour déterminer si le point se trouve dans l'ensemble, et une série de points est obtenue et des graphiques sont dessinés sur la base de ces points.

4. Fractal comme les bâtons du système L. Ce type de fractale doit définir la chaîne parent et les règles d'évolution, et dessiner des graphiques à travers les points atteints par les différentes chaînes parent et règles d'évolution. Il n'est pas difficile de comprendre les règles d'évolution et les chaînes parentes. La raison principale est que la transformation entre les coordonnées est difficile à calculer.

Ce qui suit est un morceau de code sur la fractale de Mandelbrot.

/**
 * 复数类
 * @author CBS */public class Complex {    public double r;public double i;    public Complex(double real,double image){this.r=real;this.i=image;
    }//取复数的模public double modulus(){return Math.sqrt(r*r+i*i);
    }//复数的加法public Complex add(Complex z){double addr=r+z.r;double addi=i+z.i;return new Complex(addr,addi);
    }//复数的乘法public Complex mul(Complex z){double mulr=r*z.r-i*z.i;double muli=i*z.r+r*z.i;return new Complex(mulr,muli);
    }
}
// 求最大的迭代次数的算法,时间逃逸算法public int mand(Complex z, int maxIte) {
        Complex curComp = new Complex(0, 0);for (int i = 0; i < maxIte; i++) {if (curComp.modulus() > 2)return i;
            curComp = curComp.mul(curComp).add(z);
        }return maxIte;
    }
// 画图的算法public void drawMand(Complex z, double scale, int MaxIte) {double pixUnit = 3 / (1080 * scale);double startx = z.r - 1080 * pixUnit / 2;double starty = z.i - 720 * pixUnit / 2;for (int i = 0; i < 1080; i++) {for (int j = 0; j < 720; j++) {double x0 = startx + i * pixUnit;double y0 = starty + j * pixUnit;
                Complex curComplex = new Complex(x0, y0);int time = mand(curComplex, MaxIte);if (time == MaxIte) {double x = x0 * 150 + 500;// 扩大出现方格double y = y0 * 150 + 500;
                    g.drawLine((int) x, (int) y, (int) x, (int) y);
                }
            }
        }
    }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn