@@ -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
0 commit comments