Locus No Pilotus
Project of four first grade MIPT DAFE/RSE students (for engineering practical work in the second semester) in Qt C++
Loading...
Searching...
No Matches
path_graph.h
Go to the documentation of this file.
1#pragma once
2
3// std libs:
4#include <map>
5
6// our code libs:
7#include "obstacles.h"
8
9namespace math {
10
11/// @brief Вершина графа
13 /**
14 * @brief PathWayNode
15 * @param p координаты
16 * @param n номер вершины
17 */
18 PathWayNode(Point p, std::size_t n, bool is_const)
19 : point{p}, number{n}, is_visited{false}, is_constant{is_const} {}
20
21 // Ребра данной вершины
22 std::vector<std::shared_ptr<PathWayNode>> edges;
23
24 // Длины ребер
25 std::vector<double> edges_lens;
26
27 std::shared_ptr<CircleObstacle> circle_ptr = nullptr;
28
29 std::shared_ptr<PolygonObstacle> poly_ptr = nullptr;
30
31 // Координаты вершины
33
34 // Номер вершины
35 std::size_t number;
36
37 // Была ли уже посещена вершина
38 // в алгоритме Дейкстры
40
41 // Явлеяется ли точка постоянной в графе
43};
44
45/// @brief Граф вершин между контрольными точками
47 // Вершины графа
48 std::vector<std::shared_ptr<PathWayNode>> nodes;
49
50 // Добавить новую вершину
51 void AddNode(PathWayNode* new_node) { nodes.emplace_back(new_node); }
52
53 // Удалить временные вершины
55 std::size_t i = 0;
56 while (i < nodes.size()) {
57 if (nodes[i]->is_constant) {
58 ++i;
59 continue;
60 }
61 for (const auto& other_node : nodes[i]->edges) {
62 std::size_t j = 0;
63 while (j < other_node->edges.size()) {
64 if (nodes[i]->point != other_node->edges[j]->point) {
65 ++j;
66 continue;
67 }
68 other_node->edges.erase(other_node->edges.begin() + j);
69 other_node->edges_lens.erase(other_node->edges_lens.begin() + j);
70 break;
71 }
72 }
73 nodes.erase(nodes.begin() + i);
74 }
75 }
76
77 // Добавить новое ребро
78 void AddEdge(std::size_t node_1, std::size_t node_2, double length) {
79 std::shared_ptr<PathWayNode> node_ptr1, node_ptr2;
80
81 for (auto node : nodes) {
82 if (node->number == node_1)
83 node_ptr1 = node;
84 else if (node->number == node_2)
85 node_ptr2 = node;
86 }
87
88 node_ptr1->edges.push_back(node_ptr2);
89 node_ptr1->edges_lens.push_back(length);
90 node_ptr2->edges.push_back(node_ptr1);
91 node_ptr2->edges_lens.push_back(length);
92 }
93};
94
95/// @brief Реализация алгоритма Дейкстры
97 public:
98 /**
99 * @brief Инициализирует новый экземпляр Dijkstras_algorithm
100 * @param start: начальная точка
101 * @param end: конечная точка
102 */
104 : first_point_{graph.nodes.size() - 2},
105 second_point_{graph.nodes.size() - 1},
106 path_nodes_{graph.nodes},
107 min_length_{0} {
111 }
112
113 // Возвращает длину кратчайшего пути
114 double Get_Min_Len() const { return min_length_; }
115
116 // Возвращает кратчайший путь
117 std::vector<std::size_t> Get_Min_Path() const { return min_path_; }
118
119 private:
120 // Номер первой точки
121 std::size_t first_point_;
122
123 // Номер второй точки
124 std::size_t second_point_;
125
126 // Все вершины графа
127 std::vector<std::shared_ptr<PathWayNode>> path_nodes_;
128
129 // Длина кратчайшего пути из start_ в end_
131
132 // Кратчайший маршрут из start_ в end_
133 std::vector<std::size_t> min_path_;
134
135 // Кратчайшие найденные расстояния до рассматриваемых вершин
136 std::map<std::size_t, double> graphs_vertex_;
137
138 /**
139 * @brief Определяет длину кратчайшего пути из start_ в end_
140 */
141 void Calculate_Min_Path();
142};
143
144} // namespace math
Реализация алгоритма Дейкстры
Definition path_graph.h:96
std::vector< std::size_t > Get_Min_Path() const
Definition path_graph.h:117
std::size_t first_point_
Definition path_graph.h:121
std::vector< std::size_t > min_path_
Definition path_graph.h:133
void Calculate_Min_Path()
Определяет длину кратчайшего пути из start_ в end_.
Definition path_graph.cpp:9
std::map< std::size_t, double > graphs_vertex_
Definition path_graph.h:136
std::vector< std::shared_ptr< PathWayNode > > path_nodes_
Definition path_graph.h:127
double min_length_
Definition path_graph.h:130
std::size_t second_point_
Definition path_graph.h:124
DijkstrasAlgorithm(PathWayGraph graph)
Инициализирует новый экземпляр Dijkstras_algorithm.
Definition path_graph.h:103
double Get_Min_Len() const
Definition path_graph.h:114
Definition adjacency_matrix.cpp:7
Граф вершин между контрольными точками
Definition path_graph.h:46
void AddNode(PathWayNode *new_node)
Definition path_graph.h:51
std::vector< std::shared_ptr< PathWayNode > > nodes
Definition path_graph.h:48
void AddEdge(std::size_t node_1, std::size_t node_2, double length)
Definition path_graph.h:78
void RemoveNonConstantNodes()
Definition path_graph.h:54
Вершина графа
Definition path_graph.h:12
bool is_visited
Definition path_graph.h:39
std::vector< double > edges_lens
Definition path_graph.h:25
std::shared_ptr< CircleObstacle > circle_ptr
Definition path_graph.h:27
PathWayNode(Point p, std::size_t n, bool is_const)
PathWayNode.
Definition path_graph.h:18
std::size_t number
Definition path_graph.h:35
Point point
Definition path_graph.h:32
std::shared_ptr< PolygonObstacle > poly_ptr
Definition path_graph.h:29
bool is_constant
Definition path_graph.h:42
std::vector< std::shared_ptr< PathWayNode > > edges
Definition path_graph.h:22
Точка с геометрическими связями
Definition obstacles.h:46