фрактал "Дракон Хартера — Хейтуэя"

Dragon

Построить фрактал "Дракон Хартера — Хейтуэя".

Алгоритм:
1) Берем произвольно заданную прямую и делим ее пополам.
2) Потом сгибаем ее так, чтобы полученный угол равнялся 90 градусам.
3) Для полученных отрезков выполняем пункты 1)-2) до тех пор, пока указанный счетчик не станет равен нулю.
4) Как только счетчик станет равен нулю, рекурсивно строим драконью кривую.

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure PaintBox1Click(Sender: TObject);
    procedure Paint(x1,y1,x2,y2,k:Longint);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{ TForm1 }
 
// рекурсивная функция рисования кривой
procedure TForm1.Paint(x1,y1,x2,y2,k:Longint);
  var tx,ty:Longint;
  begin
 
  PaintBox1.Canvas.Pen.Color:=clBlue;  // задаем цвет кривой
 
   if k=0 then
    begin
     PaintBox1.Canvas.MoveTo(x1,y1);
     PaintBox1.Canvas.LineTo(x2,y2);
     Exit;
    end;
// формулы вычисления координат точки, находящейся на середине отрезка и удаленной от прямой на такое расстояние,
// чтобы при соединении этой точки с концами отрезка получился угол в 90 градусов 
   tx := (x1+x2) div 2 + (y2-y1) div 2;
   ty := (y1+y2) div 2 - (x2-x1) div 2;
// рекурсивный вызов функций, соединяющих концы отрезка с данной точкой 
   Paint(x2,y2,tx,ty,k-1);
   Paint(x1,y1,tx,ty,k-1);
  end;
 
procedure TForm1.PaintBox1Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var x1,y1,x2,y2,k: Integer;
begin
 
 PaintBox1.Width := 800;
 PaintBox1.Height:= 800;
 
 PaintBox1.Canvas.Brush.Color := clWhite;
 PaintBox1.Canvas.Rectangle(0,0,PaintBox1.width,PaintBox1.height);
 
// задаем начальные значения для прямой и ставим счетчик в 24
 
     x1 := 200;
     y1 := 200;
     x2 := 500;
     y2 := 500;
     k  := 24;
 
     Paint(x1,y1,x2,y2,k);
 
end;
 
initialization
  {$I unit1.lrs}
 
end.

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