Paint-Programm: Probleme mit Füllfunktion; SuFu & Google benutzt

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Paint-Programm: Probleme mit Füllfunktion; SuFu & Google benutzt

    Hey,

    ich arbeite momentan an einem Paint-Clon und versuche die Füllfunktion zu implementieren.
    Sie funktioniert eigentlich, jedoch erhalte ich, an mir sehr unerklärlichen Stellen Fehler.
    Die Meldung "An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll" kommt, ich weiß nicht, wieso.
    Eine Endlosschleife ist es nicht, vielleicht liegt es daran, dass bei zu großen Flächen zu viele Rekursionsinstanzen geöffnet werden müssen und es deswegen abstürzt.. :/

    Code sieht so aus:

    Quellcode

    1. Private Sub fill(ByVal p1 As Integer, ByVal p2 As Integer)
    2. If bmp.GetPixel(p1, p2) = clickedColor Then
    3. delay(0.0001)
    4. bmp.SetPixel(p1, p2, fillColor)
    5. fill(p1, p2 - 1)
    6. fill(p1 - 1, p2)
    7. fill(p1, p2 + 1)
    8. fill(p1 + 1, p2)
    9. canvas.Invalidate()
    10. End If
    11. End Sub


    Vielen Dank sconmal :s
    Bilder
    • fillError.png

      11,52 kB, 1.241×804, 105 mal angesehen
    • fillError2.png

      36,98 kB, 1.245×796, 98 mal angesehen
    @Levyce Ich kann Dein Problem reproduzieren, erklären kann ich es nicht.
    Der Algo ist an sich in Ordnung, so wird er auch bei StackOverflow und CodeProject dargestellt.
    Ich hab Dein Delay rausgenommen, eine Darstellung und einen Rekursionszähler eingebaut. Die Exception kommt bei ca. 7500 (x86) bzw. bei 5500 (x64).

    VB.NET-Quellcode

    1. Private rekurs As Integer = 0
    2. Private Sub fill(ByVal x As Integer, ByVal y As Integer)
    3. If bmp.GetPixel(x, y).ToArgb = clickedColor Then
    4. rekurs += 1
    5. bmp.SetPixel(x, y, fillColor)
    6. PictureBox1.Image = bmp
    7. PictureBox1.Update()
    8. fill(x - 1, y)
    9. fill(x + 1, y)
    10. fill(x, y - 1)
    11. fill(x, y + 1)
    12. rekurs -= 1
    13. End If
    14. End Sub
    Ich hab mal irgendwo ein Demoprogramm für FloodFoll gefunden, wo, weiß ich nicht mehr.
    Das ist in C#, das sollte jedoch kein Problem sein. ;)
    Dateien
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Levyce schrieb:

    Habe jetzt eine Möglichkeit gefunden
    Lässt Du uns an Deiner Lösung teilhaben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!