File indexing completed on 2026-05-27 07:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/definitions/indexing.hpp"
0011 #include "detray/geometry/surface_descriptor.hpp"
0012 #include "detray/navigation/intersection/intersection.hpp"
0013 #include "detray/utils/invalid_values.hpp"
0014
0015
0016 #include "detray/test/framework/types.hpp"
0017
0018
0019 #include <gtest/gtest.h>
0020
0021
0022 #include <limits>
0023
0024 using namespace detray;
0025
0026 using scalar = test::scalar;
0027
0028 namespace {
0029
0030
0031 enum class mask_id : unsigned int {
0032 e_unmasked = 0u,
0033 };
0034
0035
0036 enum class material_id : unsigned int {
0037 e_material_slab = 0u,
0038 };
0039
0040 constexpr scalar tol{std::numeric_limits<scalar>::epsilon()};
0041
0042 }
0043
0044 using test_algebra = test::algebra;
0045 using scalar_t = dscalar<test_algebra>;
0046 using point2 = test::point2;
0047 using vector3 = test::vector3;
0048 using point3 = test::point3;
0049
0050 using mask_link_t = dtyped_index<mask_id, dindex>;
0051 using material_link_t = dtyped_index<material_id, dindex>;
0052 using surface_t =
0053 surface_descriptor<mask_link_t, material_link_t, test_algebra>;
0054
0055
0056 GTEST_TEST(detray_intersection, intersection2D) {
0057 using enum detray::intersection::status;
0058
0059 using intersection_t =
0060 intersection2D<surface_t, test_algebra, intersection::contains_pos>;
0061 using nominal_inters_t =
0062 intersection2D<surface_t, test_algebra, !intersection::contains_pos>;
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 static_assert((sizeof(nominal_inters_t) == 24) ||
0077 (sizeof(nominal_inters_t) == 32));
0078
0079 const surface_t sf{};
0080 const point3 test_pt{0.2f, 0.4f, 0.f};
0081
0082 intersection_t i0{sf, 2.f, test_pt, 1u, e_outside, true};
0083 intersection_t i1{sf, 1.7f, test_pt, 0u, e_inside, false};
0084
0085 intersection_t invalid{};
0086 ASSERT_FALSE(invalid.is_inside());
0087
0088 dvector<intersection_t> intersections = {invalid, i0, i1};
0089 std::ranges::sort(intersections);
0090
0091 ASSERT_NEAR(intersections[0].path(), 1.7f, tol);
0092 ASSERT_NEAR(intersections[1].path(), 2.f, tol);
0093 ASSERT_TRUE(detail::is_invalid_value(intersections[2].path()));
0094 }