12#include "algebra/impl/detail/eigen_array.hpp"
13#include "detray/algebra/utils/approximately_equal.hpp"
14#include "detray/definitions/detail/qualifiers.hpp"
18#pragma warning(push, 0)
20#ifdef __NVCC_DIAG_PRAGMA_SUPPORT__
21#pragma nv_diagnostic push
22#pragma nv_diag_suppress 20011
23#pragma nv_diag_suppress 20012
24#pragma nv_diag_suppress 20014
27#include <Eigen/Geometry>
31#ifdef __NVCC_DIAG_PRAGMA_SUPPORT__
32#pragma nv_diagnostic pop
41namespace detray::algebra::eigen::math {
44template <concepts::scalar scalar_t>
67 typename Eigen::Transform<scalar_type, 3, Eigen::Affine>::MatrixType;
70 template <concepts::scalar o_scalar_t>
79 Eigen::Transform<scalar_type, 3, Eigen::Affine>
_data;
81 Eigen::Transform<scalar_type, 3, Eigen::Affine>
_data_inv;
94 const vector3 &
z,
bool get_inverse =
true) {
98 matrix.template block<3, 1>(0, 0) =
x;
99 matrix.template block<3, 1>(0, 1) =
y;
100 matrix.template block<3, 1>(0, 2) =
z;
101 matrix.template block<3, 1>(0, 3) = t;
118 bool get_inverse =
true)
129 matrix.template block<3, 1>(0, 3) = t;
152 if constexpr (std::floating_point<scalar_type>) {
153 [[maybe_unused]]
constexpr auto epsilon{
154 std::numeric_limits<scalar_type>::epsilon()};
155 assert(algebra::approx_equal(
matrix44(m * m_inv),
157 16.f * epsilon, 1e-6f));
166 _data.matrix() << ma[0], ma[1], ma[2], ma[3], ma[4], ma[5], ma[6], ma[7],
167 ma[8], ma[9], ma[10], ma[11], ma[12], ma[13], ma[14], ma[15];
197 template <
typename derived_type>
198 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 2 &&
199 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
200 DETRAY_HOST_DEVICE
static constexpr auto rotate(
201 const Eigen::Transform<scalar_type, 3, Eigen::Affine> &m,
202 const Eigen::MatrixBase<derived_type> &v) {
203 return m.matrix().template block<3, 2>(0, 0) * v;
211 template <
typename derived_type>
212 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 3 &&
213 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
214 DETRAY_HOST_DEVICE
static constexpr auto rotate(
215 const Eigen::Transform<scalar_type, 3, Eigen::Affine> &m,
216 const Eigen::MatrixBase<derived_type> &v) {
217 return m.matrix().template block<3, 3>(0, 0) * v;
224 return _data.matrix().template block<3, 3>(0, 0);
231 return _data.matrix().template block<3, 1>(0, 0);
238 return _data.matrix().template block<3, 1>(0, 1);
245 return _data.matrix().template block<3, 1>(0, 2);
252 return _data.matrix().template block<3, 1>(0, 3);
271 template <
typename derived_type>
272 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 2 &&
273 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
275 const Eigen::MatrixBase<derived_type> &v)
const {
276 return (
_data.matrix().template block<3, 2>(0, 0) * v +
277 _data.matrix().template block<3, 1>(0, 3));
284 template <
typename derived_type>
285 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 3 &&
286 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
288 const Eigen::MatrixBase<derived_type> &v)
const {
296 template <
typename derived_type>
297 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 3 &&
298 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
300 const Eigen::MatrixBase<derived_type> &v)
const {
308 template <
typename derived_type>
309 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 2 &&
310 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
312 const Eigen::MatrixBase<derived_type> &v)
const {
313 return (
_data.linear().matrix().template block<3, 2>(0, 0) * v);
320 template <
typename derived_type>
321 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 3 &&
322 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
324 const Eigen::MatrixBase<derived_type> &v)
const {
325 return (
_data.linear() * v);
332 template <
typename derived_type>
333 requires(Eigen::MatrixBase<derived_type>::RowsAtCompileTime == 3 &&
334 Eigen::MatrixBase<derived_type>::ColsAtCompileTime == 1)
336 const Eigen::MatrixBase<derived_type> &v)
const {