29 std::vector<double> distances;
31 std::vector<size_t> indices;
33 indices.resize(cloud.size(), 0);
36 for (
size_t i = 0; i < cloud.size(); ++i) {
38 nodes.push_back(
Kdtree::KdNode(cloud[i].as_vector(), (
void *)&indices[i]));
42 for (
size_t point_index_b = 0; point_index_b < cloud.size(); ++point_index_b) {
44 Point point_b = cloud[point_index_b];
46 std::vector<triplet> triplet_candidates;
50 for (
size_t result_index_a = 1; result_index_a < result.size(); ++result_index_a) {
52 if (distances[result_index_a] == 0)
54 Point point_a(result[result_index_a].point);
55 size_t point_index_a = *(
size_t *)result[result_index_a].data;
57 Point direction_ab = point_b - point_a;
58 double ab_norm = direction_ab.
norm();
59 direction_ab = direction_ab / ab_norm;
61 for (
size_t result_index_c = result_index_a + 1; result_index_c < result.size(); ++result_index_c) {
63 if (distances[result_index_c] == 0)
65 Point point_c =
Point(result[result_index_c].point);
66 size_t point_index_c = *(
size_t *)result[result_index_c].data;
68 Point direction_bc = point_c - point_b;
69 double bc_norm = direction_bc.
norm();
70 direction_bc = direction_bc / bc_norm;
72 const double angle = direction_ab * direction_bc;
75 const double error = 1.0f - angle;
79 Point center = (point_a + point_b + point_c) / 3.0
f;
82 Point direction = point_c - point_b;
83 direction = direction / direction.
norm();
90 new_triplet.
center = center;
92 new_triplet.
error = error;
94 triplet_candidates.push_back(new_triplet);
100 std::sort(triplet_candidates.begin(), triplet_candidates.end());
103 for (
size_t i = 0; i < std::min(n, triplet_candidates.size()); ++i) {
104 triplets.push_back(triplet_candidates[i]);
118 const double perpendicularDistanceA =
120 const double perpendicularDistanceB =
128 if (std::fabs(anglecos) < 1.0e-8) {
131 return (std::sqrt(std::max(perpendicularDistanceA, perpendicularDistanceB)) / this->scale +
132 std::fabs(std::tan(std::acos(anglecos))));