Bitmap/Flood fill: Difference between revisions

Content added Content deleted
Line 1,942: Line 1,942:
import java.util.Queue;
import java.util.Queue;
import java.util.LinkedList;
import java.util.LinkedList;

PImage img;
PImage img;
int tolerance;
int tolerance;
color fill_color;
color fill_color;
boolean allowed;
boolean allowed;

void setup() {
void setup() {
size(600, 400);
size(600, 400);
Line 1,959: Line 1,959:
text("Right click to reset", 100, height-10);
text("Right click to reset", 100, height-10);
}
}

void draw() {
void draw() {
if (allowed) {
if (allowed) {
Line 1,968: Line 1,968:
}
}
}
}

void mousePressed() {
void mousePressed() {
img.loadPixels(); // A continious bitmap array with no reference to width
img.loadPixels();
flood(mouseX, mouseY);
flood(mouseX, mouseY);
img.updatePixels();
img.updatePixels();
Line 1,976: Line 1,976:
if(mouseButton == RIGHT) img = loadImage("image.png");
if(mouseButton == RIGHT) img = loadImage("image.png");
}
}

void mouseWheel(MouseEvent event) {
void mouseWheel(MouseEvent event) {
float e = event.getCount();
float e = event.getCount();
Line 1,984: Line 1,984:
allowed = true;
allowed = true;
}
}


void flood(int x, int y) {
void flood(int x, int y) {
color target_color = img.pixels[pixel_position(mouseX, mouseY)];
color target_color = img.pixels[pixel_position(mouseX, mouseY)];
boolean[][]p_control = new boolean[img.height][img.width];
Queue<Point> queue = new LinkedList<Point>();
Queue<Point> queue = new LinkedList<Point>();
queue.add(new Point(x, y));
queue.add(new Point(x, y));
while (!queue.isEmpty()) {
while (!queue.isEmpty()) {
Point p = queue.remove();
Point p = queue.remove();
if (check(p_control, p.x, p.y, target_color)) {
if (check(p.x, p.y, target_color)) {
queue.add(new Point(p.x, p.y-1));
queue.add(new Point(p.x, p.y-1));
queue.add(new Point(p.x, p.y+1));
queue.add(new Point(p.x, p.y+1));
Line 2,001: Line 2,000:
}
}
}
}

int pixel_position(int x, int y) { // Returns position of clicked coordinates width / height of the image
int pixel_position(int x, int y) {
return x + (y * img.width);
return x + (y * img.width);
}
}

boolean check(boolean[][]p_control, int x, int y, color target_color) {
boolean check(int x, int y, color target_color) {
if (x < 0 || y < 0 || y >= img.height || x >= img.width || p_control[y][x]) return false;
if (x < 0 || y < 0 || y >= img.height || x >= img.width) return false;
int pp = img.pixels[pixel_position(x, y)];
int pp = img.pixels[pixel_position(x, y)];
boolean test_tolerance = (abs(green(target_color)-green(pp)) < tolerance
boolean test_tolerance = (abs(green(target_color)-green(pp)) < tolerance
Line 2,014: Line 2,013:
if (!test_tolerance) return false;
if (!test_tolerance) return false;
img.pixels[pixel_position(x, y)] = fill_color;
img.pixels[pixel_position(x, y)] = fill_color;
p_control[y][x] = true;
return true;
return true;
}</lang>
}</lang>



=={{header|PureBasic}}==
=={{header|PureBasic}}==