public void clear() { pf_container[,] cont = new pf_container[razm, razm]; for (int i = 0; i < razm; i++) { for (int j = 0; j < razm; j++) { cont[i, j] = new pf_container(mass[i, j], new indexv2(i, j)); } } foreach (pf_container node in cont) { if (node.go.GetComponent <Square>().color != 1) { node.go.GetComponent <Square>().color = 0; } } }
public void start_calc() { Debug.Log("start2"); pf_container[,] cont = new pf_container[razm, razm]; for (int i = 0; i < razm; i++) { for (int j = 0; j < razm; j++) { cont[i, j] = new pf_container(mass[i, j], new indexv2(i, j)); } } pf p = new pf(); ArrayList path = p.calc(cont, new indexv2(6, 6), new indexv2(34, 34)); foreach (pf_container node in path) { node.go.GetComponent <Square>().color = 4; } }
public ArrayList calc(pf_container[,] scont, indexv2 sstartpoint, indexv2 sendpoint) { ArrayList open = new ArrayList(); ArrayList closed = new ArrayList(); ArrayList path = new ArrayList(); bool win = false; //задаем начальную точку open.Add(scont[sstartpoint.x, sstartpoint.y]); (open[0] as pf_container).mincost = 0f; (open[0] as pf_container).hcost = dist2(sstartpoint, sendpoint); (open[0] as pf_container).fincost = (open[0] as pf_container).mincost + (open[0] as pf_container).hcost; while (open.Count != 0) { pf_container min_item = open[0] as pf_container; #region ищем минимальное значение float min = float.MaxValue; for (int i = 0; i < open.Count; i++) { if ((open[i] as pf_container).fincost < min) { min_item = open[i] as pf_container; min = min_item.fincost; } } #endregion open.Remove(min_item); closed.Add(min_item); foreach (pf_container sosed in allnear(scont, min_item.ind)) { if (!sosed.ini) //если не инициирован, то инициируем { if (sosed.ind == sendpoint) //если таргет { win = true; sosed.parent = min_item; break; } sosed.ini = true; if (sosed.go.GetComponent <Square>().color == 1) { sosed.isbrick = true; } else { sosed.mincost = min_item.mincost + dist2(min_item.ind, sosed.ind); sosed.hcost = dist2(sosed.ind, sendpoint); sosed.fincost = sosed.hcost + sosed.mincost; sosed.parent = min_item; } } if (!sosed.isbrick) //если стенка, то пропускаем { float d = min_item.mincost + dist2(min_item.ind, sosed.ind); if (d < sosed.mincost) { sosed.parent = min_item; sosed.mincost = d; sosed.fincost = sosed.hcost + sosed.mincost; } if (!closed.Contains(sosed))//если уже прошлись, то пропускаем { if (!open.Contains(sosed)) { open.Add(sosed); } } } } if (win) { break; } } if (!win) { return(path); } pf_container cur = scont[sendpoint.x, sendpoint.y]; while (cur.parent != scont[sstartpoint.x, sstartpoint.y]) { path.Add(cur); cur = cur.parent; } path.Add(cur); cur = cur.parent; path.Add(cur); foreach (pf_container node in open) { node.go.GetComponent <Square>().color = 2; } foreach (pf_container node in closed) { node.go.GetComponent <Square>().color = 3; } return(path); }