xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
mat.cc
浏览该文件的文档.
1#include <gtest/gtest.h>
2
3#include <xcmath/xcmath.hpp>
4//
6
7TEST(Method, construct_with_vec) {
8 xcmath::batch<float, 3, 3> v1{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
9 xcmath::mat3f m1{v1};
10 EXPECT_EQ(m1[0][0], 1.0f);
11 EXPECT_EQ(m1[0][1], 2.0f);
12 EXPECT_EQ(m1[0][2], 3.0f);
13 EXPECT_EQ(m1[1][0], 4.0f);
14 EXPECT_EQ(m1[1][1], 5.0f);
15 EXPECT_EQ(m1[1][2], 6.0f);
16 EXPECT_EQ(m1[2][0], 7.0f);
17 EXPECT_EQ(m1[2][1], 8.0f);
18 EXPECT_EQ(m1[2][2], 9.0f);
19 m1 = v1;
20 EXPECT_EQ(m1[0][0], 1.0f);
21 EXPECT_EQ(m1[0][1], 2.0f);
22 EXPECT_EQ(m1[0][2], 3.0f);
23 EXPECT_EQ(m1[1][0], 4.0f);
24 EXPECT_EQ(m1[1][1], 5.0f);
25 EXPECT_EQ(m1[1][2], 6.0f);
26 EXPECT_EQ(m1[2][0], 7.0f);
27 EXPECT_EQ(m1[2][1], 8.0f);
28 EXPECT_EQ(m1[2][2], 9.0f);
29}
30TEST(Method, det__1x1) {
32 mat1x1[0][0] = 5.0f;
33 EXPECT_FLOAT_EQ(mat1x1.det(), 5.0f);
34}
35
36TEST(Method, det__2x2) {
38 mat2x2[0][0] = 1.0f;
39 mat2x2[0][1] = 2.0f;
40 mat2x2[1][0] = 3.0f;
41 mat2x2[1][1] = 4.0f;
42 EXPECT_FLOAT_EQ(mat2x2.det(), -2.0f);
43}
44
45TEST(Method, det__3x3) {
47 mat3x3[0][0] = 1.0f;
48 mat3x3[0][1] = 2.0f;
49 mat3x3[0][2] = 3.0f;
50 mat3x3[1][0] = 0.0f;
51 mat3x3[1][1] = 4.0f;
52 mat3x3[1][2] = 5.0f;
53 mat3x3[2][0] = 1.0f;
54 mat3x3[2][1] = 0.0f;
55 mat3x3[2][2] = 6.0f;
56 EXPECT_FLOAT_EQ(mat3x3.det(), 22.0f);
57}
58
59TEST(Method, det__4x4) {
61 mat4x4[0][0] = 1.0f;
62 mat4x4[0][1] = 0.0f;
63 mat4x4[0][2] = 2.0f;
64 mat4x4[0][3] = -1.0f;
65 mat4x4[1][0] = 3.0f;
66 mat4x4[1][1] = 0.0f;
67 mat4x4[1][2] = 0.0f;
68 mat4x4[1][3] = 5.0f;
69 mat4x4[2][0] = 2.0f;
70 mat4x4[2][1] = 1.0f;
71 mat4x4[2][2] = 4.0f;
72 mat4x4[2][3] = -3.0f;
73 mat4x4[3][0] = 1.0f;
74 mat4x4[3][1] = 0.0f;
75 mat4x4[3][2] = -1.0f;
76 mat4x4[3][3] = 6.0f;
77 EXPECT_FLOAT_EQ(mat4x4.det(), 18.0f);
78}
79
80TEST(Method, det__IdentityMatrix_2x2) {
82 EXPECT_FLOAT_EQ(identity.det(), 1.0f);
83}
84
85TEST(Method, det__IdentityMatrix_3x3) {
87 EXPECT_FLOAT_EQ(identity.det(), 1.0f);
88}
89
90TEST(Method, det__IdentityMatrix_4x4) {
92 EXPECT_FLOAT_EQ(identity.det(), 1.0f);
93}
94
95TEST(Method, det__OnesMatrix_2x2) {
97 EXPECT_FLOAT_EQ(ones.det(), 0.0f);
98}
99
100TEST(Method, det__OnesMatrix_3x3) {
102 EXPECT_FLOAT_EQ(ones.det(), 0.0f);
103}
104
105TEST(Method, det__OnesMatrix_4x4) {
107 EXPECT_FLOAT_EQ(ones.det(), 0.0f);
108}
109
110TEST(Method, det__SingularMatrix) {
112 singular[0][0] = 1.0f;
113 singular[0][1] = 2.0f;
114 singular[1][0] = 2.0f;
115 singular[1][1] = 4.0f;
116 EXPECT_FLOAT_EQ(singular.det(), 0.0f);
117}
118
119TEST(Method, nat_muti_vec) {
120 using namespace xcmath;
122 mat1[0][0] = 1.0f;
123 mat1[0][1] = 2.0f;
124 mat1[1][0] = 3.0f;
125 mat1[1][1] = 4.0f;
127 vec1[0] = 5.0f;
128 vec1[1] = 6.0f;
129 // // auto res = mat1 ^ vec1;
130 // auto result = vec{17.0f, 39.0f};
131 // auto result2 = vec{12.0f, 39.0f};
132 // EXPECT_TRUE((res == result).all());
133 // EXPECT_FALSE((res == result2).all());
134}
135TEST(Method, inverse__2x2) {
136 using namespace xcmath;
137 xcmath::mat<float, 2, 2> mat1{{1.0f, 2.0f}, {3.0f, 4.0f}};
138 auto mat2 = mat1.inv();
139 EXPECT_FLOAT_EQ(mat2[0][0], -2.0f);
140 EXPECT_FLOAT_EQ(mat2[0][1], 1.f);
141 EXPECT_FLOAT_EQ(mat2[1][0], 1.5f);
142 EXPECT_FLOAT_EQ(mat2[1][1], -0.5f);
143 EXPECT_FLOAT_EQ(mat1.det(), 1.0f / mat2.det());
144}
145TEST(Method, inverse__3x3) {
146 using namespace xcmath;
148 {1.0f, 2.0f, 3.0f}, {4.0f, 5.0f, 6.0f}, {7.0f, 8.0f, 8.0f}};
149 auto mat2 = mat1.inv();
150 EXPECT_FLOAT_EQ(mat2[0][0], -8.0f / 3.0f);
151 EXPECT_FLOAT_EQ(mat2[0][1], 8.0f / 3.0f);
152 EXPECT_FLOAT_EQ(mat2[0][2], -1.0f);
153 EXPECT_FLOAT_EQ(mat2[1][0], 10.0f / 3.0f);
154 EXPECT_FLOAT_EQ(mat2[1][1], -13.0f / 3.0f);
155 EXPECT_FLOAT_EQ(mat2[1][2], 2.0f);
156 EXPECT_FLOAT_EQ(mat2[2][0], -1.0f);
157 EXPECT_FLOAT_EQ(mat2[2][1], 2.0f);
158 EXPECT_FLOAT_EQ(mat2[2][2], -1.0f);
159 EXPECT_NEAR(mat1.det(), 1.0f / mat2.det(), 1e-5);
160}
Matrix class template
Definition mat.hpp:27
constexpr mat< _Tp, _cols, _rows > inv() const
Definition mat.hpp:127
static constexpr mat< _Tp, _rows, _cols > eye()
Create an identity matrix
Definition mat.hpp:168
static constexpr mat< _Tp, _rows, _cols > ones()
Create a matrix filled with ones
Definition mat.hpp:159
constexpr _Tp det() const
Compute determinant of the matrix
Definition mat.hpp:182
Vector class template
Definition vec.hpp:206
TEST(Method, construct_with_vec)
Definition mat.cc:7
Compiler-specific type information handling for MSVC
Definition complex.hpp:12