25 VIPRA::f_pnt distance{std::numeric_limits<VIPRA::f_pnt>::max()};
29 void intialize(
auto const& map, VIPRA::f_pnt gridSize)
38 gridPoint.pedCount = 0;
42 [[nodiscard]]
auto get_grid(
VIPRA::f3d pos) -> GridPoint&
46 [[nodiscard]]
auto get_grid(VIPRA::f3d pos)
const ->
GridPoint const&
51 [[nodiscard]]
auto get_x_count() const ->
size_t {
return _xCount; }
52 [[nodiscard]]
auto get_y_count() const ->
size_t {
return _xCount; }
54 [[nodiscard]]
auto get_ped_count_at_idx(VIPRA::idx idx)
const ->
int
56 return _grid[idx].pedCount;
59 [[nodiscard]]
auto begin() -> std::vector<GridPoint>::iterator {
return _grid.begin(); }
60 [[nodiscard]]
auto end() -> std::vector<GridPoint>::iterator {
return _grid.end(); }
82 auto gridX =
static_cast<VIPRA::idx
>(std::floor(pos.x / _gridSize));
83 auto gridY =
static_cast<VIPRA::idx
>(std::floor(pos.y / _gridSize));
85 auto const idx = get_index(gridX, gridY, _xCount);
87 if ( out_of_bounds(gridX, gridY) ) {
89 throw std::runtime_error(
"Grid index is out of bounds");
97 auto gridX =
static_cast<VIPRA::idx
>(std::floor(pos.x / _gridSize));
98 auto gridY =
static_cast<VIPRA::idx
>(std::floor(pos.y / _gridSize));
100 return VIPRA::f3d{_gridSize *
static_cast<VIPRA::f_pnt
>(gridX),
101 _gridSize *
static_cast<VIPRA::f_pnt
>(gridY)};
105 VIPRA::size _xCount{};
106 VIPRA::size _yCount{};
107 VIPRA::f_pnt _gridSize{};
109 std::vector<GridPoint> _grid;
116 void set_grid_counts(
auto const& map)
118 const VIPRA::f3d dimensions = map.get_dimensions();
120 assert(dimensions.x > 0 && dimensions.y > 0);
121 assert(_gridSize > 0);
123 _xCount =
static_cast<VIPRA::idx
>(std::ceil(dimensions.x / _gridSize) + 1);
124 _yCount =
static_cast<VIPRA::idx
>(std::ceil(dimensions.y / _gridSize) + 1);
135 [[nodiscard]]
static auto get_index(VIPRA::size gridX, VIPRA::size gridY,
136 VIPRA::size xCount)
noexcept -> VIPRA::idx
138 return gridX + (gridY * xCount);
146 void construct_grid(
auto const& map)
148 set_grid_counts(map);
150 assert(_xCount > 0 && _yCount > 0);
152 _grid = std::vector<GridPoint>(_xCount * _yCount);
155 [[nodiscard]] VIPRA_INLINE
auto out_of_bounds(VIPRA::f_pnt gridX,
156 VIPRA::f_pnt gridY)
const ->
bool
158 return gridX < 0 || gridX >=
static_cast<VIPRA::f_pnt
>(_xCount) * _gridSize ||
159 gridY < 0 || gridY >=
static_cast<VIPRA::f_pnt
>(_yCount) * _gridSize;
162 [[nodiscard]] VIPRA_INLINE
auto out_of_bounds(
size_t gridX,
size_t gridY)
const ->
bool
164 return gridX < 0 || gridX >= _xCount || gridY < 0 || gridY >= _yCount;
168 DensityGrid() =
default;
169 DensityGrid(
const DensityGrid&) =
default;
170 DensityGrid(DensityGrid&&) noexcept = default;
171 auto operator=(const DensityGrid&) -> DensityGrid& = default;
172 auto operator=(DensityGrid&&) noexcept -> DensityGrid& = default;
173 ~DensityGrid() = default;
static VIPRA_INLINE void error(fmt::format_string< param_ts... > message, param_ts &&... params)
Calls the provided Logger with Level DEBUG.
Definition logging.hpp:102