From a0b65f2e1a81b6fec30b4c1c2b2764c8dbcd64a9 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 12 Dec 2014 00:05:37 -0500 Subject: flood fill --- js/draw.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'js/draw.js') diff --git a/js/draw.js b/js/draw.js index 8a12467..6bf55bd 100644 --- a/js/draw.js +++ b/js/draw.js @@ -51,6 +51,48 @@ var draw = (function(){ } }) } + + function fill (lex, x, y) { + var q = [ [x,y] ] + var target = canvas.aa[y][x].copy() + var n, w = 0, e = 0, j = 0 + var kk = 0 + // gets into a weird infinite loop if we don't break here.. :\ + if (target.eq(lex)) { return } + LOOP: while (q.length) { + n = q.shift() + if (canvas.aa[n[1]][n[0]].ne(target)) { + continue LOOP + } + w = e = n[0] + j = n[1] + WEST: while (w > 0) { + if (canvas.aa[j][w-1].eq(target)) { + w = w-1 + } + else { + break WEST + } + } + EAST: while (e < canvas.w-1) { + if (canvas.aa[j][e+1].eq(target)) { + e = e+1 + } + else { + break EAST + } + } + for (var i = w; i <= e; i++) { + canvas.aa[j][i].clone(lex) + if (j > 0 && canvas.aa[j-1][i].eq(target)) { + q.push([ i, j-1 ]) + } + if (j < canvas.h-1 && canvas.aa[j+1][i].eq(target)) { + q.push([ i, j+1 ]) + } + } + } + } var draw = {} draw.down = down @@ -58,6 +100,7 @@ var draw = (function(){ draw.stamp = stamp draw.line = line draw.point = point + draw.fill = fill return draw })() -- cgit v1.2.3-70-g09d2