Как реализовать алгоритм заливки в Android? - PullRequest
1 голос
/ 09 марта 2012

Как реализовать алгоритм Flood-fill в android. Но код был написан на языке c. Можем ли мы реализовать алгоритм в android.Есть ли здесь какой-либо открытый исходный код или любая учебная ссылка на сайте

1 Ответ

0 голосов
/ 09 марта 2012

Алгоритм заливки является очень простым рекурсивным.

//Initialize i and j to the place to start
floodFill(int arr[][], target_color, replace_color)
{
    if(arr[i][j] == replace_color)
        return;
    replace(target_color, replace_color);
    floodFill(int[i+1][j], target_color, replace_color);
    floodFill(int[i][j+1], target_color, replace_color);
    floodFill(int[i-1][j], target_color, replace_color);
    floodFill(int[i][j-1], target_color, replace_color);
}

Flood Fill с использованием очереди. Используйте асинхронную заливку для заливки.

Параметры

  1. битпам заполняется
  2. точка, в которой пользователь касается (x, y кординат)
  3. Цвет пикселя, к которому относится касание
  4. Цвет, подлежащий замене.

    public class FloodFill {
    
    public void floodFill(Bitmap  image, Point node, int targetColor,
        int replacementColor) {
    int width = image.getWidth();
    int height = image.getHeight();
    int target = targetColor;
    int replacement = replacementColor;
    if (target != replacement) {
        Queue<Point> queue = new LinkedList<Point>();
        do {
            int x = node.x;
            int y = node.y;
            while (x > 0 && image.getPixel(x - 1, y) == target) {
                x--;
            }
            boolean spanUp = false;
            boolean spanDown = false;
            while (x < width && image.getPixel(x, y) == target) {
                image.setPixel(x, y, replacement);
                if (!spanUp && y > 0 && image.getPixel(x, y - 1) == target) {
                    queue.add(new Point(x, y - 1));
                    spanUp = true;
                } else if (spanUp && y > 0
                        && image.getPixel(x, y - 1) != target) {
                    spanUp = false;
                }
                if (!spanDown && y < height - 1
                        && image.getPixel(x, y + 1) == target) {
                    queue.add(new Point(x, y + 1));
                    spanDown = true;
                } else if (spanDown && y < height - 1
                        && image.getPixel(x, y + 1) != target) {
                    spanDown = false;
                }
                x++;
            }
        } while ((node = queue.poll()) != null);
    }
      }
         }
    
...