Среда программирования:
Lazarus
Статья по теме:
Одним из фракталов множества Мандельброта является «паук».
Рассматривается множество таких a, которые стремятся к бесконечности при итерировании вида:
z0=c0=a;
z'=z2+c;
c'=c/2+z';
Для построения фрактала будем использовать следующие формулы:
z.X=(z1.X)2-(z1.Y)2+c.X;
z.Y=2*z1.X*z1.Y+c.Y;
c.X=c1.X/2+z.X;
c.Y=c1.Y/2+z.Y;
Для прорисовки фрактала следует нажать кнопку "Fractal"
Код программы:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls; type { TForm1 } TForm1 =class(TForm) Fractal: TButton; PaintBox1: TPaintBox; procedure FractalClick(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.FractalClick(Sender: TObject); type TComplex = record X : Real; Y : Real; end; const iter = 50; max = 16; var z1, z2, c1, c2 : TComplex; x, y, n : Integer; Mx, My : Integer; col:TColor; begin PaintBox1.Canvas.Clear; //очищаем canvas Mx := PaintBox1.Canvas.Width div 2; //вычисляем центр (ширина) My := PaintBox1.Canvas.Height div 2; //вычисляем центр (высота) for y:=-My to My do for x:=-Mx to Mx do begin //устанавливаем начальные значения параметров n:=0; z1.X:=x*0.01; z1.Y:=y*0.01; c1.X:=z1.X; c1.Y:=z1.Y; while ((z1.X*z1.X+z1.Y*z1.Y)<max) and (n<iter) do begin z2:=z1; c2:=c1; z1.X:=(z2.X*z2.X)-(z2.Y*z2.Y)+c1.X; z1.Y:=2*z2.X*z2.Y+c1.Y; c1.X:=c2.X/2+z1.X; c1.Y:=c2.Y/2+z1.Y; n:=n+1; end; if (n<iter) //цвет выбираем по числу итераций then begin col :=30*n mod 255; PaintBox1.Canvas.Pixels[(Mx div 2)+x, (My div 2)+y]:=RGBToColor(0, col, col); end; end; end; end.
Прикрепленный файл | Размер |
---|---|
Spider_fractal.zip | 880.19 кб |