Среда программирования:
Embarcadero Delphi XE
Статья по теме:
При запуске программы на форме строится фрактал Дерево Пифагора.
Алгоритм:
1) Строим вертикальный отрезок
2) Из верхнего конца этого отрезка рекурсивно строим еще 2 отрезка под определенными углами
3) Вызываем функцию построения двух последующих отрезков для каждой ветви дерева
Код программы:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,OpenGL; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure SetDCPixelFormat (hdc: HDC); procedure FormPaint(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure fun(x,y,l,a:real); var Form1: TForm1; hrc: HGLRC; DC:HDC; n,m:real; max,color:integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin DC:=GetDC(Handle); SetDCPixelFormat(DC); hrc:= wglCreateContext(DC); wglMakeCurrent(DC, hrc); max:=1; n:=2; //углы поворота m:=8; end; procedure TForm1.SetDCPixelFormat (hdc: HDC); 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); begin glClearColor(0.0,0.0,0.0,1.0); glClear (GL_COLOR_BUFFER_BIT); glLineWidth(1); glColor3f(1,0,0); fun(0, 200, 200, Pi/2); // Вызываем рекурсивную функцию построения фрактала glRotatef(45,0,0,1); SwapBuffers(DC); wglMakeCurrent (0, 0); end; procedure fun(x,y,l,a:real); begin if L>max then // условие конца рекурсии begin L:=L*0.7; glBegin(GL_LINE_STRIP); glVertex2f(x/300,y/300); // просчет координат линий glVertex2f((x+L*cos(a))/300,(y-L*sin(a))/300); glEnd; x:=x+L*cos(a); // просчет координат следующих точек y:=y-L*sin(a); fun(x,y,L,a+Pi/n); // рекурсия fun(x,y,L,a-Pi/m); end; end; end.
Прикрепленный файл | Размер |
---|---|
Демонстрационный пример Дерево Пифагора | 375.87 кб |