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