19#include <lagrange/utils/warnoff.h>
21#include <lagrange/utils/warnon.h>
24#include <lagrange/bvh/BVH.h>
25#include <lagrange/Logger.h>
26#include <lagrange/utils/assert.h>
27#include <lagrange/utils/safe_cast.h>
28#include <lagrange/utils/range.h>
33template <
typename _VertexArray,
typename _ElementArray = lagrange::Triangles>
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);
90 r.embedding_element_idx = safe_cast<Index>(idx);
92 compute_closest_vertex_within_element(r, p);
100 std::vector<ClosestPoint> query_k_nearest_neighbours(
const PointType& p,
int k)
const override
103 throw std::runtime_error(
"LibIGL AABB does not support KNN queries");
110 std::vector<ClosestPoint> query_in_sphere_neighbours(
const PointType&,
const Scalar)
113 throw std::runtime_error(
"LibIGL AABB does not support radius queries");
118 const auto num_queries = query_pts.rows();
119 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> sq_dists(num_queries);
120 Eigen::Matrix<Index, Eigen::Dynamic, 1> embedding_elements(num_queries);
121 VertexArray closest_points(num_queries, m_vertices.cols());
123 m_aabb.squared_distance(
131 std::vector<ClosestPoint> r(num_queries);
132 for (
auto i :
range(num_queries)) {
133 r[i].embedding_element_idx = embedding_elements[i];
134 r[i].squared_distance = sq_dists[i];
135 r[i].closest_point = closest_points.row(i);
136 compute_closest_vertex_within_element(r[i], query_pts.row(i));
146 void compute_closest_vertex_within_element(ClosestPoint& entry,
const PointType& p)
const
148 assert(entry.embedding_element_idx >= 0);
149 assert(entry.embedding_element_idx < safe_cast<Index>(m_elements.rows()));
150 const auto vertex_per_element = m_elements.cols();
151 Scalar min_v_dist = std::numeric_limits<Scalar>::max();
152 for (
auto i :
range(vertex_per_element)) {
153 const auto vid = m_elements(entry.embedding_element_idx, i);
154 const auto sq_dist = (m_vertices.row(vid) - p).squaredNorm();
155 if (sq_dist < min_v_dist) {
156 min_v_dist = sq_dist;
157 entry.closest_vertex_idx = vid;
164 VertexArray m_vertices;
165 ElementArray m_elements;
bool does_support_pointcloud() const override
Does it support supplying elements or just points?
Definition: AABBIGL.h:52
std::vector< ClosestPoint > batch_query_closest_point(const VertexArray &query_pts) const override
Batch query closest points.
Definition: AABBIGL.h:116
bool does_support_query_k_nearest_neighbours() const override
Query for the k nearest neighbours.
Definition: AABBIGL.h:96
BVHType get_bvh_type() const override
Get the enum type.
Definition: AABBIGL.h:47
bool does_support_query_closest_point() const override
Query for the closest point.
Definition: AABBIGL.h:80
bool does_support_query_in_sphere_neighbours() const override
Query for the closest point with in radius.
Definition: AABBIGL.h:106
#define la_runtime_assert(...)
Runtime assertion check.
Definition: assert.h:169
internal::Range< Index > range(Index end)
Returns an iterable object representing the range [0, end).
Definition: range.h:176
Main namespace for Lagrange.
Definition: AABBIGL.h:30