2015-12-15 3 views
6

Ich habe einen alten Basiscode, mit dem ich arbeite. Es geht in etwa so:Gibt es eine Möglichkeit, mit HTML Canvas und JavaScript von einem Punkt bis zu einem Rand zu füllen?

PAINT (200, 200), 2, 10

Dies bedeutet im Wesentlichen: eine Fläche an den Koordinaten beginnend füllen: X 200 Y 200 mit der Farbe dunkelgrün bis der Punkt eine Grenze Lichtfarbe grün erreicht, stoppt dann Füllung.

Die Idee ist, dass man einen Umriss (sagen wir von einem Zustand) mit einer Farbe zeichnen und dann den gesamten Umriss mit einer anderen Farbe füllen kann. Es füllt nicht den gesamten Bildschirm aus, da die Kontur die Farbe hat, bei der die Füllung endet.

+1

Wenn Sie also "den gesamten Umriss ausfüllen" würden, ist dies bei einer Scan-Bewegung der Fall? wie Zeile für Zeile? Wenn ja, wie ist der Ausgangspunkt festgelegt? Wie geht es mit konkaven Formen um? – thedarklord47

+0

Mögliches Duplikat von [Wie kann ich eine Flutfüllung mit HTML Canvas durchführen?] (Http://stackoverflow.com/questions/2106995/how-can-i-perform-flood-fill-with-html-canvas) – iamnotmaynard

Antwort

2

Sie können Flood fill verwenden, um eine Region zu füllen. Es nimmt einen Startpunkt (oder den Startpunkt) als eine Eingabe und füllt die Region rekursiv, indem es versucht, seine leeren Nachbarn zu füllen.

Eine einfache stapelbasierten Implementierung in JavaScript:

// Takes the seed point as input 
var floodfill = function(point) { 
    var stack = Array(); 
    stack.push(point); // Push the seed 
    while(stack.length > 0) { 
     var currPoint = stack.pop(); 
     if(isEmpty(currPoint)) { // Check if the point is not filled 
      setPixel(currPoint); // Fill the point with the foreground 
      stack.push(currPoint.x + 1, currPoint.y); // Fill the east neighbour 
      stack.push(currPoint.x, currPoint.y + 1); // Fill the south neighbour 
      stack.push(currPoint.x - 1, currPoint.y); // Fill the west neighbour 
      stack.push(currPoint.x, currPoint.y - 1); // Fill the north neighbour 
     } 
    } 
}; 

isEmpty(point) ist die Funktion, die (in diesem Fall Licht grün) mit der Randfarbe wird der Punkt (x, y) gefüllt oder nicht, überprüft, ob.

setPixel(point) füllt den Punkt (x, y) mit der Vordergrundfarbe (dunkelgrün, in Ihrem Fall).

Die implementation of these functions ist trivial, und ich überlasse es Ihnen. Die folgende Implementierung verwendet eine 4-connected Nachbarschaft. Aber es kann leicht zu 6 oder 8 verbundenen Nachbarschaften erweitert werden.

+0

Danke für die hilfreiche Antwort! Ich bin in einem Punkt etwas verwirrt, ich sehe nicht, wie das weiß, was die Grenzfarbe oder die Vordergrundfarbe ist? – davemackey

+1

Sie können die Hintergrund- und Vordergrundfarben auch an die Funktion übergeben und haben Ihre 'isEmpty' und' setPixel' die gleiche Funktion. –

Verwandte Themen