
Среда программирования:
eclipse
Статья по теме:
Построение множества Мандельброта
Алгоритм построения множества Мандельброта основан на итеративном выражении:
Z[k + 1] = Z[k]*Z[k]+ C,
где Z[k] и C – комплексные переменные, k – номер итерации, k = 1, 2, .;
Z[0]= 0.
Любое комплексное число Z можно представить в виде:
Z = x+ y*i, где x и y это действительные числа, i – мнимая единица. Цвет точки на экране определяется например количеством итераций, за которые точка убегает на бесконечность. Для построения же облака Мандельброта мы не будем определять цвет текущей точки , а будем отмечать её траекторию, то есть последовательность точек z, f(z), f(f(z))..., где f(z)=z2+C
Код программы:
import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class Main { private static final double SX = 0.008; // Чем больше значение тем больше точки похожи на плоскость private static final double SY = 0.008; private static final int WIDTH = 640; // размер ширины private static final int HEIGHT = 480; <em>// размер высоты</em> private static final double DX = -350; // для центровки внутри фрейма private static final double DY = -235; // для центровки внутри фрейма private static final int COUNT_ITER = 500; // число итераций, чем больше число - тем больше точек private static final int BAIL_OUT = 16; private static final int STEP_X = 10; private static final int STEP_Y = 10; private static void drawFractals(Graphics g) { g.setColor(Color.BLACK); // устанавливаем цвет черный g.fillRect(0, 0, WIDTH, HEIGHT); // рисуем этим цветом весь фрейм for (int i = 0; i < WIDTH; i += STEP_X) { for (int j = 0; j < HEIGHT; j += STEP_Y) { double c = SX * (i + DX); // центрируем по X double d = SY * (j + DY); // центрируем по Y double x = c; // ось х double y = d; // ось y double t; int k = 0; g.setColor(new Color((float)Math.random(), <em>// при каждой итерации цикла получаем новый цвет</em> (float)Math.random(), (float)Math.random())); while (x * x + y * y < BAIL_OUT && k < COUNT_ITER) { // алгоритм t = x * x - y * y + c; y = 2 * x * y + d; x = t; g.drawOval((int) (x / SX - DX), (int) (y / SY - DY), 1, 1); ++k; } } }
Прикрепленный файл | Размер |
---|---|
MClouds.zip | 158.65 кб |