Построить фрактал "Дракон Хартера — Хейтуэя". Алгоритм: 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.
Ключевые слова:
фрактал, драконья кривая
|
|||||||