1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_QUATERNION_H
17 #define FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_QUATERNION_H
18
19 #include "base/utils/utils.h"
20
21 namespace OHOS::Ace {
22
23 class Quaternion {
24 public:
25 Quaternion() = default;
Quaternion(double x, double y, double z, double w)26 Quaternion(double x, double y, double z, double w) : x_(x), y_(y), z_(z), w_(w) {}
27 ~Quaternion() = default;
28
GetX() const29 double GetX() const
30 {
31 return x_;
32 }
GetY() const33 double GetY() const
34 {
35 return y_;
36 }
GetZ() const37 double GetZ() const
38 {
39 return z_;
40 }
GetW() const41 double GetW() const
42 {
43 return w_;
44 }
SetX(double x)45 void SetX(double x)
46 {
47 x_ = x;
48 }
SetY(double y)49 void SetY(double y)
50 {
51 y_ = y;
52 }
SetZ(double z)53 void SetZ(double z)
54 {
55 z_ = z;
56 }
SetW(double w)57 void SetW(double w)
58 {
59 w_ = w;
60 }
61
operator +(const Quaternion& q) const62 Quaternion operator+(const Quaternion& q) const
63 {
64 auto x = this->x_ + q.x_;
65 auto y = this->y_ + q.y_;
66 auto z = this->z_ + q.z_;
67 auto w = this->w_ + q.w_;
68 return Quaternion(x, y, z, w);
69 }
70
operator *(const Quaternion& q) const71 Quaternion operator*(const Quaternion& q) const
72 {
73 auto x = w_ * q.x_ + x_ * q.w_ + y_ * q.z_ - z_ * q.y_;
74 auto y = w_ * q.y_ - x_ * q.z_ + y_ * q.w_ + z_ * q.x_;
75 auto z = w_ * q.z_ + x_ * q.y_ - y_ * q.x_ + z_ * q.w_;
76 auto w = w_ * q.w_ - x_ * q.x_ - y_ * q.y_ - z_ * q.z_;
77 return Quaternion(x, y, z, w);
78 }
79
operator ==(const Quaternion& q) const80 bool operator==(const Quaternion& q) const
81 {
82 return NearEqual(x_, q.x_) && NearEqual(y_, q.y_)
83 && NearEqual(z_, q.z_) && NearEqual(w_, q.w_);
84 }
85
operator !=(const Quaternion& q) const86 bool operator!=(const Quaternion& q) const
87 {
88 return !operator==(q);
89 }
90
inverse() const91 Quaternion inverse() const
92 {
93 return { -x_, -y_, -z_, w_ };
94 }
95
flip() const96 Quaternion flip() const
97 {
98 return { -x_, -y_, -z_, -w_ };
99 }
100
101 // Blends with the given quaternion, |q|, via spherical linear interpolation.
102 // Values of |t| in the range [0, 1] will interpolate between |this| and |q|,
103 // and values outside that range will extrapolate beyond in either direction.
104 Quaternion Slerp(const Quaternion& q, double t) const;
105
106 private:
107 double x_ = 0.0;
108 double y_ = 0.0;
109 double z_ = 0.0;
110 double w_ = 0.0;
111 };
112
113 // |s| is an arbitrary, real constant.
operator *(const Quaternion& q, double s)114 inline Quaternion operator*(const Quaternion& q, double s)
115 {
116 return Quaternion(q.GetX() * s, q.GetY() * s, q.GetZ() * s, q.GetW() * s);
117 }
118
119 // |s| is an arbitrary, real constant.
operator *(double s, const Quaternion& q)120 inline Quaternion operator*(double s, const Quaternion& q)
121 {
122 return Quaternion(q.GetX() * s, q.GetY() * s, q.GetZ() * s, q.GetW() * s);
123 }
124
125 } // namespace OHOS::Ace
126
127 #endif // FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_QUATERNION_H
128