87 Eigen::Vector4f min_p, max_p;
91 std::int64_t dx =
static_cast<std::int64_t
> ((max_p[0] - min_p[0]) *
inverse_resolution_)+1;
92 std::int64_t dy =
static_cast<std::int64_t
> ((max_p[1] - min_p[1]) *
inverse_resolution_)+1;
94 if ((dx*dy) >
static_cast<std::int64_t
> (std::numeric_limits<std::int32_t>::max ()))
96 PCL_WARN (
"[pcl::%s::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow.\n",
getClassName ().c_str ());
100 Eigen::Vector4i min_b, max_b, div_b, divb_mul;
109 div_b = max_b - min_b + Eigen::Vector4i::Ones ();
113 divb_mul = Eigen::Vector4i (1, div_b[0], 0, 0);
115 std::vector<point_index_idx> index_vector;
116 index_vector.reserve (
indices_->size ());
121 for (
const auto& index : (*
indices_))
132 int idx = ijk0 * divb_mul[0] + ijk1 * divb_mul[1];
133 index_vector.emplace_back(
static_cast<unsigned int> (idx), index);
138 std::sort (index_vector.begin (), index_vector.end (), std::less<> ());
142 unsigned int total = 0;
143 unsigned int index = 0;
148 std::vector<std::pair<unsigned int, unsigned int> > first_and_last_indices_vector;
151 first_and_last_indices_vector.reserve (index_vector.size ());
152 while (index < index_vector.size ())
154 unsigned int i = index + 1;
155 while (i < index_vector.size () && index_vector[i].idx == index_vector[index].idx)
158 first_and_last_indices_vector.emplace_back(index, i);
163 indices.resize (total);
167 for (
const auto &cp : first_and_last_indices_vector)
169 unsigned int first_index = cp.first;
170 unsigned int last_index = cp.second;
171 unsigned int min_index = index_vector[first_index].cloud_point_index;
172 float min_z = (*input_)[index_vector[first_index].cloud_point_index].z;
174 for (
unsigned int i = first_index + 1; i < last_index; ++i)
176 if ((*
input_)[index_vector[i].cloud_point_index].z < min_z)
178 min_z = (*input_)[index_vector[i].cloud_point_index].z;
179 min_index = index_vector[i].cloud_point_index;
183 indices[index] = min_index;
188 oii = indices.size ();
191 indices.resize (oii);
void getMinMax3D(const pcl::PointCloud< PointT > &cloud, PointT &min_pt, PointT &max_pt)
Get the minimum and maximum values on each of the 3 (x-y-z) dimensions in a given pointcloud.
void copyPointCloud(const pcl::PointCloud< PointInT > &cloud_in, pcl::PointCloud< PointOutT > &cloud_out)
Copy all the fields from a given point cloud into a new point cloud.