4#include <box2d/box2d.h>
5#include <unordered_map>
42 return x == other.
x &&
y == other.
y;
63 return std::hash<int>()(cell.
x) ^ (std::hash<int>()(cell.
y) << 1);
91 return {
static_cast<int>(std::floor(x / cell_size)),
92 static_cast<int>(std::floor(y / cell_size))};
110 while (a <= -M_PI) a += 2 * M_PI;
111 while (a > M_PI) a -= 2 * M_PI;
118 void add_interval(
float a,
float b, std::vector<Interval>& ivs);
121 bool fully_covered(
float a,
float b,
const std::vector<Interval>& ivs);
127 return std::fabs(
wrap(bearing - center)) <= half_ap;
136std::unordered_map<GridCell,std::vector<std::size_t>,
GridCellHash>
144std::vector<Candidate>
154 std::vector<std::size_t>,
160std::vector<std::size_t>
183 bool enable_occlusion =
true);
201 const std::vector<std::shared_ptr<PogobotObject>>& robots,
220 float k = std::floor(x / L);
226 if (d > L * 0.5f) d -= L;
227 if (d <= -L * 0.5f) d += L;
231inline b2Vec2
torus_delta(b2Vec2 a, b2Vec2 b, b2Vec2 dom_min,
float Lx,
float Ly) {
232 float ax = a.x - dom_min.x, ay = a.y - dom_min.y;
233 float bx = b.x - dom_min.x, by = b.y - dom_min.y;
240 std::vector<std::shared_ptr<PogobotObject>>& robots,
245 bool enable_occlusion =
true);
249std::unordered_map<GridCell,std::vector<std::size_t>,
GridCellHash>
void find_neighbors_to_pogowalls(std::vector< std::shared_ptr< Pogowall > > &pogowalls, ir_direction dir, std::vector< std::shared_ptr< PogobotObject > > &robots)
Finds robots that are close to given pogowalls.
Definition distances.cpp:243
std::vector< std::size_t > filter_visible(const std::vector< Candidate > &cand)
Definition distances.cpp:99
float wrap01(float x, float L)
Definition distances.h:219
std::unordered_map< GridCell, std::vector< std::size_t >, GridCellHash > build_spatial_hash_periodic(span_t< float > xs, span_t< float > ys, float cell_size, b2Vec2 domain_min, float domain_w, float domain_h)
Definition distances.cpp:270
b2Vec2 torus_delta(b2Vec2 a, b2Vec2 b, b2Vec2 dom_min, float Lx, float Ly)
Definition distances.h:231
std::vector< float > compute_wall_distances(ir_direction dir, const std::vector< std::shared_ptr< PogobotObject > > &robots, const arena_polygons_t &arena_polygons)
Compute, for every robot, the distance from its IR–emitter dir to the nearest arena wall.
Definition distances.cpp:209
constexpr std::array< GridCell, 9 > precomputed_neighbor_cells
Precomputed offsets for neighbor grid cells.
Definition distances.h:73
float euclidean_distance(const b2Vec2 &a, const b2Vec2 &b)
Computes the Euclidean distance between two 2D points.
Definition distances.cpp:11
void find_neighbors_periodic(ir_direction dir, std::vector< std::shared_ptr< PogobotObject > > &robots, float max_distance, b2Vec2 domain_min, float domain_w, float domain_h, bool enable_occlusion=true)
Definition distances.cpp:395
std::unordered_map< GridCell, std::vector< std::size_t >, GridCellHash > build_spatial_hash(span_t< float > xs, span_t< float > ys, float cell_size)
Definition distances.cpp:41
GridCell get_grid_cell(float x, float y, float cell_size)
Converts a 2D position to a grid cell index.
Definition distances.h:90
float delta_periodic(float d, float L)
Definition distances.h:224
std::vector< Candidate > collect_candidates(std::size_t i, span_t< float > xs, span_t< float > ys, span_t< float > cx, span_t< float > cy, span_t< float > body_rad, span_t< float > comm_rad, span_t< float > led_dir, const std::unordered_map< GridCell, std::vector< std::size_t >, GridCellHash > &hash, float cell_size, bool clip_fov)
Definition distances.cpp:52
void find_neighbors(ir_direction dir, std::vector< std::shared_ptr< PogobotObject > > &robots, float maxDistance, bool enable_occlusion=true)
Finds neighboring robots within a specified maximum distance.
Definition distances.cpp:129
std::vector< std::vector< b2Vec2 > > arena_polygons_t
Definition geometry.h:13
Definition distances.h:108
bool in_fov(float bearing, float center, float half_ap)
Definition distances.h:123
bool fully_covered(float a, float b, const std::vector< Interval > &ivs)
Definition distances.cpp:30
float wrap(float a)
Definition distances.h:109
void add_interval(float a, float b, std::vector< Interval > &ivs)
Definition distances.cpp:19
ir_direction
Definition spogobot.h:148
Definition distances.h:98
float half_ap
Definition distances.h:102
std::size_t idx
Definition distances.h:99
float angle
Definition distances.h:101
float dist_sq
Definition distances.h:100
Hash functor for GridCell.
Definition distances.h:52
std::size_t operator()(const GridCell &cell) const
Computes a hash value for a GridCell.
Definition distances.h:61
Represents a cell in a spatial grid.
Definition distances.h:31
int y
The x and y coordinates of the grid cell.
Definition distances.h:32
int x
Definition distances.h:32
bool operator==(const GridCell &other) const
Compares two GridCell objects for equality.
Definition distances.h:41
Definition distances.h:115
float b
Definition distances.h:115
float a
Definition distances.h:115
const std::vector< T > & span_t
Definition utils.h:23