Unity에서 작동 할 플러드 채우기 알고리즘을 작성하려고했습니다. 아이디어는 사용자가 선택한 색상을 기반으로 검정색 - 흰색 선 그리기의 섹션을 색칠하는 것입니다. 홍수 채우기 알고리즘에 대한 여러 구현을 시도했지만 모두 호출 될 때 단일성이 중단됩니다.Unity 3D - 홍수 채우기/페인트 버킷 알고리즘이 엔진을 계속 충돌합니다.
중요한 프로젝트의 일환으로 도움이 필요하면 큰 도움이됩니다. 코드 개정, 알고리즘 설계, 또는 작업이를 얻을 수있는 다른 방법에 대한 모든 제안을 많이 주시면 감사하겠습니다 :)
코드 :
// FloodFill function
void FloodFill()
{
// TEST - colour the clicked pixel
//_tex.SetPixel((int)_pixelUV.x, (int)_pixelUV.y, m_fillColour);
//_tex.SetPixel(_pixelX, _pixelY, m_fillColour);
// FLOOD FILL
// ----------
// Create WestEast
List<Point> m_WestEast;
//get the pixel's colour
Color PC = new Color(_tex.GetPixel(m_StartNode.X, m_StartNode.Y).r, _tex.GetPixel(m_StartNode.X, m_StartNode.Y).g, _tex.GetPixel(m_StartNode.X, m_StartNode.Y).b);
//Record clicked pixel as point
Point node = new Point(m_StartNode.X, m_StartNode.Y);
//if the pixel's colour is boundary colour (black), return.
if(PC == Color.black)
{
return;
}
//else continue
// Create a list Q[]
m_List = new List<Point>();
//add clicked pixel to Q[]
m_List.Add(node);
//for each element in Q[]
for(int i=0; i<m_List.Count; i++)
{
//create new WE[] and add Q[n] to it
m_WestEast = new List<Point>();
m_WestEast.Add(node);
//get pixel 1 to left (w) of Q[n]
Point w = new Point(node.X + 1, node.Y);
//get colour of w
Color wCol = new Color(_tex.GetPixel(w.X, w.Y).r, _tex.GetPixel(w.X, w.Y).g, _tex.GetPixel(w.X, w.Y).b);
while(wCol != Color.black)
{
//add pixel to WE[] and repeat
m_WestEast.Add(w);
//get new w
w = new Point(w.X + 1, w.Y);
//get colour of w
wCol = new Color(_tex.GetPixel(w.X, w.Y).r, _tex.GetPixel(w.X, w.Y).g, _tex.GetPixel(w.X, w.Y).b);
//else if colour is boundary colour
//go to next step
}
//get pixel 1 to right (e) of Q[n]
Point e = new Point(node.X - 1, node.Y);
//get colour of w
Color eCol = new Color(_tex.GetPixel(e.X, e.Y).r, _tex.GetPixel(e.X, e.Y).g, _tex.GetPixel(e.X, e.Y).b);
while(eCol != Color.black)
{
//add pixel to WE[] and repeat
m_WestEast.Add(e);
//get new e
e = new Point(e.X - 1, e.Y);
//get colour of e
eCol = new Color(_tex.GetPixel(e.X, e.Y).r, _tex.GetPixel(e.X, e.Y).g, _tex.GetPixel(e.X, e.Y).b);
//else if colour is boundary colour
//go to next step
}
//for each pixel in WE[]
for(int j=0; j<m_WestEast.Count; j++)
{
//set the pixel to replacement colour
_tex.SetPixel(m_WestEast[j].X, m_WestEast[j].Y, m_fillColour);
//get pixel 1 to north (n) of Q[n]
Point n = new Point(m_WestEast[j].X, m_WestEast[j].Y - 1);
//get colour of n
Color nCol = new Color(_tex.GetPixel(n.X, n.Y).r, _tex.GetPixel(n.X, n.Y).g, _tex.GetPixel(n.X, n.Y).b);
//if colour is not boundary colour
if(nCol != Color.black)
{
//add pixel to Q[]
m_List.Add(n);
}
//get pixel 1 to south (s) of Q[n]
Point s = new Point(m_WestEast[j].X, m_WestEast[j].Y + 1);
//get colour of s
Color sCol = new Color(_tex.GetPixel(s.X, s.Y).r, _tex.GetPixel(s.X, s.Y).g, _tex.GetPixel(s.X, s.Y).b);
//if colour is not boundary colour
if(sCol != Color.black)
{
//add pixel to Q[]
m_List.Add(s);
}
}
}
// ----------
}