Loading [MathJax]/extensions/tex2jax.js
Tatooine
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages Concepts
parent.h
Go to the documentation of this file.
1#ifndef TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_PARENT_H
2#define TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_PARENT_H
3//==============================================================================
5#include <tatooine/pointset.h>
6//==============================================================================
8//==============================================================================
10//==============================================================================
11template <typename Mesh, floating_point Real, std::size_t NumDimensions,
12 std::size_t SimplexDim>
13struct parent : pointset<Real, NumDimensions> {
19 vertex_handle const&, SimplexDim + 1>;
22 vertex_handle&, SimplexDim + 1>;
24};
25//==============================================================================
26template <typename Mesh, floating_point Real>
27struct parent<Mesh, Real, 3, 2> : pointset<Real, 3>,
28 ray_intersectable<Real, 3> {
31 using real_type = Real;
36 vertex_handle const&, 3>;
39 vertex_handle&, 3>;
40
45 //----------------------------------------------------------------------------
46 virtual ~parent() = default;
47 auto as_grid() const -> auto const& {
48 return *dynamic_cast<Mesh const*>(this);
49 }
50 //----------------------------------------------------------------------------
51 auto check_intersection(ray_type const& r, real_type const min_t = 0) const
52 -> optional_intersection_type override {
53 constexpr double eps = 1e-6;
54 auto const& grid = as_grid();
55 auto global_min_t = std::numeric_limits<real_type>::max();
56 auto inters = optional_intersection_type{};
57 if (!grid.m_hierarchy) {
58 grid.build_hierarchy();
59 }
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;
69 auto const pvec = cross(r.direction(), v0v2);
70 auto const det = dot(v0v1, pvec);
71 // r and triangle are parallel if det is close to 0
72 if (std::abs(det) < eps) {
73 continue;
74 }
75 auto const inv_det = 1 / det;
76
77 auto const tvec = r.origin() - v0;
78 auto const u = dot(tvec, pvec) * inv_det;
79 if (u < 0 || u > 1) {
80 continue;
81 }
82
83 auto const qvec = cross(tvec, v0v1);
84 auto const v = dot(r.direction(), qvec) * inv_det;
85 if (v < 0 || u + v > 1) {
86 continue;
87 }
88
89 auto const t = dot(v0v2, qvec) * inv_det;
90 auto const barycentric_coord = vec<real_type, 3>{1 - u - v, u, v};
91 if (t > min_t) {
92 auto const pos = barycentric_coord(0) * v0 + barycentric_coord(1) * v1 +
93 barycentric_coord(2) * v2;
94
95 if (t < global_min_t) {
96 global_min_t = t;
97 inters =
98 intersection_type{this, r, t, pos, normalize(cross(v0v1, v2 - v1))};
99 }
100 }
101 }
102
103 return inters;
104 }
105};
106//==============================================================================
107} // namespace tatooine::detail::unstructured_simplicial_grid
108//==============================================================================
109#endif
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
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
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
Definition: ray.h:10
auto direction() -> auto &
Definition: ray.h:54
auto origin() -> auto &
Definition: ray.h:41