Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рекурсия с квадратом [D7]


Страницы:   1 2

DanilTraum ©   (2013-06-19 12:00:00) 

Всем доброго времени суток, нужно создать программу, которая, при нажатии на кнопку рисует квадрат, в нем четыре квадрата, в левом верхнем еще четыре и так далее до точки...
Сделать нужно с помощью рекурсии, очень нужна помощь!


Jeer   (2013-06-19 16:59:00) [1]

"И вот пошли корованы и стало возможным их грабить"

P.S.
Не обижайся, но копи-пасте - не самый лучший метод изучения и создания приложений.


DanilTraum   (2013-06-19 16:16:00) [2]

Image1.Repaint;
 Sleep(1000);
Получилось, спасибо!


DanilTraum   (2013-06-19 16:07:00) [3]

2. Зачем это надо?--- чтоб контралировать процесс создания квадратов
Пауза--- Sleep? попробуем...


[ВладОшин]   (2013-06-19 15:36:00) [4]

И так не ответили 2. Зачем это надо?

Можно ограничить глубину рекурсии, с помощью доп. переменной, например.
Тогда по клику будет рисовать до опред.уровня.

или же, если нужна наглядность - просто поставить паузу


DanilTraum   (2013-06-19 15:20:00) [5]

Да, логично...


[ВладОшин]   (2013-06-19 15:05:00) [6]


> ельзя сделать, чтоб при каждом нажатии кнопки рисовались квадраты постепенно ,а не все сразу....


1. А рекурсия? нужна или где? По определению рекурсии выход из нее возможен только после полного цикла отработки.

2. Зачем это надо?


DanilTraum   (2013-06-19 15:02:00) [7]

Спасибо огромное!)))
Как понимаю, нельзя сделать, чтоб при каждом нажатии кнопки(Button1.teg+1)
рисовались квадраты постепенно ,а не все сразу....


[ВладОшин]   (2013-06-19 14:47:00) [8]

type
 TForm1 = class(TForm)
   btn1: TButton;
   procedure btn1Click(Sender: TObject);
 private     { Private declarations }
 public      { Public declarations }
   procedure DrowSquares(A:Integer);
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
 DrowSquares(400);
end;

procedure TForm1.DrowSquares(A: Integer);
begin
 if A < 2 then
   Exit;
 Canvas.Rectangle(0,0,A,A);
 Canvas.Rectangle(A div 2,A div 2,A,A);
 A := A div 2;
 DrowSquares(A);
end;


DanilTraum   (2013-06-19 14:41:00) [9]

Конечно не мой, он для фрактального преобразования квадрата...
вот мой:
procedure Quad(x1, y1, x2, y2: Integer; Cv:TCanvas);
var
 xw, yw : Integer;
 begin

  Cv.Rectangle(x1, y1, x2, y2);
  xw:= (x2-x1) div 2;
  yw:= (y2-y1) div 2;
  Cv.rectangle(x1,y1,xw,yw);
  Cv.rectangle(xw,y1,x2,yw);
  Cv.rectangle(x1,yw,xw,y2);
  Cv.rectangle(xw,yw,x2,y2);
  if (xw>0) and (yw>0) then Quad(x1, y1, xw, yw, Cv);

 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 x1,y1,x2,y2:integer;
begin
  x1:=0;
  y1:=0;
  x2:=400;
  y2:=400;

  Quad(x1, y1, x2, y2, Image1.Canvas);
 
end;

end.


[ВладОшин]   (2013-06-19 14:37:00) [10]


> В процедуре 4 раза рисуется Rectangle,

хватит 2х, в симметричных относительно центра квадрантах


> DanilTraum  

Вы же вообще ничего не понимаете..
так не интересно..
Сомневаюсь, что и тот код - Ваш.


DanilTraum   (2013-06-19 14:28:00) [11]

Вполне достаточно *.Canvas.FrameRect(Rect:TRect);>>>
А это где прописать?
и что вместо * прописать?


DanilTraum   (2013-06-19 14:27:00) [12]

MBo ©   (19.06.13 14:16) [18]...

  Cv.Rectangle(x1, y1, x2, y2);
  xw:= (x2-x1) div 2;
  yw:= (y2-y1) div 2;
  Cv.rectangle(x1,y1,xw,yw);
  Cv.rectangle(xw,y1,x2,yw);
  Cv.rectangle(x1,yw,xw,y2);
  Cv.rectangle(xw,yw,x2,y2);
  if (xw>0) and (yw>0) then Quad(x1, y1, xw, yw, Cv);


MBo   (2013-06-19 14:16:00) [13]

Судя по условия, параметры процедуры могут быть:

(Canvas: TCanvas; X0, Y0, Size: Integer)
т.е. передается левый верхний угол и размер квадрата.

В процедуре 4 раза рисуется Rectangle, и, если Size > 1, то один раз вызывается эта же процедура с теми же координатами, и уполовиненным размером Size div 2

Вроде логика простая.


Jeer   (2013-06-19 14:14:00) [14]

Хорош парня травмировать:)

DanilTraum   (19.06.13 14:00) [16]

Вполне достаточно *.Canvas.FrameRect(Rect:TRect);


DanilTraum   (2013-06-19 14:00:00) [15]

При запуске программы
Expected '=' but '(' found

TForm1 = class(TForm)
   ??????????
   procedure TForm1.DrowSqureS(A: Integer);
Просто никогда не сталкивался с DrowSqureS...(((


[ВладОшин]   (2013-06-19 13:47:00) [16]


> procedure TForm1.btn1Click(Sender: TObject);
> procedure TForm1.DrowSqureS(A: Integer);

это методы класса TForm1

один метод описан тут:
 TForm1 = class(TForm)
   btn1: TButton;
   procedure btn1Click(Sender: TObject);

угадайте как описать второй


DanilTraum   (2013-06-19 13:08:00) [17]

Ругается на DrowSqureS...
Может объявить где надо его?


[ВладОшин]   (2013-06-19 13:03:00) [18]

тьфу, ты..
>> квадрат, в нем четыре квадрата,

тогда:
procedure TForm1.DrowSqureS(A: Integer);
begin
 if A < 2 then
   Exit;
 Canvas.Rectangle(0,0,A,A);
 Canvas.Rectangle(A div 2,A div 2,A,A);
 A := A div 2;
 DrowSqureS(A);
end;

попасть по пикселям - на дом :)


[ВладОшин]   (2013-06-19 12:54:00) [19]

Вот ведь какие преподы - перерыл весь интернет, компилятора для программы написанной маркером на стенке микроволновки, похоже, нет :(

Или надо было с внутренней стороны писать?!?


Jeer   (2013-06-19 12:49:00) [20]

>а микроволновка если есть - не подойдет!?!

Можно. Там наверняка есть микропроцессор.
Поэтому пропускаем первый и второй пункты, далее - по списку.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо