xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
vec.cc
浏览该文件的文档.
2//
3#include <gtest/gtest.h>
4
6#include <xcmath/xcmath.hpp>
7
8#include "gtest/gtest.h"
9
10TEST(Method, operatorSlice) {
11 using namespace xcmath;
12
13 vec3f v3f({1, 2, 3});
14 vec3<vec3f> v33f({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
15 auto s = xcmath::slice_from_to<0, 4, 2>;
16 auto s2 = xcmath::slice_start_len<1, 4>;
17 auto s3 = xcmath::slice_start_len<0, 4, 3>;
18
19 auto qq = v33f(xcmath::slice_from_to<0, 1>, xcmath::slice_from_to<0, 1>);
20 EXPECT_FLOAT_EQ(qq[0][0], 1);
21 EXPECT_FLOAT_EQ(qq[0][1], 2);
22 EXPECT_FLOAT_EQ(qq[1][0], 4);
23 EXPECT_FLOAT_EQ(qq[1][1], 5);
24 auto qq2 = v33f(xcmath::slice_from_to<1, 2>, xcmath::slice_from_to<1, 2>);
25 EXPECT_FLOAT_EQ(qq2[0][0], 5);
26 EXPECT_FLOAT_EQ(qq2[0][1], 6);
27 EXPECT_FLOAT_EQ(qq2[1][0], 8);
28 EXPECT_FLOAT_EQ(qq2[1][1], 9);
29}
30TEST(Method, Constructor_with_init) {
31 using namespace xcmath;
32
33 vec3f v3f({1, 2, 3});
34 vec3<vec3f>({{1, 2, 3}, {1, 2, 3}, {1, 2, 3}});
35}
36
37// Property tests
38TEST(Property, DataType) {
39 xcmath::vec<float, 3> v1{1, 2, 3};
43 EXPECT_STREQ(v1.datatype, "float");
44 EXPECT_STREQ(v2.itemtype, "xcmath::vec<float, 3>");
45}
46
47TEST(Property, length) {
48 xcmath::vec3f v1{1, 2, 3};
49 float result = v1.length;
50 EXPECT_EQ(result, 3);
51}
52
53// Operator tests
54TEST(Operator, eq) {
55 xcmath::vec3f v1{1, 2, 3};
56 xcmath::vec3f v2{1, 1, 3};
57 xcmath::vec3b v3{1, 0, 1};
58
59 xcmath::vec3b result = v1 == v2;
60 for (int i = 0; i < 3; i++) {
61 EXPECT_EQ(result[i], v3[i]);
62 }
63}
64TEST(Operator, ne) {
65 xcmath::vec3f v1{1, 2, 3};
66 xcmath::vec3f v2{1, 1, 3};
67 xcmath::vec3b v3{0, 1, 0};
68
69 xcmath::vec3b result = v1 != v2;
70 for (int i = 0; i < 3; i++) {
71 EXPECT_EQ(result[i], v3[i]);
72 }
73}
74TEST(Operator, lt) {
75 xcmath::vec3f v1{1, 2, 3};
76 xcmath::vec3f v2{1, 4, 3};
77 xcmath::vec3b v3{0, 1, 0};
78
79 xcmath::vec3b result = v1 < v2;
80 for (int i = 0; i < 3; i++) {
81 EXPECT_EQ(result[i], v3[i]);
82 }
83}
84TEST(Operator, gt) {
85 xcmath::vec3f v1{1, 2, 3};
86 xcmath::vec3f v2{2, 1, 3};
87 xcmath::vec3b v3{0, 1, 0};
88
89 xcmath::vec3b result = v1 > v2;
90 for (int i = 0; i < 3; i++) {
91 EXPECT_EQ(result[i], v3[i]);
92 }
93}
94TEST(Operator, le) {
95 xcmath::vec3f v1{1, 2, 4};
96 xcmath::vec3f v2{1, 1, 3};
97 xcmath::vec3b v3{1, 0, 0};
98 xcmath::vec3b result = v1 <= v2;
99 for (int i = 0; i < 3; i++) {
100 EXPECT_EQ(result[i], v3[i]);
101 }
102}
103TEST(Operator, ge) {
104 xcmath::vec3f v1{1, 2, 3};
105 xcmath::vec3f v2{1, 1, 3};
106 xcmath::vec3b v3{1, 1, 1};
107
108 xcmath::vec3b result = v1 >= v2;
109 for (int i = 0; i < 3; i++) {
110 EXPECT_EQ(result[i], v3[i]);
111 }
112}
113TEST(Operator, Addition) {
114 xcmath::vec3f v1{1, 2, 3};
115 xcmath::vec3f v2{4, 5, 6};
116 xcmath::vec3f v3{5, 7, 9};
117
118 xcmath::vec3f result = v1 + v2;
119 for (int i = 0; i < 3; i++) {
120 EXPECT_EQ(result[i], v3[i]);
121 }
122}
123TEST(Operator, Subtraction) {
124 xcmath::vec3f v1{1, 2, 3};
125 xcmath::vec3f v2{4, 5, 6};
126 xcmath::vec3f v3{-3, -3, -3};
127
128 xcmath::vec3f result = v1 - v2;
129 for (int i = 0; i < 3; i++) {
130 EXPECT_EQ(result[i], v3[i]);
131 }
132}
133TEST(Operator, Multiplication) {
134 xcmath::vec3f v1{1, 2, 3};
135 xcmath::vec3f v2{4, 5, 6};
136 xcmath::vec3f v3{4, 10, 18};
137
138 xcmath::vec3f result = v1 * v2;
139 for (int i = 0; i < 3; i++) {
140 EXPECT_EQ(result[i], v3[i]);
141 }
142}
143TEST(Operator, Division) {
144 xcmath::vec3f v1{1, 2, 3};
145 xcmath::vec3f v2{4, 5, 6};
146 xcmath::vec3f v3{0.25, 0.4, 0.5};
147
148 xcmath::vec3f result = v1 / v2;
149 for (int i = 0; i < 3; i++) {
150 EXPECT_EQ(result[i], v3[i]);
151 }
152}
153TEST(Operator, UnaryMinus) {
154 xcmath::vec3f v1{1, 2, 3};
155 xcmath::vec3f v2{-1, -2, -3};
156
157 xcmath::vec3f result = -v1;
158 for (int i = 0; i < 3; i++) {
159 EXPECT_EQ(result[i], v2[i]);
160 }
161}
162TEST(Operator, UnaryPlus) {
163 xcmath::vec3f v1{1, 2, 3};
164 xcmath::vec3f v2{1, 2, 3};
165
166 xcmath::vec3f result = +v1;
167 for (int i = 0; i < 3; i++) {
168 EXPECT_EQ(result[i], v2[i]);
169 }
170}
171
172// Method tests
173TEST(Method, dot) {
174 xcmath::vec3f v1{1, 2, 3};
175 xcmath::vec3f v2{4, 5, 6};
176 float result = v1.dot(v2);
177 EXPECT_EQ(result, 32);
178}
179TEST(Method, cross) {
180 xcmath::vec3f v1{1, 2, 3};
181 xcmath::vec3f v2{4, 5, 6};
182 xcmath::vec3f result = v1.cross(v2);
183 xcmath::vec3f expected{-3, 6, -3};
184
185 EXPECT_FLOAT_EQ(result[0], expected[0]);
186}
187TEST(Method, mod) {
188 xcmath::vec3f v1{1, 2, 3};
189 float result = v1.mod();
190 EXPECT_FLOAT_EQ(result, 3.7416573867739413);
191}
192TEST(Method, distance) {
193 xcmath::vec3f v1{1, 2, 3};
194 xcmath::vec3f v2{4, 5, 6};
195 float result = v1.distance(v2);
196 EXPECT_FLOAT_EQ(result, 5.196152422706632);
197}
198TEST(Method, normalize) {
199 xcmath::vec3f v1{1, 2, 3};
200 xcmath::vec3f result = v1.normalize();
201 xcmath::vec3f expected{0.2672612419124244, 0.5345224838248488,
202 0.8017837257372732};
203
204 for (int i = 0; i < 3; i++) {
205 EXPECT_FLOAT_EQ(result[i], expected[i]);
206 }
207}
208TEST(Method, angle) {
209 xcmath::vec3f v1{1, 0, 0};
210 xcmath::vec3f v2{0, 1, 0};
211 float result = v1.angle(v2);
212 EXPECT_FLOAT_EQ(result, 1.5707963267948966);
213}
214
215TEST(Method, any) {
216 xcmath::vec3b v1{1, 0, 1};
217 bool result = v1.any();
218 EXPECT_EQ(result, true);
219
220 xcmath::vec3b v2{0, 0, 0};
221 result = v2.any();
222 EXPECT_EQ(result, false);
223
224 xcmath::vec<xcmath::vec3b, 3> v3{v1, v2, v1};
225 result = v3.any();
226 EXPECT_EQ(result, true);
227
228 xcmath::vec<xcmath::vec3b, 3> v4{v2, v2, v2};
229 result = v4.any();
230 EXPECT_EQ(result, false);
231}
232TEST(Method, every) {
233 xcmath::vec3b v1{1, 1, 1};
234 bool result = v1.every();
235 EXPECT_EQ(result, true);
236
237 xcmath::vec3b v2{0, 1, 1};
238 result = v2.every();
239 EXPECT_EQ(result, false);
240
241 xcmath::vec<xcmath::vec3b, 3> v3{v1, v2, v1};
242 result = v3.every();
243 EXPECT_EQ(result, false);
244
245 xcmath::vec<xcmath::vec3b, 3> v4{v1, v1, v1};
246 result = v4.every();
247 EXPECT_EQ(result, true);
248}
249
250TEST(Method, ConvertToOtherTypeVec) {
251 using namespace xcmath;
252 vec3f v1{1, 2, 3};
253 vec3d v2 = (vec3d)v1;
254
255 EXPECT_EQ(v2.x(), 1);
256 EXPECT_EQ(v2.y(), 2);
257 EXPECT_EQ(v2.z(), 3);
258}
259template <typename T = float>
260class Point final : public xcmath::vec2<T> {
261 using vec2 = xcmath::vec2<T>;
262
263 public:
264 Point(T x = T{}, T y = T{}) : xcmath::vec2<T>(x, y) {}
265 Point(const vec2& data) : xcmath::vec2<T>(data) {}
266 Point(const Point& o) : vec2((vec2)o) {}
267 T x() const { return xcmath::vec2f::x(); }
268 T y() const { return xcmath::vec2f::y(); }
269 void setX(T x) { xcmath::vec2f::x() = x; }
270 void setY(T y) { xcmath::vec2f::y() = y; }
271 const std::array<T, 2>& array() const { return *((std::array<T, 2>*)this); }
272 operator const vec2&() const { return *(xcmath::vec2<T>*)this; }
273};
274TEST(Method, EqualOoperator) {
275 using namespace xcmath;
276 Point v1{1, 2};
277 Point v2{1, 2};
278 v2 = vec2{1, 2};
279 v2 = v1 + v2;
280 v2 = (v1 + v1);
281 auto s = VecInfo<vec3b>::dim;
282 s = VecInfo<vec3<vec3b>>::dim;
283 // auto s = VecInfo<vec3<vec3<vec3b>>>::dim;
284 auto s1 = VecInfo<vec3<vec3<vec4d>>>::Zero;
285}
286using namespace xcmath;
287using namespace std;
288TEST(operator, all) {
289 vec3f v1{1, 2, 3};
290 const auto& v1f = v1;
291 vec3d v2{1, 2, 3};
292 vec3<vec3<vec3f>> v4{};
293 v4 + 1.2;
294 v1 / 1.2f;
295 v1f / 1.2f;
296 1.2 + v4;
297 auto result = v1 + v2;
298}
Definition vec.cc:260
void setX(T x)
Definition vec.cc:269
T x() const
Definition vec.cc:267
Point(const Point &o)
Definition vec.cc:266
Point(T x=T{}, T y=T{})
Definition vec.cc:264
const std::array< T, 2 > & array() const
Definition vec.cc:271
Point(const vec2 &data)
Definition vec.cc:265
T y() const
Definition vec.cc:268
void setY(T y)
Definition vec.cc:270
Vector class template
Definition vec.hpp:206
constexpr bool every() const
Check if all elements satisfy a condition
Definition vec.hpp:721
constexpr _Tp angle(const vec< _Tp, _length > &other) const
Compute angle with another vector
Definition vec.hpp:687
constexpr _Tp dot(const vec< _Tp, _length > &other) const
Compute Euclidean inner product
Definition vec.hpp:631
constexpr _Tp & x()
Get the item at index 0
Definition vec.hpp:454
_Tp data[_length]
Component storage array
Definition vec.hpp:212
constexpr _Tp distance(const vec< _Tp, _length > &other) const
Compute distance to another vector
Definition vec.hpp:660
constexpr _Tp mod() const
Calculate Euclidean norm (magnitude)
Definition vec.hpp:673
constexpr vec< _Tp, _length > cross(const vec< _Tp, _length > &other) const
Compute 3D cross product
Definition vec.hpp:617
constexpr _Tp & y()
Get the item at index 1
Definition vec.hpp:465
constexpr vec< _Tp, _length > normalize() const
Create unit vector in same direction
Definition vec.hpp:645
constexpr _Tp & z()
Get the item at index 2
Definition vec.hpp:476
static constexpr auto length
Length of the vector
Definition vec.hpp:266
constexpr bool any() const
Check if any element satisfies a condition
Definition vec.hpp:697
Compiler-specific type information handling for MSVC
Definition complex.hpp:12
vec3< double > vec3d
N-dimensional mathematical vector implementation with template metaprogramming support
TEST(Method, operatorSlice)
Definition vec.cc:10