1#ifndef TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_PARENT_H
2#define TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_PARENT_H
11template <
typename Mesh, floating_point Real, std::size_t NumDimensions,
12 std::size_t SimplexDim>
26template <
typename Mesh,
floating_po
int Real>
48 return *
dynamic_cast<Mesh const*
>(
this);
53 constexpr double eps = 1e-6;
54 auto const&
grid = as_grid();
55 auto global_min_t = std::numeric_limits<real_type>::max();
57 if (!
grid.m_hierarchy) {
58 grid.build_hierarchy();
60 auto const possible_simplices =
61 grid.m_hierarchy->collect_possible_intersections(r);
62 for (
auto const simplex_handle : possible_simplices) {
63 auto const [vi0, vi1, vi2] =
grid.simplex_at(simplex_handle);
64 auto const& v0 =
grid.at(vi0);
65 auto const& v1 =
grid.at(vi1);
66 auto const& v2 =
grid.at(vi2);
67 auto const v0v1 = v1 - v0;
68 auto const v0v2 = v2 - v0;
70 auto const det =
dot(v0v1, pvec);
72 if (std::abs(
det) < eps) {
75 auto const inv_det = 1 /
det;
78 auto const u =
dot(tvec, pvec) * inv_det;
83 auto const qvec =
cross(tvec, v0v1);
85 if (v < 0 || u + v > 1) {
89 auto const t =
dot(v0v2, qvec) * inv_det;
90 auto const barycentric_coord = vec<real_type, 3>{1 - u - v, u, v};
92 auto const pos = barycentric_coord(0) * v0 + barycentric_coord(1) * v1 +
93 barycentric_coord(2) * v2;
95 if (t < global_min_t) {
98 intersection_type{
this, r, t, pos,
normalize(
cross(v0v1, v2 - v1))};
Definition: grid_edge.h:16
Definition: edge_vtp_writer.h:12
typename simplex_at_return_type_impl< VertexHandle, NumVerticesPerSimplex >::type simplex_at_return_type
Definition: simplex_at_return_type.h:24
typename hierarchy_impl< Mesh, Real, NumDimensions, SimplexDim >::type hierarchy
Definition: hierarchy.h:17
constexpr auto normalize(base_tensor< Tensor, T, N > const &t_in) -> vec< T, N >
Definition: tensor_operations.h:100
constexpr auto dot(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: tensor_operations.h:120
constexpr auto cross(base_tensor< Tensor0, T0, 3 > const &lhs, base_tensor< Tensor1, T1, 3 > const &rhs)
Definition: cross.h:9
constexpr auto det(base_tensor< Tensor, T, 2, 2 > const &A) -> T
Definition: determinant.h:7
Real real_type
Definition: parent.h:31
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle &, 3 > simplex_at_return_type
Definition: parent.h:39
auto as_grid() const -> auto const &
Definition: parent.h:47
auto check_intersection(ray_type const &r, real_type const min_t=0) const -> optional_intersection_type override
Definition: parent.h:51
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle const &, 3 > const_simplex_at_return_type
Definition: parent.h:36
hierarchy< Mesh, real_type, 3, 2 > hierarchy_type
Definition: parent.h:33
virtual ~parent()=default
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle const &, SimplexDim+1 > const_simplex_at_return_type
Definition: parent.h:19
detail::unstructured_simplicial_grid::simplex_at_return_type< vertex_handle &, SimplexDim+1 > simplex_at_return_type
Definition: parent.h:22
hierarchy< Mesh, Real, NumDimensions, SimplexDim > hierarchy_type
Definition: parent.h:16
pointset< Real, NumDimensions > parent_type
Definition: parent.h:14
Definition: intersection.h:13
Definition: pointset.h:83
Definition: pointset.h:69
Definition: ray_intersectable.h:10
std::optional< intersection_type > optional_intersection_type
Definition: ray_intersectable.h:14
auto direction() -> auto &
Definition: ray.h:54
auto origin() -> auto &
Definition: ray.h:41