Skip to content

Commit

Permalink
Implement centroid with boost variant
Browse files Browse the repository at this point in the history
  • Loading branch information
tin1254 committed Sep 6, 2021
1 parent 1a47bc6 commit 2fe2200
Showing 1 changed file with 11 additions and 24 deletions.
35 changes: 11 additions & 24 deletions filters/include/pcl/filters/experimental/voxel_grid.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include <pcl/filters/experimental/cartesian_filter.h>
#include <pcl/filters/filter.h>

#include <boost/variant.hpp>

#include <unordered_map>

namespace pcl {
Expand All @@ -22,48 +24,33 @@ namespace experimental {
template <typename PointT>
struct Voxel {

union Centroid {
Centroid() {}
~Centroid() {}

CentroidPoint<PointT>* all_fields;
Eigen::Array4f xyz;
};

Voxel(const bool downsample_all_data) : downsample_all_data_(downsample_all_data)
{
num_pt_ = 0;
if (downsample_all_data_)
centroid_.all_fields = new CentroidPoint<PointT>();
else
centroid_.xyz = Eigen::Array4f::Zero();
}
~Voxel()
{
if (downsample_all_data_)
delete centroid_.all_fields;
centroid_ = CentroidPoint<PointT>();
else
centroid_.xyz.~Array();
centroid_ = Eigen::Array4f::Zero();
}

inline void
add(const PointT& pt)
{
num_pt_++;
if (downsample_all_data_)
centroid_.all_fields->add(pt);
boost::get<CentroidPoint<PointT>>(centroid_).add(pt);
else
centroid_.xyz += pt.getArray4fMap();
boost::get<Eigen::Array4f>(centroid_) += pt.getArray4fMap();
}

inline PointT
get() const
{
PointT pt;
if (downsample_all_data_)
centroid_.all_fields->get(pt);
boost::get<CentroidPoint<PointT>>(centroid_).get(pt);
else
pt.getArray4fMap() = centroid_.xyz / num_pt_;
pt.getArray4fMap() = boost::get<Eigen::Array4f>(centroid_) / num_pt_;
return pt;
}

Expand All @@ -72,9 +59,9 @@ struct Voxel {
{
num_pt_ = 0;
if (downsample_all_data_)
centroid_.all_fields->clear();
boost::get<CentroidPoint<PointT>>(centroid_).clear();
else
centroid_.xyz.setZero();
boost::get<Eigen::Array4f>(centroid_).setZero();
}

inline std::size_t
Expand All @@ -85,7 +72,7 @@ struct Voxel {

protected:
const bool downsample_all_data_;
Centroid centroid_;
boost::variant<CentroidPoint<PointT>, Eigen::Array4f> centroid_; // std::variant for C++17
std::size_t num_pt_;
};

Expand Down

0 comments on commit 2fe2200

Please sign in to comment.