Закрученный квадрат

spiral.jpg

Построить фрактал "Закрученный квадрат".

Спираль строиться из квадратов, начальная позиция "x,y". Квадрат постепенно уменьшается и закручивается, меняя свой координаты. Определяя диагональ квадрата и изменяя "l", мы уменьшаем квадрат. А изменяя "а" мы меняем угол наклона. С помощью "k" мы меняем цвет с черного на белый.

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, math;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure fract(x,y,a,l,k,a1:integer); //x,y: координаты начала каждой ветки, a: угол наклона, l: длина, k: номер ветвей, a1: изменение наклона при каждой новой ветке
var
p:integer;
begin
	p := a1;                                           // наклон в одну сторону
	if k mod 2 = 0 then                                // если номер ветки парное число
		p := -a1;                                  // наклон идет в другую сторону
	while l > 3 do                                     // пока длина ветки больше 3
	begin
	    with form1.Canvas do                           // работаем с канвасом формы
	    begin
		pen.Width := 6-k;                          // толщина ветки
		pen.Color := rgb(random(255),random(255),random(255)); // её цвет
		moveto(x,y);                               // координаты начала линии
		lineto(x+round(cos(degtorad(a))*l),y+round(sin(degtorad(a))*l)); // прорисовка линии 
		x := x+round(cos(degtorad(a))*l);          // конец предыдущей делаем началом новой линии 
		y := y+round(sin(degtorad(a))*l); 
		a := a + p;                                // изменяем угл
		l := round(l / 1.17);                      // уменьшаем длину
		fract(x,y,a-(p*2),round(l / 1.2),k+1,a1+1);// вызываем рекурсивно эту же процедуру для дальнейшей прорисовки
	    end;
	end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  fract(400,500,270,100,0,20);
end;
 
end.

Ключевые слова: 
фрактал, квадрат
ВложениеРазмер
spiral.zip195.74 кб