Ich bin ziemlich neu in der Bildverarbeitung und arbeite derzeit an einer malenähnlichen Anwendung, die eine Eimerfüllung bietet. Ich habe jedoch keine Ahnung, was der beste Algorithmus für eine Eimerfüllung ist.
Ich habe ein Beispiel implementiert, das ich auf dieser Site gefunden habe. Es kam jedoch zu Endlosschleifenproblemen, als ein Benutzer versuchte, einen Bereich zu füllen, der bereits mit derselben Farbe gefüllt war.
Ich arbeite derzeit an diesem Problem, indem ich links, rechts, oben und dann unten ausfülle. Ich habe es jedoch so gemacht, dass ein Pixel, das einmal links ausgefüllt wurde, nicht rechts ausgefüllt werden kann. Dies bedeutet, dass Formen wie:
wird nicht richtig gefüllt, wenn das Schaufelwerkzeug am roten Punkt verwendet wird.
Daher hoffe ich, dass jemand einen Algorithmus oder einen Link zu einem kennt, der all diese Probleme löst.
Zusätzliche Informationen: Dies wird mit Javascript als Malwerkzeug implementiert. Es wird online unter Verwendung des Canvas-Elements verwendet.
quelle
Antworten:
Es hört sich so an, als ob Sie tatsächlich nach einem so genannten Flood-Fill-Algorithmus suchen. Vielleicht haben Sie deshalb nicht viele Beispiele dafür gefunden. Auf der Wikipedia-Seite sind mehrere Flood-Fill-Methoden für den Algorithmus aufgeführt . Ich empfehle dringend eine der nicht-rekursiven Methoden in der Warteschlange.
quelle
I highly recommend one of the non-recursive, 'queued' methods.
- Können Sie erklären, warum?Ich mache gerade das Gleiche. Als ich jedoch auf das von Ihnen angesprochene Problem stieß, habe ich mich dafür entschieden, die Funktion einfach zu beenden, wenn das Werkzeug auf einen Bereich derselben Farbe geklickt wurde, die Sie malen möchten (dies scheint auch das Verhalten von ms-paint zu sein). .
Die Methode in der Warteschlange sollte für alle mit Programmiererfahrung äußerst intuitiv sein.
Wenn Sie den Bereich um einen Punkt mit der gleichen Farbe wie Ihre Farbe bemalen, können Sie Folgendes tun:
Wenn Sie möchten , können Sie einen Blick auf meine (ziemlich peinlich) Code nehmen hier .
Es ist alles andere als schnell, aber es funktioniert gut ...
quelle