private void SolutionFinderFromDb(Point3D vertex, PathRegion pathRegion, ref PathRegion finalPathRegion, ref bool isSolutionFind, int[,] adjencyMatrix, List <GraphVertex> graphVertices, int pEnd, int pStart) { rbLog.AppendText("Определение подходящего региона..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); RegionType regionType = PathRegion.GetRegionType(vertex, pathRegion); if (!regionType.Equals(RegionType.None)) { rbLog.AppendText("Регион определен. Обновление региона..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); PathRegion newExtraRegion = PathRegion.GetNewPathRegionUsingDbRP(pathRegion, regionType, vertex, _safeDistance); Stack <int> stackFirstManipulator = new Stack <int>(); int iteration = 0; int pathStackCapacity = -1; do { if (iteration.Equals(0)) { rbLog.AppendText("Достраиваем граф на первой итерации..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); GetGraphPath(newExtraRegion, pEnd, pStart); } else { rbLog.AppendText("Добавляем вершины по общему региону..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); GetGraphPath(finalPathRegion, pEnd, pStart); } rbLog.AppendText("Обрабатываем карту алгоритмом Дейкстры..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); pStart = GetIndexVertex(_startPoint); pEnd = GetIndexVertex(_endPoint); Deikstra(ref _graphVertices, _adjencyMatrixManipulator, pStart); rbLog.AppendText("Пытаемся найти путь..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); stackFirstManipulator = GetPathAfterDeikstra(_graphVertices, _adjencyMatrixManipulator, pEnd); pathStackCapacity = stackFirstManipulator.Count; rbLog.AppendText("Проверка, что путь найден..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); if (stackFirstManipulator.Count > 1) { rbLog.AppendText("Путь найден..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); GetFinalPathAndDraw(stackFirstManipulator, Brushes.Purple, _graphVertices, _startPoint, _endPoint); } else { rbLog.AppendText("Путь не найден..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); } rbLog.AppendText("Обновляем регион..\n"); rbLog.ScrollToCaret(); rbLog.Refresh(); finalPathRegion = PathRegion.ConnectTwoPathRegions(pathRegion, newExtraRegion); iteration++; }while (pathStackCapacity <= 1); } else { isSolutionFind = false; } }