xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
function.hpp
浏览该文件的文档.
1
8#pragma once
9#ifndef XCMATH_FUNCTION_HPP
10#define XCMATH_FUNCTION_HPP
11
12#include <cmath>
13
14#include "./declaration.hpp"
15
16namespace xcmath {
24template <typename T>
25inline constexpr T radians(T degrees) {
26 return degrees * PI / 180.0;
27};
28
36template <typename T>
37inline constexpr T degrees(T radians) {
38 return radians * 180.0 / PI;
39};
40
52template <class _Tp, size_t _length = 3, size_t _dim = 4>
53 requires((_length == 3 || _length == 4) && (_dim == 4 || _dim == 3))
55 const vec<_Tp, _length>& axis) {
56 auto _axis = axis.normalize();
57 auto res = mat<_Tp, _dim, _dim>::eye();
58 angle = radians(angle);
59 _Tp c = std::cos(angle);
60 _Tp s = std::sin(angle);
61 _Tp t = 1 - c;
62 res[0][0] = c + t * _axis[0] * _axis[0];
63 res[0][1] = t * _axis[0] * _axis[1] - s * _axis[2];
64 res[0][2] = t * _axis[0] * _axis[2] + s * _axis[1];
65
66 res[1][0] = t * _axis[0] * _axis[1] + s * _axis[2];
67 res[1][1] = c + t * _axis[1] * _axis[1];
68 res[1][2] = t * _axis[1] * _axis[2] - s * _axis[0];
69
70 res[2][0] = t * _axis[0] * _axis[2] - s * _axis[1];
71 res[2][1] = t * _axis[1] * _axis[2] + s * _axis[0];
72 res[2][2] = c + t * _axis[2] * _axis[2];
73 return res ^ m;
74}
75
85template <class _Tp, class _MTp = _Tp, size_t _dim = 3>
86 requires(std::is_floating_point_v<_Tp> && (_dim == 3 || _dim == 4))
87mat<_MTp, _dim, _dim> rotate(const mat<_MTp, _dim, _dim>& m, _Tp angle) {
88 auto res = mat<_Tp, _dim, _dim>::eye();
89 angle = radians(angle);
90 res[1][1] = res[0][0] = std::cos(angle);
91 res[0][1] = -(res[1][0] = std::sin(angle));
92 return res ^ m;
93}
94
107template <class _Tp, class _ATp = _Tp, size_t _dim = 3>
108 requires(std::is_floating_point_v<_Tp> && std::is_floating_point_v<_ATp>)
110 _Tp y, _Tp z) {
111 return rotate(m, angle, vec<_Tp, 3>(x, y, z));
112}
113
123template <class _Tp, size_t _len = 4, size_t _vlen = 3>
124 requires((_len == 4 || _len == 3) && _vlen == _len - 1)
125constexpr mat<_Tp, _len, _len> translate(const mat<_Tp, _len, _len>& m,
126 const vec<_Tp, _vlen>& v) {
127 auto res = m;
128 res[0][_vlen] += v[0];
129 res[1][_vlen] += v[1];
130 if constexpr (_len == 4) res[2][_vlen] += v[2];
131 return res;
132}
133
143template <class _Tp, size_t _len = 4>
144 requires(_len == 4 || _len == 3)
146 const vec<_Tp, _len>& v) {
147 return translate(m, v(slice_to<_len - 1>));
148}
149
157template <class _Tp, class _ATp = _Tp, size_t _dim = 4>
158 requires(std::is_floating_point_v<_Tp> && std::is_floating_point_v<_ATp> &&
159 (_dim == 4 || _dim == 3))
160constexpr mat<_Tp, _dim, _dim> scale(const mat<_Tp, _dim, _dim>& m,
161 const vec<_ATp, _dim - 1>& v) {
162 auto res = mat<_Tp, _dim, _dim>::eye();
163 res[0][0] *= v[0];
164 res[1][1] *= v[1];
165 if constexpr (_dim == 4) res[2][2] *= v[2];
166 return res ^ m;
167}
178template <class _Tp, class _STp, size_t _dim = 4>
179 requires(std::is_arithmetic_v<_STp> && (_dim == 4 || _dim == 3))
180constexpr mat<_Tp, _dim, _dim> scale(const mat<_Tp, _dim, _dim>& m,
181 const _STp s) {
182 return scale(m, vec<_Tp, _dim - 1>(s));
183}
184
185} // namespace xcmath
186
187#endif
Matrix class template
Definition mat.hpp:27
static constexpr mat< _Tp, _rows, _cols > eye()
Create an identity matrix
Definition mat.hpp:168
Vector class template
Definition vec.hpp:206
constexpr vec< _Tp, _length > normalize() const
Create unit vector in same direction
Definition vec.hpp:645
Declaration of vector, matrix, quaternion, and complex classes
Compiler-specific type information handling for MSVC
Definition complex.hpp:12
constexpr long double PI
Pi constant
constexpr T radians(T degrees)
Convert degrees to radians
Definition function.hpp:25
constexpr mat< _Tp, _len, _len > translate(const mat< _Tp, _len, _len > &m, const vec< _Tp, _vlen > &v)
Apply translation for matrix
Definition function.hpp:125
constexpr T degrees(T radians)
Convert radians to degrees
Definition function.hpp:37
mat< _Tp, _dim, _dim > rotate(const mat< _Tp, _dim, _dim > &m, _Tp angle, const vec< _Tp, _length > &axis)
Apply rotation for transform or rotation matrix around an axis
Definition function.hpp:54
constexpr mat< _Tp, _dim, _dim > scale(const mat< _Tp, _dim, _dim > &m, const vec< _ATp, _dim - 1 > &v)
Apply translation to a matrix
Definition function.hpp:160