Форум Программирование дерево пифагора(классическое) |
|
есть задание, частью которого является реализация дерева пифагора... обнаженное дерево написал... а вот с классическим проблема мб кто поможет? вот собственно код простого дерева, а вот как бы из него сделать обобщённое (обдуваемое)? собственно дерево [CODE]//======================== procedure Draw(const Canvas : TCanvas; x, y, l, a, n: Real); procedure Rect(const Canvas : TCanvas; x1, y1, l: Integer; a1, n: Real); begin Canvas.MoveTo(x1, y1); Canvas.LineTo(x1 + Round(l * cos(a1)), y1 - Round(l * sin(a1))); Canvas.LineTo(x1 + Round(l * sqrt(2) * cos(a1 + pi/4)), y1 - Round(l * sqrt(2) * sin(a1 + pi/4))); Canvas.LineTo(x1 + Round(l * cos(a1 + pi/2)), y1 - Round(l * sin(a1 + pi/2))); Canvas.LineTo(x1, y1); end; begin if l > n then begin Rect(Canvas, Round(x), Round(y), Round(l), a, n); Draw(Canvas, x - l*sin(a), y - l * cos(a), l/sqrt(2), a + pi / 4 , n); Draw( Canvas, x - l * sin(a ) + l / sqrt(2) * cos(a + pi/4), y - l * cos(a ) - l / sqrt(2) * sin(a + pi/4), l / sqrt(2), a - pi/4, n); end; end; //===================[/CODE] а вот вызов [CODE]procedure TForm1.Button1Click(Sender: TObject); begin Draw(form1.Canvas, form1.Width div 2, form1.Height - 100, 200, 0, 4); //DrawBrn(form1.Canvas, 24, form1.Width div 2, form1.Height - 100, 200, 0, 0.86, 0.56); end;[/CODE] буду весьма благодарен если кто нибудь поможет... если уверены что в какой нибудь книге есть толковый пример алгоритма напишите название(язык примера неважен) зы: тут проблема с алгоритмом рисования... этот алгоритм содран и немного доработан... чтоб получилось обобщённое дерево надо сделать так чтоб углы были не по 45 градусов а скажем 30 и 60 вот тут то и загвоздка... 2 день ломаю голову... не то чтобы совсем безрезультатно но результат явно ложен... | ||||||
|
А чо такое "дерево Пифагора"? Я только про яблоню Ньютона слышал, а про ДП на 33-м году жизни читаю 1-й раз. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! | ||||||
|
min@y™: Твоя любимая фраза: "а погуглить?" http://ru.wikipedia.org/wiki/Дерево_Пифагора | ||||||
|
пока пришел с работы кинули ссылку уже... если вам интересно поковыряться я распишу что к чему в куске кода... он работает но надо заставить его нарисовать вот так http://upload.wikimedia.org/wikipedia/commons/e/e0/Pythagoras_tree_2.gif на данный момент он рисует вот это http://upload.wikimedia.org/wikipedia/commons/c/c9/Pythagoras_tree_1.gif казалось бы тривиально но нет метод научного тыка ничего не дал, изменение l то есть длинны по идее должно было коснуться и всего остального но не касается всего... у вот этого автора есть в книге(пример на с стр39) http://www.znaika.org/?q=principy-programmirovanija-v-mashinnoj-grafike но там сквозной пример + куча ненужных массивов и переменных с ничего мне не говорящими именами в которых я и утонул... | ||||||
|
ну в общем написал... вот для истории: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure square_and_triangle (const Canvas : TCanvas; n : integer; x0, y0, a, phi: real; delta:integer; flag: bool); var x, y, xx, yy: array [0..4] of real; cphi, sphi, c1, c2, b, c, alpha, calpha, salpha : real; i, deviation: integer; //* phi and alpha in radians */ begin if n=0 then Exit; if flag then deviation:=-delta else deviation:=delta; alpha:=(45+deviation)*pi/180.0; x[0]:=x0; x[3]:=x0; x[1]:=x0+a; x[2]:=x0+a; y[0]:=y0; y[1]:=y0; y[2]:=y0+a; y[3]:=y0+a; calpha:=cos(alpha); salpha:=sin(alpha); c:=a*calpha; b:=a*salpha; x[4]:=x[3]+c*calpha; y[4]:=y[3]+c*salpha; cphi:=-cos(phi); sphi:=-sin(phi); c1:=x0-x0*cphi+y0*sphi; c2:=y0-x0*sphi-y0*cphi; for i:=0 to 4 do begin xx[i]:=x[i]*cphi-y[i]*sphi+c1; yy[i]:=x[i]*sphi+y[i]*cphi+c2; end; Canvas.MoveTo(Round(xx[3]), Round(yy[3])); for i:=0 to 4 do begin Canvas.LineTo(Round(xx[i]), Round(yy[i])); end; Canvas.LineTo(Round(xx[2]), Round(yy[2])); square_and_triangle(Canvas, n-1, xx[3], yy[3], c, phi+alpha, delta, flag); square_and_triangle(Canvas, n-1, xx[4], yy[4], b, phi+alpha-0.5*pi, delta, flag); end; procedure TForm1.Button1Click(Sender: TObject); var n: integer; delta:integer; flag: bool; begin Form1.Repaint(); flag:=CheckBox1.Checked; //("Задайте угол delta в градусах @ < delta < 45)\\n"); delta:=12; //("Задайте глубину рекурсии n\\n"); n:=10 ; square_and_triangle(Form1.Canvas, n, Form1.Width div 2, Form1.Height-40, 100, 0.0, delta, flag); end; end. | ||||||
Перейти в раздел:
© 2004 - 2024, Delphi.int.ru |
Версия форума: 1.10 (19.01.2010) |
Выполнено за 0.03 сек. |