Witam,
jestem chory i dość słabo myślę, a chciałbym napisać w miare szybko taką funkcję. Chodzi mi o wypełnianie danego obszaru kolorem, odpowiednik FloodFill w Canvas (zaczynając od jednego piksela bada wszystkie sąsiadujące i te o danych parametrach zostają przebarwione). Mam tu niestety pewien problem. Wyskakują mi co chwila Stack Overflow'y. Pytanie moje brzmi jak moją procedure zmodyfikować najlepiej do repeat until itd.
procedure .. .Click(X, Y: Integer; C: TColor);
begin
if PtInRect(Point(X, Y), Image.ClientRect) then
if Image.Canvas.Pixels[x, Y] = clRed then
begin
Image.Canvas.Pixels[x, y] := C;
Click(X-1, Y, C);
Click(X+1, Y, C);
Click(X, Y-1, C);
Click(X, Y+1, C);
end;
end;
Kod może mieć błędy, napisałem go z pamięci, by pokazać idee. Procedura wysypuje się oczywiście przy większych połaciach - odwołuje się zbyt wiele razy sama do siebie i dochodzi do przepełnienia. Próbowałem szukać jakichś algorytmów nic niestety nie znalazłem, proszę o pomoc gdyż zależy mi na czasie anie bardzo myślę.
Zastanawiałem się w sumie by wykorzystać mechanizm, z którego korzystałem przy pisaniu języka skryptowego - nałożyć zakładek (label) i się odwoływać do nich zapisując każde odwołanie - na pewno prędkość działania bardzo spadnie ale algorytm będzie niezawodny. Macie może jednak bardziej "cywilizowane" pomysly?
Pozdrawiam, Patryk K.