Skip to content

Commit 2d20a69

Browse files
committed
feat: improve quality results
1 parent 7ca6f18 commit 2d20a69

File tree

3 files changed

+33
-25
lines changed

3 files changed

+33
-25
lines changed

src/core/closest_point_query.cpp

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,33 +43,45 @@ bool ClosestPointQuery::get_closest_point(
4343
0.0f, // epsilon
4444
true); // true means we want results to be sorted by squared dist
4545

46-
std::vector<std::size_t> ret_index(1);
47-
std::vector<float> out_dist_sqr(1);
46+
// Take the 10 closest and keep the best out of them.
47+
const std::size_t expected_result_count = 200;
48+
std::vector<std::size_t> ret_index(expected_result_count);
49+
std::vector<float> out_dist_sqr(expected_result_count);
4850
const std::size_t num_results =
4951
m_tree_index.knnSearch(
5052
glm::value_ptr(query_point),
51-
1, // We only want 1 result, the closest one.
53+
expected_result_count,
5254
&ret_index[0],
5355
&out_dist_sqr[0]);
5456

55-
if (num_results == 0)
56-
return false;
57-
58-
glm::vec3 v1, v2, v3;
59-
m_mesh_point_cloud.get_triangle(ret_index[0], v1, v2, v3);
60-
61-
result = closest_point_in_triangle(
62-
query_point,
63-
v1,
64-
v2,
65-
v3);
66-
67-
const float distance2_to_triangle = distance2(result, query_point);
68-
69-
if (distance2_to_triangle > max_distance)
70-
return false;;
71-
72-
return true;
57+
bool found = false;
58+
float closest_distance2 = 0.0f;
59+
60+
for (std::size_t result_index = 0; result_index < num_results; ++result_index)
61+
{
62+
// Ask the triangle to the point cloud.
63+
glm::vec3 v1, v2, v3;
64+
m_mesh_point_cloud.get_triangle(ret_index[result_index], v1, v2, v3);
65+
66+
// Compute the point on the triangle.
67+
glm::vec3 p = closest_point_in_triangle(
68+
query_point,
69+
v1,
70+
v2,
71+
v3);
72+
73+
// Keep the best.
74+
const float distance2_to_triangle = distance2(p, query_point);
75+
76+
if (distance2_to_triangle < max_distance
77+
&& (!found || distance2_to_triangle < closest_distance2))
78+
{
79+
found = true;
80+
result = p;
81+
}
82+
}
83+
84+
return found;
7385
}
7486

7587
} // namespace core

src/core/closest_point_query.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ class ClosestPointQuery
4242
3, /* Go 3D! */
4343
size_t> TreeIndex;
4444
TreeIndex m_tree_index;
45-
46-
typedef std::vector<std::pair<std::size_t, float>> TreeSearchVectorResult;
4745
};
4846

4947
} // namespace core

src/core/math.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
#include <glm/glm.hpp>
44

5-
#include <iostream>
6-
75
namespace core
86
{
97

0 commit comments

Comments
 (0)