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_ARC_H
17#define FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_ARC_H
18
19#include "base/geometry/point.h"
20#include "base/utils/utils.h"
21
22#define PI_NUM 3.1415926f
23
24namespace OHOS::Ace {
25
26class Arc {
27public:
28    Arc() = default;
29    ~Arc() = default;
30
31    const Point& GetCenterPoint() const
32    {
33        return centerPoint_;
34    }
35
36    void SetCenterPoint(const Point& point)
37    {
38        centerPoint_ = point;
39    }
40
41    double GetRadius() const
42    {
43        return radius_;
44    }
45
46    void SetRadius(double radius)
47    {
48        radius_ = radius;
49    }
50
51    double GetStartAngle() const
52    {
53        return startAngle_;
54    }
55
56    void SetStartAngle(double angle)
57    {
58        startAngle_ = angle;
59    }
60
61    double GetEndAngle() const
62    {
63        return endAngle_;
64    }
65
66    void SetEndAngle(double angle)
67    {
68        endAngle_ = angle;
69    }
70
71    double GetSweepAngle() const
72    {
73        return endAngle_ - startAngle_;
74    }
75
76    void Rotate(const Point& point, double angle)
77    {
78        centerPoint_.Rotate(point, angle);
79        startAngle_ += angle;
80        endAngle_ += angle;
81    }
82
83    void Move(double xOffset, double yOffset)
84    {
85        centerPoint_.SetX(centerPoint_.GetX() + xOffset);
86        centerPoint_.SetY(centerPoint_.GetY() + yOffset);
87    }
88
89    void GetPointByAngle(double angle, Point& out) const
90    {
91        out.SetX(centerPoint_.GetX() + radius_);
92        out.SetY(centerPoint_.GetY());
93        out.Rotate(centerPoint_, angle);
94    }
95
96    void GetStartPoint(Point& out) const
97    {
98        GetPointByAngle(startAngle_, out);
99    }
100
101    void GetEndPoint(Point& out) const
102    {
103        GetPointByAngle(endAngle_, out);
104    }
105
106    Point GetStartPoint() const
107    {
108        Point startPoint;
109        GetStartPoint(startPoint);
110        return startPoint;
111    }
112
113    Point GetEndPoint() const
114    {
115        Point endPoint;
116        GetEndPoint(endPoint);
117        return endPoint;
118    }
119
120    double GetLeft() const
121    {
122        return centerPoint_.GetX() - radius_;
123    }
124
125    double GetRight() const
126    {
127        return centerPoint_.GetX() + radius_;
128    }
129
130    double GetTop() const
131    {
132        return centerPoint_.GetY() - radius_;
133    }
134
135    double GetBottom() const
136    {
137        return centerPoint_.GetY() + radius_;
138    }
139
140private:
141    Point centerPoint_;
142    double radius_ = 0.0;
143    double startAngle_ = 0.0;
144    double endAngle_ = 0.0;
145};
146
147} // namespace OHOS::Ace
148
149#endif // FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_ARC_H
150