25const int di[kNumDirections] = {+1, 0, -1, 0, +1, +1, -1, -1};
26const int dj[kNumDirections] = {0, +1, 0, -1, +1, -1, +1, -1};
32 const int irow =
static_cast<int>((y + _offset_y) / _cell_size);
33 if (!IsValidRowIndex(irow)) {
36 const int jcol =
static_cast<int>((x + _offset_x) / _cell_size);
37 if (!IsValidColIndex(jcol)) {
40 return irow * _grid_num_cols + jcol;
56 CHECK_GT(_grid_radius, 0.0);
57 CHECK_GT(_cell_size, 0.0);
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);
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);
74 CHECK_LE(min_x, max_x);
75 CHECK_LE(min_y, max_y);
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);
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;
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);
94 _point_cloud_grid_idx[i] = idx;
95 _label[idx] = kNonEmptyGridLabel;
130 std::vector<std::vector<int>>* segments_indices,
131 std::vector<int>* num_cells_per_segment) {
132 CHECK_NOTNULL(segments_indices);
133 CHECK_NOTNULL(num_cells_per_segment);
137 const int num_segments = GetConnectedComponents();
138 CHECK_GE(num_segments, 0);
140 segments_indices->clear();
141 segments_indices->resize(num_segments);
142 num_cells_per_segment->clear();
143 num_cells_per_segment->resize(num_segments, 0);
144 for (
int i = 0; i < _grid_size; ++i) {
145 if (_label[i] != kEmptyGridLabel) {
146 (*num_cells_per_segment)[_label[i]]++;
149 for (
int i = 0; i < _num_points; ++i) {
150 const int idx = _point_cloud_grid_idx[i];
152 (*segments_indices)[_label[idx]].push_back(i);