mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-10 04:57:00 -04:00
75 lines
2.4 KiB
C++
75 lines
2.4 KiB
C++
//+----------------------------------------------------------------------------+
|
|
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
|
|
//| Copyright: (C) Twan van Laarhoven and the other MSE developers |
|
|
//| License: GNU General Public License 2 or later (see file COPYING) |
|
|
//+----------------------------------------------------------------------------+
|
|
|
|
#pragma once
|
|
|
|
// ----------------------------------------------------------------------------- : Includes
|
|
|
|
#include <util/prec.hpp>
|
|
|
|
// ----------------------------------------------------------------------------- : Degrees & radians
|
|
|
|
typedef double Degrees;
|
|
typedef double Radians;
|
|
|
|
/// Convert radians to degrees
|
|
inline Degrees rad_to_deg(Radians rad) { return rad * (180.0 / M_PI); }
|
|
/// Convert degrees to radians
|
|
inline Radians deg_to_rad(Degrees deg) { return deg * (M_PI / 180.0); }
|
|
|
|
// ----------------------------------------------------------------------------- : Angle constants
|
|
|
|
const Radians rad0 = 0;
|
|
const Radians rad45 = 0.25*M_PI;
|
|
const Radians rad90 = 0.5*M_PI;
|
|
const Radians rad180 = M_PI;
|
|
const Radians rad270 = 1.5*M_PI;
|
|
const Radians rad360 = 2.0*M_PI;
|
|
|
|
/// Are two floating point numbers equal up to a small epsilon?
|
|
inline bool almost_equal(double x, double y) {
|
|
return fabs(x-y) < 1e-5;
|
|
}
|
|
inline bool is_rad0(double x) {
|
|
return almost_equal(x,0) || almost_equal(x,rad360);
|
|
}
|
|
inline bool is_rad90(double x) {
|
|
return almost_equal(x,rad90);
|
|
}
|
|
inline bool is_rad180(double x) {
|
|
return almost_equal(x,rad180);
|
|
}
|
|
inline bool is_rad270(double x) {
|
|
return almost_equal(x,rad270);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------- : Angle functions
|
|
|
|
// mod as it should be: answer in range [0..m)
|
|
inline double sane_fmod(double x, double m) {
|
|
double ans = fmod(x,m);
|
|
if (ans < 0) return ans + m;
|
|
else return ans;
|
|
}
|
|
|
|
// constrain an angle to [0..2pi)
|
|
inline Radians constrain_radians(Radians angle) {
|
|
return sane_fmod(angle, 2*M_PI);
|
|
}
|
|
|
|
/// Is an angle a multiple of 90 degrees?
|
|
inline bool is_straight(Radians angle) {
|
|
return almost_equal(sane_fmod(angle+rad45,rad90), rad45);
|
|
}
|
|
|
|
/// Is an angle sideways (i.e. closer to 90 or 270 degrees than to 0 or 180 degrees)?
|
|
inline bool is_sideways(Radians angle) {
|
|
double a = sane_fmod(angle,M_PI);
|
|
return (a > 0.25*M_PI && a < 0.75*M_PI);
|
|
}
|
|
|
|
|