1 ////////////////////////////////////////////////////////////////////////// 2 // 3 // Fixed Point Math Class 4 // 5 ////////////////////////////////////////////////////////////////////////// 6 // 7 // Released under GNU license 8 // Erik H Gawtry 9 // July, 2005 Version 1.0 10 // Altered G Camp 11 // Aug, 2007 Version 1.1 12 // 13 // 14 // Algorythms borrowed from: 15 // Andrew Ryder, 11 September 2001 16 // Joseph Hall, Unknown Date 17 // 18 // 19 ////////////////////////////////////////////////////////////////////////// 20 // 21 // Written for doing fixed point math on DSP processors 22 // 23 ////////////////////////////////////////////////////////////////////////// 24 25 #ifndef _FIXED_H 26 #define _FIXED_H 27 28 #include <SDL/SDL.h> 29 30 #ifndef SDL_HAS_64BIT_TYPE 31 #error 64 bit type has not been found for this system 32 #endif 33 34 class fixed 35 { 36 private: 37 Sint64 m_nVal; 38 public: fixed()39 fixed() 40 { 41 m_nVal = 0; 42 } 43 fixed(const fixed & fixedVal)44 fixed(const fixed& fixedVal) 45 { 46 m_nVal = fixedVal.m_nVal; 47 } 48 fixed(bool bInternal,Sint64 nVal)49 fixed(bool bInternal, Sint64 nVal) 50 { 51 m_nVal = nVal; 52 } 53 fixed(unsigned int nVal)54 fixed(unsigned int nVal) 55 { 56 m_nVal = Sint64(nVal)*FIXED_RESOLUTION; 57 } 58 fixed(int nVal)59 fixed(int nVal) 60 { 61 m_nVal = Sint64(nVal)*FIXED_RESOLUTION; 62 } 63 fixed(Sint64 nVal)64 fixed(Sint64 nVal) 65 { 66 m_nVal = nVal*FIXED_RESOLUTION; 67 } 68 69 fixed(const char *nVal); 70 ~fixed()71 ~fixed() 72 { 73 } 74 75 fixed operator++() 76 { 77 m_nVal += FIXED_RESOLUTION; 78 return *this; 79 } 80 81 fixed operator--() 82 { 83 m_nVal -= FIXED_RESOLUTION; 84 return *this; 85 } 86 87 fixed operator-() 88 { 89 return fixed(0) - *this; 90 } 91 92 fixed& operator=(fixed fixedVal) 93 { 94 m_nVal = fixedVal.m_nVal; 95 return *this; 96 } 97 98 bool operator==(fixed fixedVal) 99 { 100 return (m_nVal == fixedVal.m_nVal); 101 } 102 103 bool operator!=(fixed fixedVal) 104 { 105 return (m_nVal != fixedVal.m_nVal); 106 } 107 108 bool operator<(fixed fixedVal) 109 { 110 return (m_nVal < fixedVal.m_nVal); 111 } 112 113 bool operator<=(fixed fixedVal) 114 { 115 return (m_nVal <= fixedVal.m_nVal); 116 } 117 118 bool operator>(fixed fixedVal) 119 { 120 return (m_nVal > fixedVal.m_nVal); 121 } 122 123 bool operator>=(fixed fixedVal) 124 { 125 return (m_nVal >= fixedVal.m_nVal); 126 } 127 128 const char *asString(); 129 const char *asQuickString(); 130 asFloat()131 float asFloat() 132 { 133 return m_nVal/FIXED_RESOLUTION_FLOAT; 134 } 135 asInt()136 int asInt() 137 { 138 return (int)(m_nVal/FIXED_RESOLUTION); 139 } 140 getInternalData()141 Sint64 getInternalData() 142 { 143 return m_nVal; 144 } 145 floor()146 fixed floor() 147 { 148 return fixed(m_nVal/FIXED_RESOLUTION); 149 } 150 ceil()151 fixed ceil() 152 { 153 return fixed(m_nVal/FIXED_RESOLUTION+Sint64(1)); 154 } 155 156 fixed operator+(fixed b) 157 { 158 fixed a; 159 a.m_nVal = m_nVal+b.m_nVal; 160 return a; 161 } 162 163 fixed operator-(fixed b) 164 { 165 fixed a; 166 a.m_nVal = m_nVal-b.m_nVal; 167 return a; 168 } 169 170 fixed operator*(fixed b); 171 fixed operator/(fixed b); 172 fixed sqrt(); 173 fixed pow(fixed fixedPower); 174 fixed log10(); 175 fixed log(); 176 fixed exp(); 177 fixed cos(); 178 fixed sin(); 179 fixed tan(); 180 fixed asin(); 181 fixed acos(); 182 fixed atan(); 183 abs()184 fixed abs() 185 { 186 if (m_nVal > Sint64(0)) return fixed(*this); 187 else return fixed(true, -m_nVal); 188 } 189 190 fixed operator%(fixed fixedVal) 191 { 192 fixed a; 193 a.m_nVal = m_nVal%fixedVal.m_nVal; 194 return a; 195 } 196 197 fixed operator*=(fixed val); 198 fixed operator/=(fixed val); 199 200 fixed operator-=(fixed val) 201 { 202 m_nVal -= val.m_nVal; 203 return *this; 204 } 205 206 fixed operator+=(fixed val) 207 { 208 m_nVal += val.m_nVal; 209 return *this; 210 } 211 212 static fixed MAX_FIXED; 213 static fixed MIN_FIXED; 214 static fixed XPI; 215 static fixed X2PI; 216 static fixed XPIO2; 217 218 static fixed fromFloat(float flt); 219 220 static Sint64 FIXED_RESOLUTION; 221 static float FIXED_RESOLUTION_FLOAT; 222 }; 223 224 fixed absx( fixed p_Base ); 225 fixed floorx(fixed fixedVal); 226 fixed ceilx(fixed fixedVal); 227 fixed sqrtx(fixed fixedVal); 228 fixed powx(fixed fixedVal, fixed fixedPower); 229 fixed log10x(fixed fixedVal); 230 fixed logx(fixed fixedVal); 231 fixed expx(fixed fixedVal); 232 fixed sinx(fixed x); 233 fixed asinx(fixed x); 234 fixed cosx(fixed x); 235 fixed acosx(fixed x); 236 fixed tanx(fixed x); 237 fixed atanx(fixed x); 238 fixed atan2x(fixed x, fixed y); 239 240 #endif // _FIXED_H 241 242