File indexing completed on 2026-05-27 07:24:24
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/utils/axis_rotation.hpp"
0011
0012 #include "detray/definitions/units.hpp"
0013
0014
0015 #include "detray/test/framework/types.hpp"
0016
0017
0018 #include <gtest/gtest.h>
0019
0020 using namespace detray;
0021
0022 using test_algebra = test::algebra;
0023 using scalar = test::scalar;
0024 template <std::size_t ROWS, std::size_t COLS>
0025 using matrix_type = test::matrix<ROWS, COLS>;
0026
0027 static constexpr scalar isclose{1e-5f};
0028
0029 GTEST_TEST(detray_utils, axis_rotation) {
0030 const test::vector3 axis{0.f, 0.f, 3.f};
0031
0032 const test::vector3 v1{1.f, 0.f, 0.f};
0033
0034 const auto u1 = axis_rotation<test_algebra>(axis, constant<scalar>::pi_2)(v1);
0035
0036 EXPECT_NEAR(u1[0], 0.f, isclose);
0037 EXPECT_NEAR(u1[1], 1.f, isclose);
0038 EXPECT_NEAR(u1[2], 0.f, isclose);
0039
0040 matrix_type<3, 1> v2;
0041 getter::element(v2, 0, 0) = constant<scalar>::inv_sqrt2;
0042 getter::element(v2, 1, 0) = constant<scalar>::inv_sqrt2;
0043 getter::element(v2, 2, 0) = 0.f;
0044
0045 const auto u2 = axis_rotation<test_algebra>(axis, constant<scalar>::pi_4)(v2);
0046
0047 EXPECT_NEAR(getter::element(u2, 0, 0), 0.f, isclose);
0048 EXPECT_NEAR(getter::element(u2, 1, 0), 1.f, isclose);
0049 EXPECT_NEAR(getter::element(u2, 2, 0), 0.f, isclose);
0050
0051
0052
0053 const test::vector3 v3{1.f, 0.f, 0.f};
0054
0055 const auto u3 = axis_rotation<test_algebra>(axis, constant<scalar>::pi_4)(v3);
0056
0057 EXPECT_NEAR(u3[0u], constant<scalar>::inv_sqrt2, isclose);
0058 EXPECT_NEAR(u3[1u], constant<scalar>::inv_sqrt2, isclose);
0059 EXPECT_NEAR(u3[2u], 0.f, isclose);
0060 }
0061
0062 GTEST_TEST(detray_utils, euler_rotation1) {
0063 euler_rotation<test_algebra> euler_rot;
0064 euler_rot.alpha = constant<scalar>::pi_2;
0065
0066 auto [x1, z1] = euler_rot();
0067
0068 EXPECT_NEAR(x1[0], 0.f, isclose);
0069 EXPECT_NEAR(x1[1], 1.f, isclose);
0070 EXPECT_NEAR(x1[2], 0.f, isclose);
0071
0072 EXPECT_NEAR(z1[0], 0.f, isclose);
0073 EXPECT_NEAR(z1[1], 0.f, isclose);
0074 EXPECT_NEAR(z1[2], 1.f, isclose);
0075
0076 euler_rot.beta = constant<scalar>::pi_2;
0077
0078 auto [x2, z2] = euler_rot();
0079 EXPECT_NEAR(x2[0], 0.f, isclose);
0080 EXPECT_NEAR(x2[1], 1.f, isclose);
0081 EXPECT_NEAR(x2[2], 0.f, isclose);
0082
0083 EXPECT_NEAR(z2[0], 1.f, isclose);
0084 EXPECT_NEAR(z2[1], 0.f, isclose);
0085 EXPECT_NEAR(z2[2], 0.f, isclose);
0086
0087 euler_rot.gamma = constant<scalar>::pi_2;
0088
0089 auto [x3, z3] = euler_rot();
0090 EXPECT_NEAR(x3[0], 0.f, isclose);
0091 EXPECT_NEAR(x3[1], 0.f, isclose);
0092 EXPECT_NEAR(x3[2], 1.f, isclose);
0093
0094 EXPECT_NEAR(z3[0], 1.f, isclose);
0095 EXPECT_NEAR(z3[1], 0.f, isclose);
0096 EXPECT_NEAR(z3[2], 0.f, isclose);
0097 }
0098
0099 GTEST_TEST(detray_utils, euler_rotation2) {
0100 euler_rotation<test_algebra> euler_rot;
0101 euler_rot.alpha = constant<scalar>::pi / 6.f;
0102 euler_rot.beta = constant<scalar>::pi_4;
0103 euler_rot.gamma = constant<scalar>::pi_2;
0104
0105 const test::vector3 v1{5.f, 7.f, 8.f};
0106 const test::vector3 v2 = euler_rot(v1);
0107
0108 auto R = matrix::zero<matrix_type<3u, 3u>>();
0109
0110 const scalar s1 = static_cast<scalar>(math::sin(euler_rot.alpha));
0111 const scalar c1 = static_cast<scalar>(math::cos(euler_rot.alpha));
0112 const scalar s2 = static_cast<scalar>(math::sin(euler_rot.beta));
0113 const scalar c2 = static_cast<scalar>(math::cos(euler_rot.beta));
0114 const scalar s3 = static_cast<scalar>(math::sin(euler_rot.gamma));
0115 const scalar c3 = static_cast<scalar>(math::cos(euler_rot.gamma));
0116
0117
0118 getter::element(R, 0u, 0u) = c1 * c3 - c2 * s1 * s3;
0119 getter::element(R, 0u, 1u) = -c1 * s3 - c2 * c3 * s1;
0120 getter::element(R, 0u, 2u) = s1 * s2;
0121 getter::element(R, 1u, 0u) = c3 * s1 + c1 * c2 * s3;
0122 getter::element(R, 1u, 1u) = c1 * c2 * c3 - s1 * s3;
0123 getter::element(R, 1u, 2u) = -c1 * s2;
0124 getter::element(R, 2u, 0u) = s2 * s3;
0125 getter::element(R, 2u, 1u) = c3 * s2;
0126 getter::element(R, 2u, 2u) = c2;
0127
0128 const test::vector3 v3 = R * v1;
0129
0130 EXPECT_NEAR(v2[0u], v3[0u], isclose);
0131 EXPECT_NEAR(v2[1u], v3[1u], isclose);
0132 EXPECT_NEAR(v2[2u], v3[2u], isclose);
0133 }