44#include " common.h"
55#include < glm/gtx/vector_angle.hpp>
66
7+ #ifndef K_ANGLE_UNIT
8+ #define K_ANGLE_UNIT TURNS
9+ #endif
10+
711class Angle
812{
913
10- float m_fDeg ;
14+ float m_fTurns ;
1115
1216 public:
1317
1418 enum Type{
19+ TURNS = 0 ,
1520 DEGREES,
1621 RADIANS
17- // TURNS
1822 };
1923
20- Angle (float a = 0 .0f , Type t = DEGREES )
24+ Angle (float a = 0 .0f , Type t = K_ANGLE_UNIT )
2125 {
22- m_fDeg = t==DEGREES ? a : RAD2DEGf (a);
26+ switch (t){
27+ case DEGREES:
28+ m_fTurns = a;
29+ break ;
30+ case RADIANS:
31+ m_fTurns = RAD2DEGf (a);
32+ break ;
33+ case TURNS:
34+ m_fTurns = RAD2DEGf (a*K_TAU);
35+ break ;
36+ default :
37+ assert (false );
38+ }
2339 wrap ();
2440 }
2541
2642 // Angle(const glm::vec2& v) {
27- // m_fDeg = glm::angle(Axis::X, glm::normalize(v));
43+ // m_fTurns = glm::angle(Axis::X, glm::normalize(v));
2844 // }
2945
3046 glm::vec2 vector () const {
31- return glm::vec2 (cos (), sin ());
47+ return glm::vec2 (Angle:: cos (), Angle:: sin ());
3248 }
3349
3450 // static Angle between(const Angle& a, const Angle& b) {
@@ -39,108 +55,109 @@ class Angle
3955 return Angle (deg, DEGREES);
4056 }
4157 static Angle radians (float rad) {
42- return Angle (rad, RADIANS);
58+ return Angle (RAD2DEGf ( rad) , RADIANS);
4359 }
4460 static Angle turns (float t) {
4561 return Angle (t * 360 .0f , DEGREES);
4662 }
4763
4864 void wrap ()
4965 {
50- while (m_fDeg >= 180 . 0f )
51- m_fDeg -= 360 .0f ;
52- while (m_fDeg < -180 . 0f )
53- m_fDeg += 360 .0f ;
66+ while (m_fTurns >= 0 . 5f )
67+ m_fTurns -= 1 .0f ;
68+ while (m_fTurns < -0 . 5f )
69+ m_fTurns += 1 .0f ;
5470 }
5571
5672 glm::vec2 vector (float mag = 1 .0f ) {
57- float rad = DEG2RADf (m_fDeg) ;
73+ float rad = m_fTurns*K_TAU ;
5874 return glm::vec2 (
5975 mag * std::cos (rad),
6076 mag * std::sin (rad)
6177 );
6278 }
6379
6480 float cos () const {
65- return std::cos (DEG2RADf (m_fDeg ));
81+ return std::cos (DEG2RADf (m_fTurns ));
6682 }
6783 float sin () const {
68- return std::sin (DEG2RADf (m_fDeg ));
84+ return std::sin (DEG2RADf (m_fTurns ));
6985 }
7086
71- Angle flip () {
72- return *this +Angle::degrees ( 180 . 0f );
87+ Angle flip () const {
88+ return *this +Angle::turns ( 0 . 5f );
7389 }
7490
75- float degrees () const { return m_fDeg; }
76- float radians () const { return DEG2RADf (m_fDeg); }
91+ float degrees () const { return m_fTurns*360 .0f ; }
92+ float radians () const { return m_fTurns*K_TAU; }
93+ float turns () const { return DEG2RADf (m_fTurns*K_TAU); }
7794 // void degrees(float deg) {
78- // m_fDeg = deg;
95+ // m_fTurns = deg;
7996 // wrap();
8097 // }
8198 // void radians(float rad) {
82- // m_fDeg = RAD2DEGf(rad);
99+ // m_fTurns = RAD2DEGf(rad);
83100 // wrap();
84101 // }
85102
86103 Angle operator +(const Angle& a) const {
87- return Angle (m_fDeg + a.degrees ());
104+ return Angle (m_fTurns + a.turns ());
88105 }
89106 const Angle& operator +=(const Angle& a) {
90107 return (*this = *this +a);
91108 }
92109 Angle operator -(const Angle& a) const {
93- return Angle (m_fDeg - a.degrees ());
110+ return Angle (m_fTurns - a.turns ());
94111 }
95112 Angle operator -() const {
96- return Angle (-m_fDeg );
113+ return Angle (-m_fTurns );
97114 }
98115 Angle operator *(float f) const {
99- return Angle (m_fDeg * f);
116+ return Angle (m_fTurns * f);
100117 }
101118 const Angle& operator *=(float f) {
102119 return (*this = *this *f);
103120 }
104121 bool operator ==(const Angle& a) const {
105- return floatcmp (m_fDeg , a.degrees ());
122+ return floatcmp (m_fTurns , a.turns ());
106123 }
107124
108125 bool operator ==(float f) const {
109- return floatcmp (m_fDeg , Angle::degrees (f).degrees ());
126+ return floatcmp (m_fTurns , Angle::turns (f).turns ());
110127 }
111128 bool operator !=(float f) const {
112- return !floatcmp (m_fDeg , Angle::degrees (f).degrees ());
129+ return !floatcmp (m_fTurns , Angle::turns (f).turns ());
113130 }
114131 const Angle& operator =(float f) {
115- m_fDeg = f;
132+ m_fTurns = f;
116133 wrap ();
117134 return *this ;
118135 }
119136
120137 bool operator >(float f) const {
121- return degrees () > f;
138+ return turns () > f;
122139 }
123140 bool operator >=(float f) const {
124- return degrees () >= f;
141+ return turns () >= f;
125142 }
126143 bool operator <(float f) const {
127- return degrees () < f;
144+ return turns () < f;
128145 }
129146 bool operator <=(float f) const {
130- return degrees () <= f;
147+ return turns () <= f;
131148 }
132149
133150 bool operator >(const Angle& a) const {
134- return degrees () > a.degrees ();
151+ return turns () > a.turns ();
135152 }
136153 bool operator >=(const Angle& a) const {
137- return degrees () >= a.degrees ();
154+ return turns () >= a.turns ();
138155 }
139156 bool operator <(const Angle& a) const {
140- return degrees () < a.degrees ();
157+ return turns () < a.turns ();
141158 }
142159 bool operator <=(const Angle& a) const {
143- return degrees () <= a.degrees ();
160+ return turns () <= a.turns ();
144161 }
145162};
146163
0 commit comments