26 #ifndef EMP_SURFACE_2D_H 27 #define EMP_SURFACE_2D_H 29 #include "../base/Ptr.h" 30 #include "../tools/functions.h" 37 template <
typename BODY_TYPE>
45 : max_pos(_width, _height), body_set() { ; }
63 for (
auto body : body_set) body.Delete();
71 void TestCollisions(std::function<
bool(BODY_TYPE &, BODY_TYPE &)> collide_fun) {
75 double max_radius = 0.0;
76 for (
auto body : body_set) {
77 if (body->GetRadius() > max_radius) max_radius = body->GetRadius();
81 const int num_cols = std::min<int>((int)(max_pos.
GetX() / (max_radius * 2.0)), 32);
82 const int num_rows = std::min<int>((int)(max_pos.
GetY() / (max_radius * 2.0)), 32);
83 const int max_col = num_cols-1;
84 const int max_row = num_rows-1;
86 const int num_sectors = num_cols * num_rows;
87 const double sector_width = max_pos.
GetX() / (double) num_cols;
88 const double sector_height = max_pos.
GetY() / (double) num_rows;
98 for (
auto body : body_set) {
101 const int cur_col = emp::ToRange<int>((int)(body->GetCenter().GetX()/sector_width), 0, max_col);
102 const int cur_row = emp::ToRange<int>((int)(body->GetCenter().GetY()/sector_height), 0, max_row);
105 for (
int i = std::max(0, cur_col-1); i <= std::min(cur_col+1, num_cols-1); i++) {
106 for (
int j = std::max(0, cur_row-1); j <= std::min(cur_row+1, num_rows-1); j++) {
107 const int sector_id = i + num_cols * j;
108 if (sector_set[sector_id].size() == 0)
continue;
110 for (
auto body2 : sector_set[sector_id]) {
112 if (collide_fun(*body, *body2)) hit_count++;
119 const int cur_sector = cur_col + cur_row * num_cols;
127 cur_body->FinalizePosition(max_pos);
emp::vector< Ptr< BODY_TYPE > > & GetBodySet()
Definition: Surface2D.h:52
constexpr TYPE GetX() const
Definition: Point2D.h:39
Surface2D & Clear()
Definition: Surface2D.h:62
const emp::vector< Ptr< BODY_TYPE > > & GetConstBodySet() const
Definition: Surface2D.h:53
Definition: Surface2D.h:38
void push_back(PB_Ts &&...args)
Definition: vector.h:189
Surface2D & AddBody(Ptr< BODY_TYPE > new_body)
Definition: Surface2D.h:56
double GetWidth() const
Definition: Surface2D.h:48
size_t size() const
Definition: vector.h:151
void TestCollisions(std::function< bool(BODY_TYPE &, BODY_TYPE &)> collide_fun)
Definition: Surface2D.h:71
~Surface2D()
Definition: Surface2D.h:46
double GetHeight() const
Definition: Surface2D.h:49
const Point & GetMaxPosition() const
Definition: Surface2D.h:50
If we are in emscripten, make sure to include the header.
Definition: array.h:37
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
#define emp_assert(...)
Definition: assert.h:199
constexpr TYPE GetY() const
Definition: Point2D.h:40
Surface2D(double _width, double _height)
Definition: Surface2D.h:44