Логин:     Забыли пароль?
 
Пароль:   Регистрация

Форум / Программирование - дерево пифагора(классическое)  

дерево пифагора(классическое)

ROR13
ROR13
Посетитель
Сообщения: 3
[Сообщение #1] 23 апреля 2011, 15:19
есть задание, частью которого является реализация дерева пифагора... обнаженное дерево написал... а вот с классическим проблема мб кто поможет?
вот собственно код простого дерева, а вот как бы из него сделать обобщённое (обдуваемое)?
собственно дерево
[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 день ломаю голову... не то чтобы совсем безрезультатно но результат явно ложен...

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #2] 23 апреля 2011, 19:31
А чо такое "дерево Пифагора"? Я только про яблоню Ньютона слышал, а про ДП на 33-м году жизни читаю 1-й раз.

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
IlluminatI
IlluminatI
2-ой класс
Сообщения: 38
[Сообщение #3] 23 апреля 2011, 23:54
min@y™: Твоя любимая фраза: "а погуглить?" :-) http://ru.wikipedia.org/wiki/Дерево_Пифагора

ROR13
ROR13
Посетитель
Сообщения: 3
[Сообщение #4] 24 апреля 2011, 01:23
пока пришел с работы кинули ссылку уже...
если вам интересно поковыряться я распишу что к чему в куске кода... он работает но надо заставить его нарисовать вот так 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
но там сквозной пример + куча ненужных массивов и переменных с ничего мне не говорящими именами в которых я и утонул...

ROR13
ROR13
Посетитель
Сообщения: 3
[Сообщение #5] 29 апреля 2011, 16:10
ну в общем написал...
вот для истории:
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.


Всего сообщений: 5 (сейчас показаны: с 1 по 5)

Перейти в раздел:


 © 2004 - 2017, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.03 сек.
Обратная связь  
Рейтинг@Mail.ru Majordomo.ru - надёжный хостинг