12#include "algebra/impl/vc_aos_approximately_equal.hpp"
13#include "detray/algebra/common/math.hpp"
14#include "detray/algebra/common/matrix.hpp"
15#include "detray/algebra/common/matrix_getter.hpp"
16#include "detray/algebra/common/vector.hpp"
17#include "detray/algebra/concepts.hpp"
18#include "detray/algebra/utils/approximately_equal.hpp"
19#include "detray/definitions/detail/qualifiers.hpp"
23#pragma warning(push, 0)
35namespace detray::algebra::vc_aos::math {
37using algebra::storage::operator*;
38using algebra::storage::operator/;
39using algebra::storage::operator-;
40using algebra::storage::operator+;
43template <
template <
typename, std::
size_t>
class array_t,
44 concepts::scalar scalar_t>
48 enum elem : std::size_t {
63 template <std::
size_t N>
84 template <concepts::scalar o_scalar_t>
127 z[0] *
x[1] -
x[0] *
z[1]),
153 if constexpr (std::floating_point<scalar_type>) {
154 [[maybe_unused]]
constexpr auto epsilon{
155 std::numeric_limits<float>::epsilon()};
156 assert(algebra::approx_equal(
invert(m), m_inv, 16.f * epsilon, 1e-6f));
194 std::size_t col)
const {
195 return _data[col][row];
203 return _data[col][row];
213 return -m[e_z][0] * m[e_y][1] * m[e_x][2] +
214 m[e_y][0] * m[e_z][1] * m[e_x][2] +
215 m[e_z][0] * m[e_x][1] * m[e_y][2] -
216 m[e_x][0] * m[e_z][1] * m[e_y][2] -
217 m[e_y][0] * m[e_x][1] * m[e_z][2] +
218 m[e_x][0] * m[e_y][1] * m[e_z][2];
229 i[e_x][0] = -m[e_z][1] * m[e_y][2] + m[e_y][1] * m[e_z][2];
230 i[e_x][1] = m[e_z][1] * m[e_x][2] - m[e_x][1] * m[e_z][2];
231 i[e_x][2] = -m[e_y][1] * m[e_x][2] + m[e_x][1] * m[e_y][2];
233 i[e_y][0] = m[e_z][0] * m[e_y][2] - m[e_y][0] * m[e_z][2];
234 i[e_y][1] = -m[e_z][0] * m[e_x][2] + m[e_x][0] * m[e_z][2];
235 i[e_y][2] = m[e_y][0] * m[e_x][2] - m[e_x][0] * m[e_y][2];
237 i[e_z][0] = -m[e_z][0] * m[e_y][1] + m[e_y][0] * m[e_z][1];
238 i[e_z][1] = m[e_z][0] * m[e_x][1] - m[e_x][0] * m[e_z][1];
239 i[e_z][2] = -m[e_y][0] * m[e_x][1] + m[e_x][0] * m[e_y][1];
242 m[e_t][0] * m[e_z][1] * m[e_y][2] - m[e_z][0] * m[e_t][1] * m[e_y][2] -
243 m[e_t][0] * m[e_y][1] * m[e_z][2] + m[e_y][0] * m[e_t][1] * m[e_z][2] +
244 m[e_z][0] * m[e_y][1] * m[e_t][2] - m[e_y][0] * m[e_z][1] * m[e_t][2];
246 m[e_z][0] * m[e_t][1] * m[e_x][2] - m[e_t][0] * m[e_z][1] * m[e_x][2] +
247 m[e_t][0] * m[e_x][1] * m[e_z][2] - m[e_x][0] * m[e_t][1] * m[e_z][2] -
248 m[e_z][0] * m[e_x][1] * m[e_t][2] + m[e_x][0] * m[e_z][1] * m[e_t][2];
250 m[e_t][0] * m[e_y][1] * m[e_x][2] - m[e_y][0] * m[e_t][1] * m[e_x][2] -
251 m[e_t][0] * m[e_x][1] * m[e_y][2] + m[e_x][0] * m[e_t][1] * m[e_y][2] +
252 m[e_y][0] * m[e_x][1] * m[e_t][2] - m[e_x][0] * m[e_y][1] * m[e_t][2];
256 i[e_x] = i[e_x] * idet;
257 i[e_y] = i[e_y] * idet;
258 i[e_z] = i[e_z] * idet;
259 i[e_t] = i[e_t] * idet;
269 template <concepts::vector2D vector2_type>
271 const vector2_type &v)
const {
272 return m[e_x] * v[0] + m[e_y] * v[1];
280 template <concepts::vector3D vector3_type>
282 const vector3_type &v)
const {
283 return m[e_x] * v[0] + m[e_y] * v[1] + m[e_z] * v[2];
293 for (
unsigned int icol = 0; icol < 3; ++icol) {
294 submatrix[icol] =
_data[icol];
302 constexpr const auto &
x()
const {
return _data[e_x]; }
307 constexpr const auto &
y()
const {
return _data[e_y]; }
312 constexpr const auto &
z()
const {
return _data[e_z]; }
337 template <concepts::po
int2D po
int2_type>
339 const point2_type &p)
const {
351 template <concepts::po
int3D po
int3_type>
353 const point3_type &p)
const {
365 template <concepts::po
int3D po
int3_type>
378 template <concepts::vector2D vector2_type>
380 const vector2_type &v)
const {
392 template <concepts::vector3D vector3_type>
394 const vector3_type &v)
const {
406 template <concepts::vector3D vector3_type>
408 const vector3_type &v)
const {
Vector wrapper for AoS vs interleaved SoA data.
Definition vector.hpp:52
Functor used to access elements of a matrix.
Definition matrix_getter.hpp:21
Generic matrix type that can take vectors as columns.
Definition matrix.hpp:25
algebra::storage::vector< ROW, scalar_t, array_t > vector_type
Definition matrix.hpp:27