AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FloodFill Rekursiv

Ein Thema von Neutral General · begonnen am 19. Jun 2007 · letzter Beitrag vom 21. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

FloodFill Rekursiv

  Alt 19. Jun 2007, 13:45
Hi,

Ich benötige für mein Vorhaben eine FloodFill Procedure. Dazu hab ich erst mal eine "normale" programmiert.
Aber irgendwie bekomm ich dauernd nen Stack-Overflow... Wodran liegt denn das? Ich hab bei Wikipedia geguckt ob die das anders machen aber Wikipedia machts exakt genauso!

Delphi-Quellcode:
procedure FloodFill(ACanvas: TCanvas; x,y: Integer; AColor: TColor; Border: TColor);
begin
  if (ACanvas.Pixels[x,y] <> Border) then
  begin
    ACanvas.Pixels[x,y] := AColor;
    FloodFill(ACanvas,x+1,y,AColor,Border);
    FloodFill(ACanvas,x-1,y,AColor,Border);
    FloodFill(ACanvas,x,y+1,AColor,Border);
    FloodFill(ACanvas,x,y-1,AColor,Border);
  end;
end;
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 13:53
Nur ne Vermutung, aber du hast nicht wirklich ne vernünftige Endbedingung, ausser wenn ALLES eingefärbt ist.

Will sagen, checke wenigstens mal ob 0<X<maxX und 0<Y<maxY.....
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 13:56
Ja das hatte ich mir auch schon gedacht aber ich hab die Fläche jetzt so eingegrenzt das sie nicht am Ende des Canvas ist sondern in der Mitte. Also ist die Abbruchbedingung auf jeden Fall erfüllt.. Wenn ich nur eine Richtung Rekursiv ausführe dann gehts.. Bei mehreren gibts nen Stack overflow.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#4

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 13:59
Delphi-Quellcode:
procedure FloodFill(ACanvas: TCanvas; x,y: Integer; AColor: TColor; Border: TColor);
begin
  if (ACanvas.Pixels[x,y] <> Border) then
  begin
    ACanvas.Pixels[x,y] := AColor;
    // Überprüfe vorm Aufruf erst, ob der Pixel die Bordercolor hat! Dann ruft er FloodFill nur auf, wenn nötig!
    FloodFill(ACanvas,x+1,y,AColor,Border);
    FloodFill(ACanvas,x-1,y,AColor,Border);
    FloodFill(ACanvas,x,y+1,AColor,Border);
    FloodFill(ACanvas,x,y-1,AColor,Border);
  end;
end;
Richard Mahr
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 13:59
So ganz macht deinen Code auch kein Sinn --->

bspw. wird Pixel 10,10 bearbeitet --> ist ungleich Border und wird auf Color gesetzt --> rek. Aufruf auf alle umliegenden Pixel --> der umliegende Pixel ruft ja wieder das Feld 10,10 auf.... der Vergleich ergibt true, da Border und AColor bestimmt unterschiedlich sind --> endlosschleife
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 14:15
Ok thx. Also ich habs jetzt so abgeändert:

Delphi-Quellcode:
procedure FloodFill(ABmp: TBitmap; x,y: Integer; AColor: TColor; Border: TColor);
begin
  if (ABmp.Canvas.Pixels[x,y] <> Border) and (ABmp.Canvas.Pixels[x,y] <> AColor)
    and (x <= ABmp.Width) and (x >= 0) and (y <= ABmp.Height) and (y >= 0)
  then
  begin
    ABmp.Canvas.Pixels[x,y] := AColor;
    FloodFill(ABmp,x,y+1,AColor,Border);
    FloodFill(ABmp,x,y-1,AColor,Border);
    FloodFill(ABmp,x+1,y,AColor,Border);
    FloodFill(ABmp,x-1,y,AColor,Border);
  end;
end;
Das klappt auch bei manchen flächen.. Aber bei Flächen die viel Bitmap-Rand enthalten gibts wieder en Stack-Overflow... -.-

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 14:20
Zitat von Neutral General:
(x <= ABmp.Width) and (y <= ABmp.Height)
Ein Bitmap geht von x: 0..Width-1; y: 0..Height-1. Könnte evtl. die Ursache sein. Typisches off-by-one
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 14:26
Hallo,

eine Frage: was spricht gegen die Verwendung von Delphi-Referenz durchsuchenTCanvas.FloodFill?

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 14:27
Zitat von dizzy:
Zitat von Neutral General:
(x <= ABmp.Width) and (y <= ABmp.Height)
Ein Bitmap geht von x: 0..Width-1; y: 0..Height-1. Könnte evtl. die Ursache sein. Typisches off-by-one
Wie war das mit dem Wald den man vor lauter Bäumen nicht mehr sieht ?

Danke

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#10

Re: FloodFill Rekursiv

  Alt 19. Jun 2007, 14:29
Zitat von dizzy:
Zitat von Neutral General:
(x <= ABmp.Width) and (y <= ABmp.Height)
Ein Bitmap geht von x: 0..Width-1; y: 0..Height-1. Könnte evtl. die Ursache sein. Typisches off-by-one ;)
Außerdem zuerst die Bereiche testen und dann die Farben, sonst könnte es, wenn's dumm läuft, statt des Stackfehlers einen Zugriffsfehler geben.

Gammatester
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz