È possibile utilizzare Flood fill per riempire una regione. Prende un punto di partenza (o il punto di origine ) come input e riempie in modo ricorsivo la regione, tentando di riempire i suoi vicini vuoti.
Una semplice implementazione stack-based 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)
è la funzione che verifica se il punto (x, y)
viene riempito con il colore confine (verde chiaro, in questo caso) o meno.
setPixel(point)
riempie il punto (x, y)
con il colore di primo piano (verde scuro, nel tuo caso).
Il implementation of these functions è banale, e lo lascio a voi.
L'implementazione precedente utilizza un quartiere 4-connected. Ma può essere facilmente esteso a 6 o 8 quartieri collegati.
fonte
2015-12-15 03:17:58
quindi, se si dovesse "riempire l'intero schema", lo fa in un movimento di scansione? come linea per linea? in tal caso, come viene determinato il punto di partenza? come gestisce le forme concave? – thedarklord47
Possibile duplicato di [Come posso eseguire il riempimento flood con HTML Canvas?] (Http://stackoverflow.com/questions/2106995/how-can-i-perform-flood-fill-with-html-canvas) – iamnotmaynard