Я работал над созданием инструмента обрезки произвольной формы, используя класс Unity Texture2D
и компонент маски. До сих пор я создал систему, с помощью которой пользователь может рисовать произвольную форму на прозрачном изображении. Мне нужен алгоритм, с помощью которого я смогу идентифицировать и заполнить часть, которая находится внутри нарисованной области.
До сих пор я реализовал следующие подходы
- Я использовал этот лог 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);
}
}
Нарисованная фигура (в красные линии)
Идентифицированный регион (неверный)
Хотя я понимаю, почему каждый из этих подходов не работает, я не могу вспомнить правильный алгоритм