Algorithmus zum Farbausfüllen beliebiger Polygone
-
hi!
Ich habe folgendes Problem: Ich verwende BCB 1.0 und schreibe grade an nem 3d-renderer. Deswegen kann ich die Canvas-Funktionen bzw API-Funktionen zum Aufüllen von Polygonen nicht verwenden, da ich bei diesem Vorgang jeden einzelnen Pixel abfangen muss (Helligkeitsberechnung etc..)
Wie funktioniert denn der Algorithmus der in der API bzw von Canvas verwendet wird?
danke, chris90
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Eine Möglichkeit ist:
füllen( Pixel, Farbe ) { male Pixel mit Farbe für alle nachbarn wenn Nachbarfarbe != Farbe und innerhalb des Polys füllen( Nachbarpixel, Farbe ); }
Bye, TGGC (Keine Macht den Dummen)
-
danke für deine hilfe! ich arbeite gerade an einer zweiten möglichkeit die über geradenschnittpunkte läuft. Danach schau ich mal was effizienter ist.
-
höchstwahrscheinlich wird ein Boundary Fill oder ein Flood Fill Algorithmus verwendet - diese arbeiten einfach auf Pixelebene
Boundary Fill und Flood Fill arbeiten in etwa so wie es TGGC geschrieben hat
Ein besser Methode ist sicherlich "ber geradenschnittpunkte" zu gehen - auch Abtastzeilenalgorithmus (Scanline Verfahren) genannt
such mal nach diesen Begriffen in Google - da findet man einiges - oder such mal nach dem Begriff "Edge Table" - das dürfte die richtige Richtung sein...
-
TGGC schrieb:
Eine Möglichkeit ist:
füllen( Pixel, Farbe ) { male Pixel mit Farbe für alle nachbarn wenn Nachbarfarbe != Farbe und innerhalb des Polys füllen( Nachbarpixel, Farbe ); }
mit Rekursion zu arbeiten halt ich für nich sinnvoll, da weil die Funktion in sich noch mal sich selber aufruft, werden bei jedem Selbstaufruf die verwendeten Ressourcen zwischengespeichert, und das für jeden Pixel - dh: ein Feld von 100x100 px erzeugt Rekursionen von 10.000 Selbstaufrufen, was sich extrem nach Bufferoverflow anhört ( und es wird wohl nicht nur ein zu füllendes Poly geben
)
-
Für mich nicht.
Bye, TGGC (Keine Macht den Dummen)
-
Bufferoverflow
wo kein buffer, da kein overflow.
was du meinst ist, das der stack voll wird, da hast du recht.
andererseits wäre der passende algo der mit schleifen arbeitet nicht so schön zu verstehen
-
Bei mir gings so auch nicht (Stack overflow), habe dann auch den Scanline-Algorithmus angewandt.
-
1. alles was man rekursiv programmieren kann, kann man auch iterativ programmieren
2. es gibt repetive rekursion (die hier auch vorliegt)
-
zudem ist die rekursive Variante oft leichter zu erklären und verstehen. Implementieren kann man dann ja immer noch iterativ.
-
Allerdings ist die erstgennante Methode - abgesehen davon, dass sie rekursiv nicht zu benutzen ist - nicht so effizient
-
weiß vielleicht irgendwer woher ich mal einen beispielcode zum scanline-algorithmus bekomme? Ich hab jetzt mehrere Tage dran gearbeitet und er macht es iummer noch nicht so wie ich das will
-
Tja, darum hab ich wohl 'nen anderen vorgeschlagen. Aber google weiss es bestimmt.
Bye, TGGC (Wähle deine Helden)
-
aber deine methode lässt bei mir den stack überlaufen...
-
otze schrieb:
Bufferoverflow
wo kein buffer, da kein overflow.
was du meinst ist, das der stack voll wird, da hast du recht.
andererseits wäre der passende algo der mit schleifen arbeitet nicht so schön zu verstehen... richtig (vertan!)