summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui/gfx/geometry/quaternion.cc6
-rw-r--r--ui/gfx/geometry/quaternion.h2
-rw-r--r--ui/gfx/geometry/quaternion_unittest.cc13
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);