xxxxxxxxxx
PImage img;
/* @pjs preload="image.png"; */
int tolerance, count;
color fill_color;
boolean allowed;
PVector p = new PVector();
void setup() {
size(600, 400);
background(0, 0, 256);
img = loadImage("image.png");
image(img, 0, 0);
allowed = true;
tolerance = 25;
fill_color = color(255, 0, 0);
}
void draw() {
if (allowed) {
image(img, 0, 0);
allowed = false;
}
}
void mousePressed() {
loadPixels();
flood(mouseX, mouseY);
updatePixels();
}
void flood(int x, int y) {
color target_color = pixels[pixel_position(mouseX, mouseY)];
if (target_color != fill_color) {
ArrayQueue<PVector> queue = new ArrayQueue<PVector>();
queue.add(new PVector(x, y));
while (!queue.isEmpty()) {
PVector p = queue.remove();
color pp = 0;
try {
pp = pixels[pixel_position((int)(p.x), (int)p.y)];
}
catch( Exception e) {
count++;
println(e);
}
boolean test_tolerance = (abs(green(target_color)-green(pp)) < tolerance
&& abs( red(target_color)- red(pp)) < tolerance
&& abs( blue(target_color)- blue(pp)) < tolerance);
if (p.x > 0 && p.y > 0 && p.y <= img.height && x <= img.width && test_tolerance) {
pixels[pixel_position((int)p.x, (int) p.y)] = fill_color;
queue.add(new PVector(p.x, p.y-1));
queue.add(new PVector(p.x, p.y+1));
queue.add(new PVector(p.x-1, p.y));
queue.add(new PVector(p.x+1, p.y));
}
}
}
}
int pixel_position(int x, int y) {
return int(x + (y * img.width));
}