Bitmap/Flood fill: Difference between revisions

m (→‎{{header|Processing Python mode}}: style fix: constants and globals assigned earlier)
Line 1,942:
import java.util.Queue;
import java.util.LinkedList;
 
PImage img;
int tolerance, start_time;
color fill_color;
boolean allowed;
 
void setup() {
size(600, 400);
Line 1,959:
text("Right click to reset", 100, height-10);
}
 
void draw() {
if (allowed) {
Line 1,968:
}
}
 
void mousePressed() {
img.loadPixels();
Line 1,974:
img.updatePixels();
allowed = true;
start_time = millis();
if(mouseButton == RIGHT) img = loadImage("image.png");
}
 
void mouseWheel(MouseEvent event) {
float e = event.getCount();
tolerance += 2*e;
if (tolerance > 256128) tolerance = 256128;
if (tolerance < 0) tolerance = 0;
allowed = true;
}
 
void flood(int x, int y) {
color target_color = img.pixels[pixel_position(mouseX, mouseY)];
if (target_color != fill_color) {
Queue<Point> queue = new LinkedList<Point>();
Queue<Point> queue.add( = new LinkedList<Point>(x, y));
while (! queue.isEmptyadd(new Point(x, y)) {;
Point p =while (!queue.removeisEmpty();) {
Point p = queue.remove();
if (check(p.x, p.y, target_color)) {
queue.add(newif Point(check(p.x, p.y-1, target_color)); {
queue.add(new Point(p.x, p.y+-1));
queue.add(new Point(p.x-1, p.y+1));
queue.add(new Point(p.x+-1, p.y));
queue.add(new Point(p.x+1, p.y));
}
}
}
}
 
int pixel_position(int x, int y) {
return x + (y * img.width);
}
 
boolean check(int x, int y, color target_color) {
if (x < 0 || y < 0 || y >= img.height || x >= img.width) return false;
int pp = img.pixels[pixel_position(x, y)];
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 (!test_tolerance) return false;
img.pixels[pixel_position(x, y)] = fill_color;
return true;
}
}</lang>
 
==={{header|Processing Python mode}}===
47

edits