Среда программирования:
Lazarus
Статья по теме:
Для прорисовки фрактала следует нажать кнопку "Fractal"
В функцию Draw_Star передаем следующие параметры:
x, y - центр первого построенного пятиугольника
r - радиус окружности, описанной вокруг пятиугольника
angle - угол поворота
d - количество уровней
Код программы:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { TForm1 } TForm1 = class(TForm) Fractal: TButton; PaintBox1: TPaintBox; procedure FractalClick(Sender: TObject); procedure Draw_Star(x, y, r, angle: Real; d: Integer); procedure Draw_Pentagon(x, y, r, angle: Real); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } //отработка кнопки построения procedure TForm1.FractalClick(Sender: TObject); begin Draw_Star(300, 250, 85, pi/2, 4); //вызов функции прорисовки "Звезды Дюрера" end; procedure TForm1.Draw_Star(x, y, r, angle: Real; d: Integer); //рекурсивная функция прорисовки "Звезды Дюрера" var i: Integer; h: Real; begin h := 2*r*cos(pi/5); //расстояние от центра пятиугольника до каждого центра внешних пятиугольников for i := 0 to 4 do begin Draw_Pentagon(x - h*cos(angle+i*pi*2/5), y - h*sin(angle+i*pi*2/5), r, angle + pi + i*pi*2/5); if d > 0 then Draw_Star(x - h*cos(angle+i*pi*2/5), y - h*sin(angle+i*pi*2/5), r/(2*cos(pi/5)+1), angle+pi+(2*i+1)*pi*2/10, d-1); end; Draw_Pentagon(x, y, r, angle); if d > 0 then Draw_Star(x, y, r/(2*cos(pi/5)+1), angle+pi, d-1); end; procedure TForm1.Draw_Pentagon(x, y, r, angle: Real); //функция прорисовки каждого пятиугольника в отдельности var i: Integer; x1, y1: array [0..5] of Real; begin for i := 0 to 5 do begin x1[i] := r*cos(angle + i*pi*2/5); y1[i] := r*sin(angle + i*pi*2/5); end; for i := 0 to 4 do begin PaintBox1.Canvas.Brush.Color := clBlack; PaintBox1.Canvas.Line(Round(x + x1[i]), Round(y + y1[i]), Round(x + x1[i+1]), Round(y + y1[i+1])); end; end; end.
Прикрепленный файл | Размер |
---|---|
Фрактал Дюрера на Паскале | 854.27 кб |