forked from scummvm/scummvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathangle.h
164 lines (134 loc) · 3.94 KB
/
angle.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef MATH_ANGLE_H
#define MATH_ANGLE_H
#include "common/scummsys.h"
namespace Common {
class StreamDebug;
}
namespace Math {
class Angle {
public:
/**
* Construct an angle object.
*
* \param degrees The angle, in degrees. Default is 0.
*/
Angle(float degrees = 0);
/**
* Construct and angle object, copying an already existing one.
*
* \param a The angle to copy.
*/
Angle(const Angle &a);
/**
* Normalize the angle in a [x; x + 360] range and return the object.
*
* \param low The lower bound of the range, in degrees.
*/
Angle &normalize(float low);
/**
* Clamp the angle to range [-mag, mag]
*
* \param mag The maximum distance from 0, in degrees.
*/
Angle &clampDegrees(float mag);
/**
* Clamp the angle to range [-min, max]
*
* \param min The lower bound of the range, in degrees.
* \param max The upper bound of the range, in degrees.
*/
Angle &clampDegrees(float min, float max);
void setDegrees(float degrees);
void setRadians(float radians);
float getDegrees() const;
float getRadians() const;
/**
* Returns the degrees of the angle, in the defined range.
*
* \param low The lower bound of the range, in degrees.
*/
float getDegrees(float low) const;
/**
* Returns the radianss of the angle, in the defined range.
*
* \param low The lower bound of the range, in degrees.
*/
float getRadians(float low) const;
float getCosine() const;
float getSine() const;
float getTangent() const;
Angle &operator=(const Angle &a);
Angle &operator=(float degrees);
Angle &operator+=(const Angle &a);
Angle &operator+=(float degrees);
Angle &operator-=(const Angle &a);
Angle &operator-=(float degrees);
/**
* Build an angle object.
*
* \param radians The angle, in radians.
*/
static Angle fromRadians(float radians);
static Angle arcCosine(float x);
static Angle arcSine(float x);
static Angle arcTangent(float x);
static Angle arcTangent2(float y, float x);
private:
float _degrees;
};
inline Angle operator-(const Angle &a) {
return Angle(-a.getDegrees());
}
inline Angle operator+(const Angle &a1, const Angle &a2) {
return Angle(a1.getDegrees() + a2.getDegrees());
}
inline Angle operator-(const Angle &a1, const Angle &a2) {
return Angle(a1.getDegrees() - a2.getDegrees());
}
inline Angle operator*(const Angle &a1, float f) {
return Angle(a1.getDegrees() * f);
}
inline Angle operator*(float f, const Angle &a2) {
return Angle(a2.getDegrees() * f);
}
inline Angle operator/(const Angle &a1, float f) {
return Angle(a1.getDegrees() / f);
}
inline Angle operator/(float f, const Angle &a2) {
return Angle(a2.getDegrees() / f);
}
inline bool operator==(const Angle &a1, const Angle &a2) {
return fabsf(a1.getDegrees() - a2.getDegrees()) < 0.001;
}
inline bool operator!=(const Angle &a1, const Angle &a2) {
return !(a1 == a2);
}
inline bool operator<(const Angle &a1, const Angle &a2) {
return a1.getDegrees() < a2.getDegrees();
}
inline bool operator>(const Angle &a1, const Angle &a2) {
return a1.getDegrees() > a2.getDegrees();
}
Common::StreamDebug &operator<<(Common::StreamDebug &dbg, const Math::Angle &a);
}
#endif