瀏覽代碼

Test rotating a quad.
Test negation of angles.

Sam Jaffe 6 年之前
父節點
當前提交
9965b0fd17
共有 4 個文件被更改,包括 42 次插入0 次删除
  1. 2 0
      math/include/game/math/angle.hpp
  2. 2 0
      math/src/angle.cpp
  3. 12 0
      math/test/angle_test.cxx
  4. 26 0
      math/test/common_test.cxx

+ 2 - 0
math/include/game/math/angle.hpp

@@ -10,12 +10,14 @@
 namespace math {
   struct degree {
     degree(double v);
+    degree operator-() const;
     double value;
   };
 
   struct radian {
     radian(double v);
     radian(degree d);
+    radian operator-() const;
     operator degree() const;
     double value;
   };

+ 2 - 0
math/src/angle.cpp

@@ -11,9 +11,11 @@
 
 namespace math {
   degree::degree(double v) : value(v) {}
+  degree degree::operator-() const { return degree(-value); }
 
   radian::radian(double v) : value(v) {}
   radian::radian(degree d) : value(d.value * M_PI / 180.f) {}
+  radian radian::operator-() const { return radian(-value); }
   radian::operator degree() const { return {value * M_1_PI * 180.f}; }
 
   double sin(radian r) { return std::sin(r.value); }

+ 12 - 0
math/test/angle_test.cxx

@@ -12,6 +12,18 @@
 using testing::DoubleNear;
 using testing::Eq;
 
+TEST(RadianTest, Negation) {
+  math::radian radians{M_PI};
+  EXPECT_THAT((-radians).value, -M_PI);
+  EXPECT_THAT((-(-radians)).value, radians.value);
+}
+
+TEST(DegreeTest, Negation) {
+  math::degree degrees{180.0};
+  EXPECT_THAT((-degrees).value, -180.0);
+  EXPECT_THAT((-(-degrees)).value, degrees.value);
+}
+
 // Degree -> Radian
 TEST(RadianTest, ZeroDegreeIsZeroRadian) {
   math::degree degrees{0};

+ 26 - 0
math/test/common_test.cxx

@@ -242,3 +242,29 @@ TEST(CircleTest, NonIntersecting) {
   square const sq{{{1.5, 0.5}}, 0.5};
   EXPECT_FALSE(math::intersects(c1, sq));
 }
+
+TEST(RotateTest, RotatingSquareAroundOrigin) {
+  math::degree degrees{90.0};
+  // A square with a side-length of 2 and a center at the origin
+  math::vec2 const origin = make_vector(0.f, 0.f);
+  quad const object = square{{{-1, -1}}, 2};
+  quad const rotated = math::rotate(origin, object, degrees);
+  EXPECT_THAT(rotated.ll, Eq(make_vector(1.f, -1.f)));
+  EXPECT_THAT(rotated.lr, Eq(make_vector(1.f, 1.f)));
+  EXPECT_THAT(rotated.ur, Eq(make_vector(-1.f, 1.f)));
+  EXPECT_THAT(rotated.ul, Eq(make_vector(-1.f, -1.f)));
+  EXPECT_THAT(math::rotate(origin, rotated, -degrees), Eq(object));
+}
+
+TEST(RotateTest, RotatingSquareAroundOwnPoint) {
+  math::degree degrees{90.0};
+  // A square with a side-length of 2 and a center at the origin
+  math::vec2 const axis = make_vector(-1.f, -1.f);
+  quad const object = square{{{-1, -1}}, 2};
+  quad const rotated = math::rotate(axis, object, degrees);
+  EXPECT_THAT(rotated.ll, Eq(make_vector(-1.f, -1.f)));
+  EXPECT_THAT(rotated.lr, Eq(make_vector(-1.f, 1.f)));
+  EXPECT_THAT(rotated.ur, Eq(make_vector(-3.f, 1.f)));
+  EXPECT_THAT(rotated.ul, Eq(make_vector(-3.f, -1.f)));
+  EXPECT_THAT(math::rotate(axis, rotated, -degrees), Eq(object));
+}