예제 #1
0
        private void SavePathInfoInDatabase(PathResultInformation pathResultInformation)
        {
            DatabaseInformationInputer dbOut = new DatabaseInformationInputer();

            dbOut.info.Add(pathResultInformation);
            dbOut.SaveChanges();
        }
예제 #2
0
        private void btnStartAlgoritm_Click(object sender, EventArgs e)
        {
            _startPoint            = new Point3D((double)nudStartXVertex.Value, (double)nudStartYVertex.Value, (double)nudStartZVertex.Value);
            _endPoint              = new Point3D((double)nudEndXVertex.Value, (double)nudEndYVertex.Value, (double)nudEndZVertex.Value);
            _boxSize               = new Size3D((int)nudWidthObject.Value, (int)nudLengthObject.Value, (int)nudHeightObject.Value);
            _percentageComparer    = (int)nudPercentagePointCloud.Value;
            _iterations            = (int)nudIterationCount.Value;
            _distanceBetweenPoints = (int)nudDistanceBetweenVertexes.Value;
            _safeDistance          = GetSafeDistance(_boxSize);
            rbLog.AppendText("Обработка введенной информации..\n");
            rbLog.ScrollToCaret();
            rbLog.Refresh();
            DateTimeOffset             start                 = DateTimeOffset.Now;
            PathRegion                 finalPathRegion       = new PathRegion();
            Stack <int>                stackFirstManipulator = new Stack <int>();
            PathResultInformation      pathResultInformation = new PathResultInformation();
            DatabaseInformationInputer dbGet                 = new DatabaseInformationInputer();

            rbLog.AppendText("Получение информации из базы данных..\n");
            rbLog.ScrollToCaret();
            rbLog.Refresh();
            var getAllDb = (from p in dbGet.info
                            join c in dbGet.pathRegions on p.regionGraph.id equals c.id
                            where (c.maxX >= _startPoint.X && c.minX <= _startPoint.X && c.maxY >= _startPoint.Y && c.minY <= _startPoint.Y &&
                                   c.maxZ >= _startPoint.Z && c.minZ <= _startPoint.Z) ||
                            (c.maxX >= _endPoint.X && c.minX <= _endPoint.X && c.maxY >= _endPoint.Y && c.minY <= _endPoint.Y &&
                             c.maxZ >= _endPoint.Z && c.minZ <= _endPoint.Z)
                            select new
            {
                graphVertex = p.graphVertexes,
                adjencyMatrix = p.adjencyMatrix,
                obstaclesPoint = p.obstaclesPoint,
                pathRegion = p.regionGraph,
                safeDistance = p.safeDistance
            }).ToList();

            rbLog.AppendText("Проверка подходящих вариантов из базы данных..\n");
            rbLog.ScrollToCaret();
            rbLog.Refresh();
            if (!getAllDb.Count.Equals(0))
            {
                for (int i = 0; i < getAllDb.Count; i++)
                {
                    PathRegion         pathRegion     = getAllDb[i].pathRegion;
                    Tuple <bool, bool> comparerResult = PathParametersComparer.RegionCompare(_startPoint, _endPoint, pathRegion, _safeDistance);
                    bool isSolutionFind = false;
                    if (!comparerResult.Equals(new Tuple <bool, bool>(false, false)) &&
                        ComparerItemsInalizer.ComparerPointCloudComparerInPercenrage(_obstaclesPoints,
                                                                                     (List <Point3D>)CompleteSolutionAnalizer.GetObstaclesVertexes(getAllDb[i].obstaclesPoint), pathRegion) >= _percentageComparer &&
                        PathParametersComparer.AnalizeSafeDistance(_safeDistance, getAllDb[i].safeDistance))
                    {
                        switch (comparerResult)
                        {
                        case var tuple when tuple.Item1.Equals(true) && tuple.Item2.Equals(false):
                        {
                            rbLog.AppendText("Стартовая точка входит в регион. Идет достроение веротяностной карты (графа)..\n");
                            rbLog.ScrollToCaret();
                            rbLog.Refresh();
                            isSolutionFind            = true;
                            _adjencyMatrixManipulator = CompleteSolutionAnalizer.GetAdjencyMatrix(getAllDb[i].adjencyMatrix);
                            _graphVertices            = CompleteSolutionAnalizer.GetGraphVertexes(getAllDb[i].graphVertex);
                            _graphVertices.Add(new GraphVertex(_graphVertices.Count, _startPoint, true));
                            _graphVertices.Add(new GraphVertex(_graphVertices.Count, _endPoint, true));
                            SolutionFinderFromDb(_endPoint, pathRegion, ref finalPathRegion, ref isSolutionFind, _adjencyMatrixManipulator, _graphVertices,
                                                 _graphVertices.Count - 1, _graphVertices.Count - 2);
                            break;
                        }

                        case var tuple when tuple.Item1.Equals(false) && tuple.Item2.Equals(true):
                        {
                            rbLog.AppendText("Конечная точка входит в регион. Идет достроение вероятностной карты (графа)..\n");
                            rbLog.ScrollToCaret();
                            rbLog.Refresh();
                            isSolutionFind            = true;
                            _adjencyMatrixManipulator = CompleteSolutionAnalizer.GetAdjencyMatrix(getAllDb[i].adjencyMatrix);
                            _graphVertices            = CompleteSolutionAnalizer.GetGraphVertexes(getAllDb[i].graphVertex);
                            _graphVertices.Add(new GraphVertex(_graphVertices.Count, _startPoint, true));
                            _graphVertices.Add(new GraphVertex(_graphVertices.Count, _endPoint, true));
                            SolutionFinderFromDb(_startPoint, pathRegion, ref finalPathRegion, ref isSolutionFind, _adjencyMatrixManipulator, _graphVertices,
                                                 _graphVertices.Count - 1, _graphVertices.Count - 2);
                            break;
                        }

                        case var tuple when tuple.Item1.Equals(true) && tuple.Item2.Equals(true):
                        {
                            rbLog.AppendText("Обе точки входят в регион..\n");
                            rbLog.AppendText("Добавляем точки в карту..\n");
                            rbLog.ScrollToCaret();
                            rbLog.Refresh();
                            _adjencyMatrixManipulator = CompleteSolutionAnalizer.GetAdjencyMatrix(getAllDb[i].adjencyMatrix);
                            _graphVertices            = CompleteSolutionAnalizer.GetGraphVertexes(getAllDb[i].graphVertex);
                            List <GraphVertex> startEndVertexes = new List <GraphVertex>();
                            startEndVertexes.AddRange(new List <GraphVertex> {
                                    new GraphVertex(_graphVertices.Count, _startPoint, true),
                                    new GraphVertex(_graphVertices.Count + 1, _endPoint, true)
                                });
                            _adjencyMatrixManipulator = ResizeAdjencyMatrixManipulator(_adjencyMatrixManipulator, startEndVertexes.Count);
                            TryToConnect(_graphVertices, _distanceBetweenPoints, _adjencyMatrixManipulator, AlgoritmTryType.DatabaseDataWork, startEndVertexes);         ///////
                            _graphVertices.AddRange(startEndVertexes);
                            Deikstra(ref _graphVertices, _adjencyMatrixManipulator, _graphVertices.Count - 2);
                            stackFirstManipulator = GetPathAfterDeikstra(_graphVertices, _adjencyMatrixManipulator, _graphVertices.Count - 1);
                            GetFinalPathAndDraw(stackFirstManipulator, Brushes.Purple, _graphVertices, _startPoint, _endPoint);
                            finalPathRegion = pathRegion;
                            isSolutionFind  = true;
                            break;
                        }
                        }
                        if (isSolutionFind)
                        {
                            rbLog.AppendText("Решение найдено, происходит сохранение в базу данных..\n");
                            rbLog.ScrollToCaret();
                            rbLog.Refresh();
                            pathResultInformation = new PathResultInformation(finalPathRegion, _obstaclesPoints, _adjencyMatrixManipulator, _graphVertices, _safeDistance);
                            break;
                        }
                    }
                    if (!isSolutionFind)
                    {
                        _adjencyMatrixManipulator = new int[0, 0];
                        _graphVertices.Clear();
                        rbLog.AppendText("Не было найдено подходящих вариантов из базы данных..\n");
                        rbLog.ScrollToCaret();
                        rbLog.Refresh();
                    }
                }
            }
            else
            {
                rbLog.AppendText("Подходящих решений не найдено. Поиск нового решения..\n");
                rbLog.ScrollToCaret();
                rbLog.Refresh();
                WorkAtOverAgain(ref stackFirstManipulator, ref pathResultInformation);
            }
            try
            {
                SavePathInfoInDatabase(pathResultInformation);
            }
            catch (Exception ex)
            {
                WorkAtOverAgain(ref stackFirstManipulator, ref pathResultInformation);
                SavePathInfoInDatabase(pathResultInformation);
            }
            MessageBox.Show($"Путь найден!\n{start.ToString()}\n{DateTimeOffset.Now.ToString()}\nВсего вершин: {_graphVertices.Count}", "Оповещение", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }