Exemplo n.º 1
0
        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;
            }
        }