34class AABBIGL :
public BVH<_VertexArray, _ElementArray>
37 using Parent = BVH<_VertexArray, _ElementArray>;
38 using VertexArray =
typename Parent::VertexArray;
39 using ElementArray =
typename Parent::ElementArray;
40 using Scalar =
typename Parent::Scalar;
41 using Index =
typename Parent::Index;
42 using PointType =
typename Parent::PointType;
44 using AABB = igl::AABB<VertexArray, 3>;
58 bool does_support_triangles()
const override
62 bool does_support_lines()
const override
67 void build(
const VertexArray& vertices,
const ElementArray& elements)
override
69 la_runtime_assert(elements.cols() == 3,
"LibIGL AABB only supports triangles mesh");
70 m_vertices = vertices;
71 m_elements = elements;
72 m_aabb.init(m_vertices, m_elements);
75 void build(
const VertexArray&)
override
84 ClosestPoint query_closest_point(
const PointType& p)
const override
89 m_aabb.squared_distance(m_vertices, m_elements, p, idx, r.closest_point);
92 compute_closest_vertex_within_element(r, p);
97 std::vector<ClosestPoint> query_k_nearest_neighbours(
const PointType& p,
int k)
const override
101 throw std::runtime_error(
"LibIGL AABB does not support KNN queries");
108 std::vector<ClosestPoint> query_in_sphere_neighbours(
const PointType&,
const Scalar)
111 throw std::runtime_error(
"LibIGL AABB does not support radius queries");
116 const auto num_queries = query_pts.rows();
117 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> sq_dists(num_queries);
118 Eigen::Matrix<Index, Eigen::Dynamic, 1> embedding_elements(num_queries);
119 VertexArray closest_points(num_queries, m_vertices.cols());
121 m_aabb.squared_distance(
129 std::vector<ClosestPoint> r(num_queries);
130 for (
auto i :
range(num_queries)) {
131 r[i].embedding_element_idx = embedding_elements[i];
132 r[i].squared_distance = sq_dists[i];
133 r[i].closest_point = closest_points.row(i);
134 compute_closest_vertex_within_element(r[i], query_pts.row(i));
144 void compute_closest_vertex_within_element(ClosestPoint& entry,
const PointType& p)
const
146 assert(entry.embedding_element_idx >= 0);
148 const auto vertex_per_element = m_elements.cols();
149 Scalar min_v_dist = std::numeric_limits<Scalar>::max();
150 for (
auto i :
range(vertex_per_element)) {
151 const auto vid = m_elements(entry.embedding_element_idx, i);
152 const auto sq_dist = (m_vertices.row(vid) - p).squaredNorm();
153 if (sq_dist < min_v_dist) {
154 min_v_dist = sq_dist;
155 entry.closest_vertex_idx = vid;
162 VertexArray m_vertices;
163 ElementArray m_elements;
constexpr auto safe_cast(SourceType value) -> std::enable_if_t<!std::is_same< SourceType, TargetType >::value, TargetType >
Perform safe cast from SourceType to TargetType, where "safe" means:
Definition safe_cast.h:50