Среда программирования:
Borland Delphi 7.0
Статья по теме:
Алгоритм:
1) Берем произвольно заданную прямую и делим ее пополам.
2) Потом сгибаем ее так, чтобы полученный угол равнялся 90 градусам.
3) Для полученных отрезков выполняем пункты 1)-2) до тех пор, пока указанный счетчик не станет равен нулю.
4) Как только счетчик станет равен нулю, рекурсивно строим драконову кривую.
Код программы:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OpenGL; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure SetDCPixelFormat (hdc: HDC); procedure Draw(x1,y1,x2,y2,depth:double); private { Private declarations } hrc: HGLRC; DC:HDC; time : Integer; public { Public declarations } end; var Form1: TForm1; implementation uses Math; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin DC:=GetDC(Handle); SetDCPixelFormat(DC); hrc:= wglCreateContext(DC); wglMakeCurrent(DC, hrc); end; procedure TForm1.SetDCPixelFormat (hdc: HDC); // формат пикселя(инициализация OpenGL) var pfd: TPixelFormatDescriptor; nPixelFormat: Integer; begin FillChar (pfd, SizeOf (pfd), 0); nPixelFormat:= ChoosePixelFormat (hdc, @pfd); SetPixelFormat (hdc, nPixelFormat, @pfd); end; procedure TForm1.FormPaint(Sender: TObject); var x1,y1,x2,y2,depth,tx,ty:double; i:integer; begin x1:=-0.5; y1:=0; x2:=0.5; y2:=0; // координыты фрактала depth:=20; // степень фрактала glClearColor(1,1,1,1); // задаем цвет фона glClear (GL_COLOR_BUFFER_BIT); glLineWidth(2); // задаем ширину линии Draw(x1,y1,x2,y2,depth); // вызываем рекурсивную процедуру просчета и отрисовки фрактала SwapBuffers(DC); wglMakeCurrent (0, 0); end; procedure TForm1.Draw(x1,y1,x2,y2,depth:double); var tx,ty:double; begin if depth=0 then begin glBegin(GL_LINES); // рисуем линии по заданным координатам glcolor3f(random,x1,y1); // цвет зависит от координаты glVertex2f (x1, y1); glVertex2f (x2, y2); glEnd; Exit; end; tx:=(x1+x2) / 2+(y2-y1) / 2; // просчет новой точки ty:=(y1+y2) / 2-(x2-x1) / 2; Draw(x2,y2,tx,ty,depth-1); // рекурсивный вызов функции фрактала с понижением степени Draw(x1,y1,tx,ty,depth-1); end; end.
Прикрепленный файл | Размер |
---|---|
frac.rar | 6.07 кб |
Project1.rar | 154 кб |