지금까지 저자가 접한 프랙탈의 종류는 주로 다음과 같습니다.
1.클리포드와 유사한 프랙탈. 이 프랙탈의 특징은 프랙탈의 초기 좌표가 (0,0)이라는 것입니다. 초기 좌표를 통해 많은 반복을 거친 후 일련의 점을 얻고, 얻은 점을 기준으로 프랙탈 곡선을 그립니다. 이러한 유형의 프랙탈은 매개변수가 제한되어 있으며 매우 간단하게 구현할 수 있습니다.
2. IFS 고사리 같은 프랙탈. 이 프랙탈에는 이전 프랙탈보다 더 많은 매개변수가 있습니다. IFS fern 프랙탈의 매개변수 목록에 P 값이 있다는 점은 주목할 가치가 있습니다. 이 값은 이 값이 쓸모가 없을 경우 각 매개변수 세트가 나타날 확률을 나타냅니다. 원하는 그래픽을 얻을 수 없습니다.
3. 만델브로트 같은 프랙탈. 이 프랙탈에는 복소수 및 시간 탈출 알고리즘에 대한 지식이 포함됩니다. 기본적으로는 복소평면에 있는 일련의 점들의 집합입니다. 타임 이스케이프 알고리즘을 사용하여 해당 점이 집합 내에 있는지 확인하고, 일련의 점을 구하고, 이러한 점을 기반으로 그래픽을 그립니다.
4. L-시스템 스틱과 같은 프랙탈. 이러한 유형의 프랙탈은 상위 문자열과 진화 규칙을 정의하고, 다른 상위 문자열과 진화 규칙이 도달한 지점을 통해 그래픽을 그려야 합니다. 진화 규칙과 부모 문자열을 이해하는 것은 어렵지 않습니다. 주된 이유는 좌표 간 변환을 계산하기 어렵기 때문입니다.
다음은 Mandelbrot Fractal에 대한 코드입니다.
/** * 复数类 * @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); } } } }
위 내용은 만델브로트 프랙탈에 대한 예제 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!