diff options
-rw-r--r-- | ui/gfx/geometry/quaternion.cc | 6 | ||||
-rw-r--r-- | ui/gfx/geometry/quaternion.h | 2 | ||||
-rw-r--r-- | ui/gfx/geometry/quaternion_unittest.cc | 13 |
3 files changed, 20 insertions, 1 deletions
diff --git a/ui/gfx/geometry/quaternion.cc b/ui/gfx/geometry/quaternion.cc index 9da8f47111..ef7fae06c7 100644 --- a/ui/gfx/geometry/quaternion.cc +++ b/ui/gfx/geometry/quaternion.cc @@ -80,8 +80,12 @@ Quaternion Quaternion::Lerp(const Quaternion& q, double t) const { return (((1.0 - t) * *this) + (t * q)).Normalized(); } +double Quaternion::Length() const { + return x_ * x_ + y_ * y_ + z_ * z_ + w_ * w_; +} + Quaternion Quaternion::Normalized() const { - double length = x_ * x_ + y_ * y_ + z_ * z_ + w_ * w_; + double length = Length(); if (length < kEpsilon) return *this; return *this / sqrt(length); diff --git a/ui/gfx/geometry/quaternion.h b/ui/gfx/geometry/quaternion.h index f4e124ce52..7f65b796e6 100644 --- a/ui/gfx/geometry/quaternion.h +++ b/ui/gfx/geometry/quaternion.h @@ -59,6 +59,8 @@ class GFX_EXPORT Quaternion { // and values outside that range will extrapolate beyond in either direction. Quaternion Lerp(const Quaternion& q, double t) const; + double Length() const; + Quaternion Normalized() const; std::string ToString() const; diff --git a/ui/gfx/geometry/quaternion_unittest.cc b/ui/gfx/geometry/quaternion_unittest.cc index 38e192e1d0..5c8fa9b8ae 100644 --- a/ui/gfx/geometry/quaternion_unittest.cc +++ b/ui/gfx/geometry/quaternion_unittest.cc @@ -99,6 +99,19 @@ TEST(QuatTest, Scaling) { } } +TEST(QuatTest, Normalization) { + Quaternion q(1, -1, 1, -1); + EXPECT_NEAR(q.Length(), 4, kEpsilon); + + q = q.Normalized(); + + EXPECT_NEAR(q.Length(), 1, kEpsilon); + EXPECT_NEAR(q.x(), 0.5, kEpsilon); + EXPECT_NEAR(q.y(), -0.5, kEpsilon); + EXPECT_NEAR(q.z(), 0.5, kEpsilon); + EXPECT_NEAR(q.w(), -0.5, kEpsilon); +} + TEST(QuatTest, Lerp) { for (size_t i = 1; i < 100; ++i) { Quaternion a(0, 0, 0, 0); |