Not Enough Math
Lightweight zero-dependency C++ math library
Loading...
Searching...
No Matches
mat_utils.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "mat.hpp"
4#include "utils.hpp"
5#include "trig.hpp"
6#include "quat.hpp"
7#include "quat_utils.hpp"
8
9namespace nem
10{
11 template<typename T, size_t C, size_t R, typename F>
13 {
14 for (size_t c = 0; c < C; ++c)
15 {
16 for (size_t r = 0; r < R; ++r)
17 {
18 m[c][r] = func(r, c, m[c][r]);
19 }
20 }
21 return m;
22 }
23
24 template<typename T, size_t C, size_t R>
26 {
27 nem::mat<T, R, C> result;
28 for (size_t c = 0; c < C; ++c)
29 {
30 for (size_t r = 0; r < R; ++r)
31 {
32 result[r][c] = m[c][r];
33 }
34 }
35 return result;
36 }
37
38 template<typename T, size_t N>
40 {
41 nem::mat<T, N, N> result((T)0.0);
42 for (size_t i = 0; i < N; ++i)
43 {
44 result[i][i] = T{ 1 };
45 }
46 return result;
47 }
48
49 template<typename M>
51 {
52 static_assert(M::ROWS == M::COLUMNS && "Identity matrix must be square");
54 }
55
56 template<typename T, size_t C1, size_t R1, size_t C2, size_t R2>
58 {
59 static_assert(R2 > R1 && "Error NEM: Matrix upscaling is only allowed for R2 > R1");
60 static_assert(C2 > C1 && "Error NEM: Matrix upscaling is only allowed for C2 > C1");
61
63 for (size_t c = 0; c < C1; ++c)
64 {
65 for (size_t r = 0; r < R1; ++r)
66 {
67 result[c][r] = m[c][r];
68 }
69 }
70 return result;
71 }
72
73 template<typename T, size_t N>
75 {
77 for (size_t c = 0; c < N; ++c)
78 {
79 for (size_t r = 0; r < N; ++r)
80 {
81 result[c][r] = m[c][r];
82 }
83 }
84 return result;
85 }
86
87 template<typename T>
88 constexpr T determinant(const nem::mat<T, 2, 2>& m)
89 {
90 return m[0][0] * m[1][1] - m[1][0] * m[0][1];
91 }
92
93 template<std::floating_point T>
95 {
97 return nem::mat<T, 2, 2>( {{ a.cos, -a.sin } , { a.sin, a.cos }} );
98 }
99
100 template<std::floating_point T>
102 {
103 return nem::mat<T, 3, 3>( {{ 1, 0, 0 } , { 0, a.cos, -a.sin }, { 0, a.sin, a.cos }} );
104 }
105
106 template<std::floating_point T>
108 {
109 return nem::mat<T, 3, 3>( {{ a.cos, 0, a.sin } , { 0, 1, 0 }, { -a.sin, 0, a.cos }} );
110 }
111
112 template<std::floating_point T>
114 {
115 return nem::mat<T, 3, 3>( {{ a.cos, -a.sin, 0 } , { a.sin, a.cos, 0 }, { 0, 0, 1 }} );
116 }
117
118 template<std::floating_point T>
119 constexpr nem::mat<T, 3, 3> rotate(T yaw_z, T pitch_y, T roll_x)
120 {
121 return nem::rotate_z(nem::get_sincos(yaw_z )) *
124 }
125
126 template<std::floating_point T>
128 {
129 return nem::mat<T, 3, 3>({{1, 0, value[0]}, {0, 1, value[1]}, {0, 0, 1}});
130 }
131
132 template<std::floating_point T>
134 {
135 return nem::mat<T, 4, 4>({{1, 0, 0, value[0]}, {0, 1, 0, value[1]}, {0, 0, 1, value[2]}, {0, 0, 0, 1}});
136 }
137
138 template<std::floating_point T, size_t N>
139 constexpr nem::mat<T, N, N> scale(const nem::vec<T, N>& value)
140 {
141 nem::mat<T, N, N> result((T)0.0);
142 for (size_t i = 0; i < N; ++i)
143 {
144 result[i][i] = value[i];
145 }
146 return result;
147 }
148
149 template <std::floating_point T>
150 constexpr nem::mat<T, 4, 4> transform(const nem::vec<T, 3>& translation, const nem::quat_t<T>& rotation,
151 const nem::vec<T, 3> scaler)
152 {
153 return nem::translate_3D(translation) *
156 }
157}
Definition config.hpp:16
constexpr nem::mat< T, 3, 3 > rotate_y(nem::sincos< T > a)
constexpr T determinant(const nem::mat< T, 2, 2 > &m)
Definition mat_utils.hpp:88
nem::quat_t< T > normalize(nem::quat_t< T > q)
constexpr nem::mat< T, R, C > transpose(const nem::mat< T, C, R > &m)
Definition mat_utils.hpp:25
constexpr nem::mat< T, 4, 4 > translate_3D(const nem::vec< T, 3 > &value)
constexpr nem::mat< T, C2, R2 > upscale(const nem::mat< T, C1, R1 > &m)
Definition mat_utils.hpp:57
constexpr nem::mat< T, N, N > scale(const nem::vec< T, N > &value)
constexpr nem::mat< T, 4, 4 > transform(const nem::vec< T, 3 > &translation, const nem::quat_t< T > &rotation, const nem::vec< T, 3 > scaler)
constexpr nem::mat< T, N, N > identity()
Definition mat_utils.hpp:39
constexpr nem::sincos< T > get_sincos(T radians)
Definition trig.hpp:120
constexpr T radians(T radians) noexcept
Converts radians to radians (passes the argument unchanged). Used to make units explicit.
Definition trig.hpp:35
constexpr nem::mat< T, 3, 3 > rotate_z(nem::sincos< T > a)
constexpr nem::mat< T, 2, 2 > rotate(T radians)
Definition mat_utils.hpp:94
constexpr nem::mat< T, 3, 3 > rotate_x(nem::sincos< T > a)
constexpr nem::mat< T, 3, 3 > norm_quaterion_to_rotation_matrix(const nem::quat_t< T > &q)
constexpr nem::mat< T, C, R > transform_items(nem::mat< T, C, R > m, F &&func)
Definition mat_utils.hpp:12
constexpr nem::mat< T, 3, 3 > translate_2D(const nem::vec< T, 2 > &value)
constexpr nem::mat< T, N+1, N+1 > homogenous(const nem::mat< T, N, N > &m)
Definition mat_utils.hpp:74