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

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

Рекурсия


Страницы:   1 2 3

RASkov ©   (2006-08-23 03:50:00) 

Подскажите как осуществляется заливка... Ну например есть Битмап на его канве нарисовали круг тыкнули в области круга мышой и круг залился специально определенным цветом. Это только пример. Мне собственно нужно нечто похожее. Есть двумерный массив (т.е. теже самые пикселы канвы Битмапа) если этот массив спроецировать на Битмап то там тоже может быть замкнутая фигура (из чисел) и вот если указать координаты в области такой фигуры то нужно всю эту область заполнить определенным значеним. Вот дополнительное инфо

var Map: array [0..100] of array [0..100] of Integer;

procedure Fill(const X, Y, NFrom, NTo: Integer);
begin
?????????
end;


вызов Fill(35, 45, 3, 5);

3 - это значени в Map[35][45]
5 - на это нужно заменить все 3 исходя от данной координаты(35,45) и по сторонам пока не встретится либо граница либо отличное от 3

Процедуру и вызов написал только для того что бы было лучше понять. Может и не правильно (скорее всего) описал ее, т.к. она наверняка должна быть рекурсивной или в ней (в процедуре Fill) сделать рекурсивную подпрограмму. Не понимаю как вообще оформить рекурсию.


RASkov   (2006-08-23 15:18:00) [41]

последняя должна быть так с форматированием косяк вышел для первых двух пойдет а вот последняя тоже оказалась замкнутой поэтому здесь без выделения ну по еденицам можно понять что в нижнем правом углу дыра:
55555555555555555555555555555
55555555555555555555555555555
51111111111115555555555
5133333333331555555555555
5122222222221555555555555
511111111111555555555555
55555555555555555555555555555


RASkov   (2006-08-23 15:15:00) [42]


> MBo ©   (23.08.06 14:28) [8]

Спасибо. Это похоже на то как я пытался делать из RASkov   (23.08.06 06:03) [3] ... но работает не верно. Разница в том что у Вас сравнение истина если не равно следующее значение а у меня если равно, т.е. при Вашем случае заполнится весь массив, а мне нужно часть которая содержит значение до границ с неравным Value или другими словами выбрали ячейку со значением в ней 3, то исходя от этой, заполнить все ячейки которые содержат значение 3 - значением 5. если встретилось на пути до границы массива другое значение(даже 5) прекратить в эту сторону заполнять. Или вот еще... Есть круг на канве нарисован черным пером и закрашен наполовину красной кистью наполовину зеленой и желтым за кругом, так вот если выбрать ячейку в области круга со значеним зеленый, то заполнить ее черным оставив красную и не выходить за границы круга... дожно получится на желтом фоне круг наполовину черный на половину красный. Вот вроде подробно написал....
И вот при RASkov   (23.08.06 06:03) [3]таком варианте иногда вылетает OverFlow... или как там ее.. вообщем переполнение(зацикливание). Или заполняется только та ячейка которую выбрали или вообщем нужного результата не получилось ниразу.
Вот наглядно:
55555555555555555555555555555
55555555555555555555555555555
5 1111111111115555555555
5 13333333333 1555555555555
5 12222222222 1555555555555
5 111111111111555555555555
55555555555555555555555555555 так считается замкнутая фигура и если выбрать координату внутри нее со значеним 3 и указать заменит на 4 то должно быть так
55555555555555555555555555555
55555555555555555555555555555
5 1111111111115555555555
5 14444444444 1555555555555
5 12222222222 1555555555555
5 111111111111555555555555
55555555555555555555555555555

а это не замкнатая

55555555555555555555555555555
55555555555555555555555555555
5 1111111111115555555555
5 13333333333 1555555555555
5 12222222222 1555555555555
5 11111111111555555555555
55555555555555555555555555555

и если выбрать туже самую что и при первом случае ячейку то заполняются (заменяются)и тройки и пятерки на значение 4


MBo   (2006-08-23 14:28:00) [43]

procedure ЗаполнитьМассив4хсвязно(x, y, Value: Integer);
begin
 Arr[x,y] := Value;
 if  (x < Width)  and (Arr[x + 1, y] <> Value) then ЗаполнитьМассив4хсвязно(x +1, y);
 то же самое с  x>0, x - 1, y
  ... x, y + 1
  ... x, y - 1
end;


RASkov   (2006-08-23 14:06:00) [44]

И я так думаю... только незнаю... как?
Может кто знает как это делается... приведет пример.
Заранее Сэнькс. Большой.


Loginov Dmitry_   (2006-08-23 13:33:00) [45]

Ну тады проще всего наверно сделать это с помощью рекурсии.


RASkov   (2006-08-23 13:30:00) [46]


> Loginov Dmitry ©   (23.08.06 07:39) [4]

Читали [0]? Вот как работает FloodFill? мне так же надо с массивом.


Loginov Dmitry   (2006-08-23 07:39:00) [47]



procedure TForm1.Timer1Timer(Sender: TObject);
begin
 with Image1.Canvas do
 begin
   Brush.Color := RGB(Random(255), Random(255), Random(255));
   FloodFill(50, 50, clBlack, fsBorder);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 with Image1.Canvas do Ellipse(ClipRect);
end;


RASkov   (2006-08-23 06:03:00) [48]

Подозреваю, что должно быть нечто вот такое но что-то некатит :(((

procedure Fill(const X, Y, NFrom, NTo: Integer);
procedure FillCR(const C, R, N: Integer);
begin
   Map[C][R]:=NTo;
   if C>0 then if Map[C-1][R]=N then FillCR(C-1, R, N);
   if (C>0) and (R>0) then if (Map[C-1][R-1]=N) then FillCR(C-1, R-1, N);
   if (R>0) then if Map[C][R-1]=N then FillCR(C, R-1, N);
   if (C<100) then if Map[C+1][R]=N) then FillCR(C+1, R, N);
   if (C<100) and (R<100) then if Map[C+1][R+1]=N)then FillCR(C+1, R+1, N);
   if (R<100) then if Map[C][R+1]=N then FillCR(C, R+1, N);
   if (C>0) and (R<100) then if Map[C-1][R+1]=N then FillCR(C-1, R+1, N);
  end;
end;
begin
  FillCR(X, Y, N);
end;


RASkov   (2006-08-23 04:50:00) [49]

> [1] TUser ©   (23.08.06 04:16)

Спасибо но....
Чет я вообще не понял, здесь че, либо весь встретившийся цвет (3) заменится на (5), т. был внутри "фигуры" и снаружи... и вооще не понял приведенный пример. Что значит next n... N счетчик вроде.... или это бейсик...


TUser   (2006-08-23 04:16:00) [50]

А смысл тут рекурсировать?

{
 Все вершины - не отмечены
}
отметить точку, куда ткнули
for n := 1 to 101 * 101 do
  for x := 0 to 100 do
   for y := 0 to 100 do
     if (x,y) не отмечена И покрашена исходным цветом then
       if рядом есть отмеченная (x',y') then
         закрасить (x',y') конечным цветом
         отметить (x',y')
         next n


Страницы:   1 2 3

Наверх

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