Множество Мандельброта

Множество Мандельброта

Построить фрактал "Множество Мандельброта".

Множество Мандельброта — это фрактал, определённый как множество точек С на комплексной плоскости, для которых итеративная последовательность

z_0 = 0
z_{n+1} = {z_n}^2 + c

не уходит на бесконечность.

Алгоритм:
1) Определяем размеры фрактала
2) Проверяем условия и вычисляем коэффициент перевода в декартову систему
3) Перебирая точки по х, Приводим х к координатам декарта
4) Аналогично для у
5) Исходная точка считается принадлежащей множеству Мандельброта, если она никогда не удаляется от начала координат на какое-то критическое число. Для отображения можно подсчитать скорость удаления от центра, если например точка ушла за критическое расстояние, и в зависимости от нее окрасить исходную точку в соответствующие цвет.

unit main;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Button2: TButton;
procedure Button2Click(Sender: TObject);
 
    private
    public
    end;
var
  Form1: TForm1;
implementation
 
{$R *.DFM}
 
procedure TForm1.Button2Click(Sender: TObject);
var
cc: integer;
tgx, tgy, rX1, rY1: extended;
x, y, l, n:integer;
c_real, c_img, x1, X2,Y1,Y2: Double;
xx, zm, zr, zi: Double;
begin
  n:=300;
  L:=10;
 
  x1:=-2.4;
  x2:=0.8;
  y1:=-1.2;
  y2:=1.2;
 
//проверяем условия и вычисляем коэффициент перевода в декартову систему
if x1<0 then   begin if x2>0 then tgx:=abs(x1)+abs(x2); end;
if x1<0 then   begin  if x2<0 then tgx:=abs(x1)-abs(x2); end;
if x1>0 then   begin if x2>0 then tgx:=x2-x1; end;
if y1<0 then   begin if y2>0 then tgy:=abs(y1)+abs(y2); end;
if y1<0 then   begin if y2<0 then tgy:=abs(y1)-abs(y2); end;
if y1>0 then   begin if y2>0 then tgy:=y2-y1; end;
 
begin
 screen.Cursor:=crHourGlass; //Установка курсора в песочные часы
 for x:=0 to  image1.Width do //Перебераем точки по х
   begin
    rX1:=X1+(tgx / image1.Width)*x; //Приводим х к координатам декарта
    for y:=0 to  image1.Height  do //Перебераем точки по у
        begin
          rY1:=Y1+(tgy / Image1.Height)*y; //Приводим у к координатам декарта
          zr:=0;
          zi:=0;
          zm:=0;
          for cc:=0 to n do
            begin
              xx:=zr;
              zr:=sqr(xx)-sqr(zi)+ rX1;
              zi:=2*xx*zi+rY1;
              zm:=sqr(zr)+sqr(zi);
              if zm>L then break;
            end;
          //Цвет
          if zm<L then image1.Canvas.Pixels[x,y]:=clblack else image1.Canvas.Pixels[x,y]:=rgb(cc*5,cc*9,cc*15);
 
        end;
     end;
screen.cursor:=crDefault;
end;
end;
end.

Ключевые слова: 
фрактал, Множество Мандельброта
ВложениеРазмер
2.rar164.63 кб