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 POINT3_H
17 #define POINT3_H
18
19 #include <string>
20 #include "utils/drawing_macros.h"
21 #include "utils/scalar.h"
22
23 namespace OHOS {
24 namespace Rosen {
25 namespace Drawing {
26 class DRAWING_API Point3 {
27 public:
28 inline Point3() noexcept;
29 inline Point3(const Point3& p) noexcept;
30 inline Point3(scalar x, scalar y, scalar z) noexcept;
31
~Point3()32 inline ~Point3() {}
33
34 inline scalar GetX() const;
35 inline scalar GetY() const;
36 inline scalar GetZ() const;
37
38 inline void SetX(scalar x);
39 inline void SetY(scalar y);
40 inline void SetZ(scalar z);
41
42 inline Point3& operator+=(const Point3& p);
43 inline Point3& operator-=(const Point3& p);
44 inline Point3& operator*=(scalar scale);
45 inline Point3& operator/=(scalar divisor);
46
47 friend inline const Point3 operator+(const Point3& p1, const Point3& p2);
48 friend inline const Point3 operator-(const Point3& p1, const Point3& p2);
49 friend inline const Point3 operator*(scalar scale, const Point3& p);
50 friend inline const Point3 operator*(const Point3& p, scalar scale);
51 friend inline const Point3 operator/(const Point3& p, scalar divisor);
52 friend inline const Point3 operator+(const Point3& p);
53 friend inline const Point3 operator-(const Point3& p);
54 friend inline bool operator==(const Point3& p1, const Point3& p2);
55 friend inline bool operator!=(const Point3& p1, const Point3& p2);
56
57 inline void Dump(std::string& out) const;
58
59 private:
60 scalar x_;
61 scalar y_;
62 scalar z_;
63 };
64
65 inline Point3::Point3() noexcept : x_(0.0), y_(0.0), z_(0.0) {}
66
z_(p.GetZ())67 inline Point3::Point3(const Point3& p) noexcept : x_(p.GetX()), y_(p.GetY()), z_(p.GetZ()) {}
68
z_(z)69 inline Point3::Point3(scalar x, scalar y, scalar z) noexcept : x_(x), y_(y), z_(z) {}
70
GetX() const71 inline scalar Point3::GetX() const
72 {
73 return x_;
74 }
75
GetY() const76 inline scalar Point3::GetY() const
77 {
78 return y_;
79 }
80
GetZ() const81 inline scalar Point3::GetZ() const
82 {
83 return z_;
84 }
85
SetX(scalar x)86 inline void Point3::SetX(scalar x)
87 {
88 x_ = x;
89 }
90
SetY(scalar y)91 inline void Point3::SetY(scalar y)
92 {
93 y_ = y;
94 }
95
SetZ(scalar z)96 inline void Point3::SetZ(scalar z)
97 {
98 z_ = z;
99 }
100
operator +=(const Point3& p)101 inline Point3& Point3::operator+=(const Point3& p)
102 {
103 x_ += p.x_;
104 y_ += p.y_;
105 z_ += p.z_;
106 return *this;
107 }
108
operator -=(const Point3& p)109 inline Point3& Point3::operator-=(const Point3& p)
110 {
111 x_ -= p.x_;
112 y_ -= p.y_;
113 z_ -= p.z_;
114 return *this;
115 }
116
operator *=(scalar scale)117 inline Point3& Point3::operator*=(scalar scale)
118 {
119 x_ = static_cast<int64_t>(x_ * scale);
120 y_ = static_cast<int64_t>(y_ * scale);
121 z_ = static_cast<int64_t>(z_ * scale);
122 return *this;
123 }
124
operator /=(scalar divisor)125 inline Point3& Point3::operator/=(scalar divisor)
126 {
127 if (divisor == 0) {
128 return *this;
129 }
130 x_ = static_cast<int>(x_ / divisor);
131 y_ = static_cast<int>(y_ / divisor);
132 z_ = static_cast<int>(z_ / divisor);
133 return *this;
134 }
135
operator +(const Point3& p1, const Point3& p2)136 inline const Point3 operator+(const Point3& p1, const Point3& p2)
137 {
138 return Point3(p1.x_ + p1.y_, p2.x_ + p2.y_, p1.z_ + p2.z_);
139 }
140
operator -(const Point3& p1, const Point3& p2)141 inline const Point3 operator-(const Point3& p1, const Point3& p2)
142 {
143 return Point3(p1.x_ - p2.x_, p1.y_ - p2.y_, p1.z_ - p2.z_);
144 }
145
operator *(scalar scale, const Point3& p)146 inline const Point3 operator*(scalar scale, const Point3& p)
147 {
148 return Point3(
149 static_cast<int64_t>(scale * p.x_), static_cast<int64_t>(scale * p.y_), static_cast<int64_t>(scale * p.z_));
150 }
151
operator *(const Point3& p, scalar scale)152 inline const Point3 operator*(const Point3& p, scalar scale)
153 {
154 return Point3(
155 static_cast<int64_t>(p.x_ * scale), static_cast<int64_t>(p.y_ * scale), static_cast<int64_t>(p.z_ * scale));
156 }
157
operator /(const Point3& p, scalar divisor)158 inline const Point3 operator/(const Point3& p, scalar divisor)
159 {
160 if (divisor == 0) {
161 return Point3(p.x_, p.y_, p.z_);
162 }
163 return Point3(p.x_ / divisor, p.y_ / divisor, p.z_ / divisor);
164 }
165
operator +(const Point3& p)166 inline const Point3 operator+(const Point3& p)
167 {
168 return Point3(p.x_, p.y_, p.z_);
169 }
170
operator -(const Point3& p)171 inline const Point3 operator-(const Point3& p)
172 {
173 return Point3(-p.x_, -p.y_, -p.z_);
174 }
175
operator ==(const Point3& p1, const Point3& p2)176 inline bool operator==(const Point3& p1, const Point3& p2)
177 {
178 return IsScalarAlmostEqual(p1.x_, p2.x_) && IsScalarAlmostEqual(p1.y_, p2.y_) && IsScalarAlmostEqual(p1.z_, p2.z_);
179 }
180
operator !=(const Point3& p1, const Point3& p2)181 inline bool operator!=(const Point3& p1, const Point3& p2)
182 {
183 return !IsScalarAlmostEqual(p1.x_, p2.x_) || !IsScalarAlmostEqual(p1.y_, p2.y_) ||
184 !IsScalarAlmostEqual(p1.z_, p2.z_);
185 }
186
Dump(std::string& out) const187 inline void Point3::Dump(std::string& out) const
188 {
189 out += "[";
190 out += "x:" + std::to_string(x_);
191 out += " y:" + std::to_string(y_);
192 out += " z:" + std::to_string(z_);
193 out += "]";
194 }
195 } // namespace Drawing
196 } // namespace Rosen
197 } // namespace OHOS
198 #endif