Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2016, 02:07   #1
batareya16
Новичок
Джуниор
 
Регистрация: 10.09.2016
Сообщений: 2
По умолчанию Глубокая рекурсия, StackOverflow

Мне дали задачу написать что-то вроде графического редактора, написал рекурсивную процедуру заливки по цвету, сначала обрадовался, но не тут-то было: при слишком больших размерах заливки программа выдает переполнение.

Вот сам код:
Код:
procedure zalivka(x,y:integer; inputcolor,destcolor:TColor; Image:TImage);
begin
Image.Canvas.Pixels[x,y]:=destcolor;
If Image.Canvas.Pixels[x-1,y]=inputcolor then zalivka(x-1,y,inputcolor,destcolor,Image);
If Image.Canvas.Pixels[x+1,y]=inputcolor then zalivka(x+1,y,inputcolor,destcolor,Image);
If Image.Canvas.Pixels[x,y-1]=inputcolor then zalivka(x,y-1,inputcolor,destcolor,Image);
If Image.Canvas.Pixels[x,y+1]=inputcolor then zalivka(x,y+1,inputcolor,destcolor,Image);
end;
Что посоветуете делать?
Может как-то заменить рекурсию на цикл?
batareya16 вне форума Ответить с цитированием
Старый 14.09.2016, 21:19   #2
batareya16
Новичок
Джуниор
 
Регистрация: 10.09.2016
Сообщений: 2
По умолчанию

Нашел способ в интернете)
Может кому надо будет
Вместо рекурсии создаем свой стек:

Код:
Procedure PutSt(var Stk:PStk;X,Y:integer);
 Var
   St:PStk;
  Begin
    New(St);
    St^.x:=X;
    St^.y:=Y;
    St^.prev:=Stk;
    Stk:=St;
  End;

Procedure GetStk(var Stk:PStk;var X,Y:integer);
 Var
   St:PStk;
  Begin
    If not Assigned(Stk) Then Exit;
    X:=Stk^.x;
    Y:=Stk^.y;
    St:=Stk;
    Stk:=Stk^.prev;
    Dispose(St);
  End;
А потом просто циклом заносим в стек координаты и закрашиваем то, что сами извлекли из стека:
Код:
procedure zalivka(x,y:integer);
var Stk:PStk;
 x1,y1:integer;
begin
  x1:=x; y1:=y;
   Stk:=nil;
    PutSt(Stk,X1,Y1);
    While Assigned(Stk) do begin
     GetStk(Stk,X1,Y1);
     RealImage.Canvas.Pixels[x1,y1]:=destcolor;
      If RealImage.Canvas.Pixels[x1-1,y1]=inputcolor then PutSt(Stk,X1-1,Y1);
      If RealImage.Canvas.Pixels[x1+1,y1]=inputcolor then PutSt(Stk,X1+1,Y1);
      If RealImage.Canvas.Pixels[x1,y1-1]=inputcolor then PutSt(Stk,X1,Y1-1);
      If RealImage.Canvas.Pixels[x1,y1+1]=inputcolor then PutSt(Stk,X1,Y1+1);
    end;
     Application.ProcessMessages;
end;
batareya16 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка StackOverFlow nevender Помощь студентам 1 15.04.2016 13:43
Поддержим русский StackOverflow artem453 Свободное общение 3 29.05.2013 23:06
Заявка на русский StackOverflow Artem423 Общие вопросы C/C++ 1 08.04.2013 19:19
Большая матрица и StackOverflow Gapro Общие вопросы C/C++ 6 20.10.2011 19:29
Рекурсия McJordan Паскаль, Turbo Pascal, PascalABC.NET 5 18.12.2010 19:46