каков хороший алгоритм определения области для заполнения, когда пользователь создал границу произвольной формы на изображении? - PullRequest
0 голосов
/ 11 июля 2020

Я работал над созданием инструмента обрезки произвольной формы, используя класс Unity Texture2D и компонент маски. До сих пор я создал систему, с помощью которой пользователь может рисовать произвольную форму на прозрачном изображении. Мне нужен алгоритм, с помощью которого я смогу идентифицировать и заполнить часть, которая находится внутри нарисованной области.

До сих пор я реализовал следующие подходы

  1. Я использовал этот лог c, чтобы определить, была ли точка между нарисованной фигурой, но это не работает для нарисованных фигур произвольной формы https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/
int count;
        int a = 0;

        for (int x = 0; x < image_width; x++)
        {
            count = 0;
            for (int y = 0; y < image_height-1; y++)
            {
                if (drawingLayerTexture.GetPixel(x, y) == Color.red && drawingLayerTexture.GetPixel(x, y + 1) != Color.red)
                {
                    count++;
                }
            }

            if(drawingLayerTexture.GetPixel(x,image_height)==Color.red)
            {
                count++;
            }

            if (count > 1)
            {
                count = 0;
                for (int y = 0; y < image_height-1; y++)
                {
                    if (drawingLayerTexture.GetPixel(x, y) == Color.red && drawingLayerTexture.GetPixel(x, y + 1) != Color.red)
                    {
                        count++;
                    }
                    if (count % 2 == 1)
                    {
                        drawingLayerTexture.SetPixel(x, y, Color.white);
                        a++;
                    }
                }
            }
        }
Вместо того, чтобы проверять только линию, я проверил точку выше и помимо точки, но она по-прежнему работает не во всех случаях
// Red is the color of the freeform shape drawn by the user, White is the region which is inside the shape

for(int y=0;y<image_height;y++)
        {
            for(int x=0;x<image_width;x++)
            {
                if (drawingLayerTexture.GetPixel(x, y) == Color.red)
                    drawingLayerTexture.SetPixel(x, y, Color.white);
                else if (x == 0 || y == 0)
                    continue;
                else if ((drawingLayerTexture.GetPixel(x - 1, y) == Color.white) && (drawingLayerTexture.GetPixel(x, y - 1) == Color.white))
                    drawingLayerTexture.SetPixel(x, y, Color.white);
            }
        }

Нарисованная фигура (в красные линии)

Идентифицированный регион (неверный)

Хотя я понимаю, почему каждый из этих подходов не работает, я не могу вспомнить правильный алгоритм

1 Ответ

0 голосов
/ 15 июля 2020

Вы можете создать контур, используя цвет solid (без сглаживания), затем провести четыре воображаемых линии наружу от каждого пикселя и заполнить их только в том случае, если все они пересекаются с контуром. Насколько я знаю, он всегда должен работать с замкнутыми формами. Это крайне неэффективно, но это хорошее начало.

...