xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
test_mobject.cc
浏览该文件的文档.
1#include <gtest/gtest.h>
2
5
6using namespace xcal::mobject;
7
8class TestMObject : public ComposedMObject<Line, BaseTransformableMobject,
9 StrokeableMObject> {
11
12 public:
14};
15
16// 允许使用 EXPECT_NEAR 比较 float
17static constexpr float EPS = 1e-4f;
18
19TEST(TestMObject, Constructor) {
20 TestMObject obj;
21 EXPECT_EQ(obj.pos().x(), 0.0f);
22 EXPECT_EQ(obj.pos().y(), 0.0f);
23}
24
25TEST(TestMObject, LocalGlobal_NoTransform) {
26 TestMObject obj;
27 obj.set_pos({3.0f, 4.0f});
28
29 auto g = obj.local_to_global({1.0f, 2.0f, 0.0f, 1.0f});
30 EXPECT_NEAR(g.x(), 4.0f, EPS);
31 EXPECT_NEAR(g.y(), 6.0f, EPS);
32
33 auto l = obj.global_to_local({4.0f, 6.0f, 0.0f, 1.0f});
34 EXPECT_NEAR(l.x(), 1.0f, EPS);
35 EXPECT_NEAR(l.y(), 2.0f, EPS);
36}
37
38TEST(TestMObject, LocalGlobal_RotationOnly) {
39 TestMObject obj;
40 obj.set_pos({2.0f, 1.0f});
41 obj.set_rotation(90.0f); // 90°
42
43 auto g = obj.local_to_global({1.0f, 0.0f, 0.0f, 1.0f});
44 EXPECT_NEAR(g.x(), 2.0f, EPS);
45 EXPECT_NEAR(g.y(), 2.0f, EPS);
46
47 auto l = obj.global_to_local({2.0f, 2.0f, 0.0f, 1.0f});
48 EXPECT_NEAR(l.x(), 1.0f, EPS);
49 EXPECT_NEAR(l.y(), 0.0f, EPS);
50}
51
52TEST(TestMObject, LocalGlobal_ScaleOnly) {
53 TestMObject obj;
54 obj.set_pos({0.0f, 0.0f});
55 obj.set_scale(2.0f, 3.0f);
56
57 auto g = obj.local_to_global({1.0f, 1.0f, 0.0f, 1.0f});
58 EXPECT_NEAR(g.x(), 2.0f, EPS);
59 EXPECT_NEAR(g.y(), 3.0f, EPS);
60
61 auto l = obj.global_to_local({2.0f, 3.0f, 0.0f, 1.0f});
62 EXPECT_NEAR(l.x(), 1.0f, EPS);
63 EXPECT_NEAR(l.y(), 1.0f, EPS);
64}
65
66TEST(TestMObject, LocalGlobal_Complex) {
67 TestMObject obj;
68 obj.set_pos({5.0f, 5.0f});
69 obj.set_rotation(45.0f); // 45°
70 obj.set_scale(2.0f, 2.0f);
71
72 // 已知 local = (1,0)
73 auto g = obj.local_to_global({1.0f, 0.0f, 0.0f, 1.0f});
74 // 旋转45°再*2 => (cos45*2, sin45*2) ≈ (1.4142, 1.4142)
75 // 再加平移 => (6.4142, 6.4142)
76 EXPECT_NEAR(g.x(), 5.0f + 1.4142135f, EPS);
77 EXPECT_NEAR(g.y(), 5.0f + 1.4142135f, EPS);
78
79 // 反向映射
80 auto l = obj.global_to_local({g.x(), g.y(), 0.0f, 1.0f});
81 EXPECT_NEAR(l.x(), 1.0f, EPS);
82 EXPECT_NEAR(l.y(), 0.0f, EPS);
83}
基础图形对象类
#define XCAL_MOBJECT_TYPE(type)
TEST(TestMObject, Constructor)