15 #ifndef BELUGA_ALGORITHM_DISTANCE_MAP_HPP
16 #define BELUGA_ALGORITHM_DISTANCE_MAP_HPP
21 #include <range/v3/range/access.hpp>
22 #include <range/v3/range/primitives.hpp>
23 #include <range/v3/view/enumerate.hpp>
53 template <
class Range,
class DistanceFunction,
class NeighborsFunction>
56 DistanceFunction&& distance_function,
57 NeighborsFunction&& neighbors_function) {
59 std::size_t nearest_obstacle_index;
63 using DistanceType = std::invoke_result_t<DistanceFunction, std::size_t, std::size_t>;
64 auto distance_map = std::vector<DistanceType>(ranges::size(obstacle_map));
65 auto visited = std::vector<bool>(ranges::size(obstacle_map),
false);
67 auto compare = [&distance_map](
const IndexPair& first,
const IndexPair& second) {
68 return distance_map[first.index] > distance_map[second.index];
70 auto queue = std::priority_queue<IndexPair, std::vector<IndexPair>, decltype(compare)>{compare};
72 for (
auto [index, is_obstacle] : ranges::views::enumerate(obstacle_map)) {
74 visited[index] =
true;
75 distance_map[index] = 0;
76 queue.push(IndexPair{index, index});
80 while (!queue.empty()) {
81 auto parent = queue.top();
83 for (
const std::size_t index : neighbors_function(parent.index)) {
84 if (!visited[index]) {
85 visited[index] =
true;
86 distance_map[index] = distance_function(parent.nearest_obstacle_index, index);
87 queue.push(IndexPair{parent.nearest_obstacle_index, index});