55 {
56 CHECK_GT(_grid_radius, 0.0);
57 CHECK_GT(_cell_size, 0.0);
58
59
60 _num_points = static_cast<int>(cloud->size());
61 const double min_grid_radius = _grid_radius / 10.0;
62 float min_x = static_cast<float>(-min_grid_radius);
63 float min_y = static_cast<float>(-min_grid_radius);
64 float max_x = static_cast<float>(min_grid_radius);
65 float max_y = static_cast<float>(min_grid_radius);
66
67 for (size_t i = 0; i < cloud->size(); ++i) {
68 auto pt = (*cloud)[i];
69 max_x = std::max(max_x, pt.x);
70 min_x = std::min(min_x, pt.x);
71 max_y = std::max(max_y, pt.y);
72 min_y = std::min(min_y, pt.y);
73 }
74 CHECK_LE(min_x, max_x);
75 CHECK_LE(min_y, max_y);
76
77 const float lower_x = std::max(min_x, -_grid_radius);
78 const float lower_y = std::max(min_y, -_grid_radius);
79 const float upper_x = std::min(max_x, _grid_radius);
80 const float upper_y = std::min(max_y, _grid_radius);
81 _offset_x = -lower_x;
82 _offset_y = -lower_y;
83 _grid_num_rows = static_cast<int>(ceil((upper_y - lower_y) / _cell_size)) + 1;
84 _grid_num_cols = static_cast<int>(ceil((upper_x - lower_x) / _cell_size)) + 1;
85 CHECK_GT(_grid_num_rows, 0);
86 CHECK_GT(_grid_num_cols, 0);
87 _grid_size = _grid_num_rows * _grid_num_cols;
88
89 _point_cloud_grid_idx.assign(_num_points, -1);
90 _label.assign(_grid_size, kEmptyGridLabel);
91 for (int i = 0; i < _num_points; ++i) {
92 const int idx =
Pos((*cloud)[i].x, (*cloud)[i].y);
93 if (idx >= 0) {
94 _point_cloud_grid_idx[i] = idx;
95 _label[idx] = kNonEmptyGridLabel;
96 }
97 }
98}
int Pos(float x, float y) const
Get row and col position