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 165 166 167
|
/* ResidualVM - A 3D game interpreter
*
* ResidualVM 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 2
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef MATH_ANGLE_H
#define MATH_ANGLE_H
#include "common/scummsys.h"
namespace Common {
class Debug;
}
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::Debug &operator<<(Common::Debug &dbg, const Math::Angle &a);
}
#endif
|