100 const Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 6, 6> > solver (covariance_matrix, Eigen::EigenvaluesOnly);
101 const double max_ev = solver.eigenvalues (). maxCoeff ();
102 const double min_ev = solver.eigenvalues (). minCoeff ();
103 return (max_ev / min_ev);
116 Eigen::Matrix<double, 6, Eigen::Dynamic> f_mat = Eigen::Matrix<double, 6, Eigen::Dynamic> (6,
indices_->size ());
121 f_mat.block<3, 1> (3, p_i) = (*
input_normals_)[(*indices_)[p_i]].getNormalVector3fMap ().template cast<double> ();
125 covariance_matrix.noalias() = f_mat * f_mat.transpose ();
133 Eigen::Matrix<double, 6, 6> c_mat;
138 const Eigen::SelfAdjointEigenSolver<Eigen::Matrix<double, 6, 6> > solver (c_mat);
139 const Eigen::Matrix<double, 6, 6> x = solver.eigenvectors ();
143 std::vector<std::size_t> candidate_indices;
144 candidate_indices.resize (
indices_->size ());
145 for (std::size_t p_i = 0; p_i < candidate_indices.size (); ++p_i)
146 candidate_indices[p_i] = p_i;
149 using Vector6d = Eigen::Matrix<double, 6, 1>;
150 std::vector<Vector6d, Eigen::aligned_allocator<Vector6d> > v;
151 v.resize (candidate_indices.size ());
152 for (std::size_t p_i = 0; p_i < candidate_indices.size (); ++p_i)
156 v[p_i].block<3, 1> (3, 0) = (*
input_normals_)[(*indices_)[candidate_indices[p_i]]].getNormalVector3fMap ().template cast<double> ();
161 std::vector<std::list<std::pair<int, double> > > L;
164 for (std::size_t i = 0; i < 6; ++i)
166 for (std::size_t p_i = 0; p_i < candidate_indices.size (); ++p_i)
167 L[i].emplace_back(p_i, std::abs (v[p_i].dot (x.block<6, 1> (0, i))));
174 std::vector<double> t (6, 0.0);
177 std::vector<bool> point_sampled (candidate_indices.size (),
false);
179 for (std::size_t sample_i = 0; sample_i <
num_samples_; ++sample_i)
182 std::size_t min_t_i = 0;
183 for (std::size_t i = 0; i < 6; ++i)
185 if (t[min_t_i] > t[i])
190 while (point_sampled [L[min_t_i].front ().first])
191 L[min_t_i].pop_front ();
193 sampled_indices[sample_i] = L[min_t_i].front ().first;
194 point_sampled[L[min_t_i].front ().first] =
true;
195 L[min_t_i].pop_front ();
198 for (std::size_t i = 0; i < 6; ++i)
200 double val = v[sampled_indices[sample_i]].dot (x.block<6, 1> (0, i));
206 for (
auto &sampled_index : sampled_indices)
207 sampled_index = (*indices_)[candidate_indices[sampled_index]];