Fixed.h
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:7k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // Based on SciTech MGL Public License Version 1.0. "High Speed Fixed/Floating Point Library".
  2. // The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
  3. // The Initial Developer of the Original Code is SciTech Software, Inc.
  4. // Copyright (C) 1999 DXGuide.  All Rights Reserved.
  5. // File: Fixed.h
  6. #ifndef _FIXED__H
  7. #define _FIXED__H
  8. #if _MSC_VER >= 1000
  9. #pragma once
  10. #endif // _MSC_VER >= 1000
  11. //#define _GENFIXEDTABLE
  12. //#define _TESTFIXED
  13. #define _USE_386ASM
  14. #define _FASTCALL
  15. typedef long Fixed; // 16.16 format
  16. extern "C"
  17. {
  18. #ifdef _FASTCALL
  19. Fixed __fastcall FXMul(Fixed  fA, Fixed  fB);
  20. Fixed __fastcall FXSquare(Fixed  f);
  21. Fixed __fastcall FXMulDiv(Fixed  fA, Fixed  fB, Fixed  fC);
  22. Fixed __fastcall FXDiv(Fixed  fA, Fixed  fB);
  23. Fixed __fastcall FXOneOver(Fixed  f);
  24. Fixed __fastcall FXSqrt(Fixed  f);
  25. Fixed __fastcall FXSin(Fixed  fAngle);
  26. Fixed __fastcall FXCos(Fixed  fAngle);
  27. Fixed __fastcall FXTan(Fixed  fAngle);
  28. Fixed __fastcall FXLog10(Fixed  f);
  29. Fixed __fastcall FXLog(Fixed  f);
  30. #else // !_FASTCALL
  31. Fixed __cdecl FXMul(Fixed  fA, Fixed  fB);
  32. Fixed __cdecl FXSquare(Fixed  f);
  33. Fixed __cdecl FXMulDiv(Fixed  fA, Fixed  fB, Fixed  fC);
  34. Fixed __cdecl FXDiv(Fixed  fA, Fixed  fB);
  35. Fixed __cdecl FXOneOver(Fixed  f);
  36. Fixed __cdecl FXSqrt(Fixed  f);
  37. Fixed __cdecl FXSin(Fixed  fAngle);
  38. Fixed __cdecl FXCos(Fixed  fAngle);
  39. Fixed __cdecl FXTan(Fixed  fAngle);
  40. Fixed __cdecl FXLog10(Fixed  f);
  41. Fixed __cdecl FXLog(Fixed  f);
  42. #endif // _FASTCALL
  43. };
  44. #ifndef _USE_386ASM
  45. #define FXSquare(f) FXMul(f, f)
  46. #define FXMulDiv(fA, fB, fC) FXMul(fA, FXDiv(fB, fC))
  47. #define FXOneOver(f) FXDiv(FXDbl2Real(1), f)
  48. #define FXCos(fAngle) FXSin(FXDbl2Real(90) + fAngle)
  49. #define FXLog(f) FXMul(FXLog10(f), FXDbl2Real(2.302585093))
  50. #endif // _USE_386ASM
  51. // The ceil(), floor() and round() operations can be quickly implemented using fast adds and masks.
  52. #define FXCeil(f) ((Fixed)(((f) + 0xFFFFL) & 0xFFFF0000L))
  53. #define FXFloor(f) ((Fixed)((f) & 0xFFFF0000L))
  54. #define FXRound(f) ((Fixed)(((f) + 0x8000L) & 0xFFFF0000L))
  55. // Conversion operations.
  56. #define FXInt2Real(i) ((Fixed)(i) << 16)
  57. #define FXDbl2Real(d) ((Fixed)((d) * 65536.0 + 0.5))
  58. #define FXRnd2Int(f) ((int)(((f) + 0x8000L) >> 16))
  59. #define FXReal2Dbl(f) ((double)((f) / 65536.0))
  60. // The following defines a C++ wrapper class for 16.16 fixed
  61. // point routines. Using this class is convenient (can be 
  62. // used just like any normal C++ data type)
  63. #include <iostream.h>
  64. class CFixed
  65. {
  66. public:
  67. CFixed()
  68. {
  69. };
  70. // Constructors for the fixed point data type
  71. CFixed(double  d)
  72. {
  73. m_fixed = FXDbl2Real(d);
  74. };
  75. CFixed(int  i)
  76. {
  77. m_fixed = FXInt2Real(i);
  78. };
  79. CFixed(Fixed  l)
  80. {
  81. m_fixed = l;
  82. };
  83. public:
  84. // Standard arithmetic operators for CFixed
  85. friend CFixed operator+(const CFixed&  f, const CFixed&  g)
  86. {
  87. return  CFixed(f.m_fixed + g.m_fixed);
  88. }
  89. friend CFixed operator+(const CFixed&  f, int  i)
  90. {
  91. return  CFixed(f.m_fixed + FXInt2Real(i));
  92. }
  93. friend CFixed operator+(int  i, const CFixed&  f)
  94. {
  95. return  CFixed(FXInt2Real(i) + f.m_fixed);
  96. }
  97. friend CFixed operator-(const CFixed&  f, const CFixed&  g)
  98. {
  99. return  CFixed(f.m_fixed - g.m_fixed);
  100. }
  101. friend CFixed operator-(const CFixed&  f, int  i)
  102. {
  103. return  CFixed(f.m_fixed - FXInt2Real(i));
  104. }
  105. friend CFixed operator-(int  i, const CFixed&  f)
  106. {
  107. return  CFixed(FXInt2Real(i) - f.m_fixed);
  108. }
  109. friend CFixed operator*(const CFixed&  f, const CFixed&  g)
  110. {
  111. return  CFixed(FXMul(f.m_fixed, g.m_fixed));
  112. }
  113. friend CFixed operator*(const CFixed&  f, int  i)
  114. {
  115. return  CFixed(f.m_fixed * i);
  116. }
  117. friend CFixed operator*(int  i, const CFixed&  f)
  118. {
  119. return  CFixed(f.m_fixed * i);
  120. }
  121. friend CFixed operator/(const CFixed&  f, const CFixed&  g)
  122. {
  123. return  CFixed(FXDiv(f.m_fixed, g.m_fixed));
  124. }
  125. friend CFixed operator/(const CFixed&  f, int  i)
  126. {
  127. return  CFixed(FXDiv(f.m_fixed, FXInt2Real(i)));
  128. }
  129. friend CFixed operator/(int  i, const CFixed&  f)
  130. {
  131. return  CFixed(FXDiv(FXInt2Real(i), f));
  132. }
  133. // Fixed point manipulation routines
  134. friend CFixed ceil(const CFixed&  f)
  135. {
  136. return  CFixed(FXCeil(f.m_fixed));
  137. };
  138. friend CFixed floor(const CFixed&  f)
  139. {
  140. return  CFixed(FXFloor(f.m_fixed));
  141. };
  142. friend CFixed round(const CFixed&  f)
  143. {
  144. return  CFixed(FXRound(f.m_fixed));
  145. };
  146. // Routines to compute a fixed point trig functions, with all angles in degrees
  147. friend CFixed sin(const CFixed&  a)
  148. {
  149. return  CFixed(FXSin(a.m_fixed));
  150. };
  151. friend CFixed cos(const CFixed&  a)
  152. {
  153. return  CFixed(FXCos(a.m_fixed));
  154. };
  155. friend CFixed tan(const CFixed&  a)
  156. {
  157. return  CFixed(FXTan(a.m_fixed));
  158. };
  159. // Routine to compute the square root for fixed point
  160. friend CFixed sqrt(const CFixed&  f)
  161. {
  162. return  CFixed(FXSqrt(f));
  163. };
  164. // Misc routines
  165. friend CFixed log(const CFixed&  f)
  166. {
  167. return  CFixed(FXLog(f.m_fixed));
  168. }
  169. friend CFixed log10(const CFixed&  f)
  170. {
  171. return  CFixed(FXLog10(f.m_fixed));
  172. }
  173. // Friend function to dump a fixed point value to a stream
  174. friend ostream& operator<<(ostream&  o, const CFixed&  f)
  175. {
  176. return  o << double(f);
  177. }
  178. public:
  179. CFixed& operator+=(const CFixed&  f)
  180. {
  181. m_fixed += f.m_fixed;
  182. return  *this;
  183. }
  184. CFixed& operator+=(int  i)
  185. {
  186. m_fixed += FXInt2Real(i);
  187. return  *this;
  188. }
  189. CFixed& operator-=(const CFixed&  f)
  190. {
  191. m_fixed -= f.m_fixed;
  192. return  *this;
  193. }
  194. CFixed& operator-=(int  i)
  195. {
  196. m_fixed -= FXInt2Real(i);
  197. return  *this;
  198. }
  199. CFixed& operator*=(const CFixed&  f)
  200. {
  201. m_fixed = FXMul(m_fixed, f.m_fixed);
  202. return  *this;
  203. }
  204. CFixed& operator*=(int  i)
  205. {
  206. m_fixed *= i;
  207. return  *this;
  208. }
  209. CFixed& operator/=(const CFixed&  f)
  210. {
  211. m_fixed = FXDiv(m_fixed, f.m_fixed);
  212. return  *this;
  213. }
  214. CFixed& operator/=(int  i)
  215. {
  216. m_fixed = FXDiv(m_fixed, FXInt2Real(i));
  217. return  *this;
  218. }
  219. // Unary arithmetic operators for CFixed point
  220. CFixed operator-() const
  221. {
  222. return  CFixed(-m_fixed);
  223. };
  224. // Relational operators for CFixed point
  225. int operator<(const CFixed&  f) const
  226. {
  227. return  m_fixed < f.m_fixed;
  228. };
  229. int operator<=(const CFixed&  f) const
  230. {
  231. return  m_fixed <= f.m_fixed;
  232. };
  233. int operator==(const CFixed&  f) const
  234. {
  235. return  m_fixed == f.m_fixed;
  236. };
  237. int operator!=(const CFixed&  f) const
  238. {
  239. return  m_fixed != f.m_fixed;
  240. };
  241. int operator>=(const CFixed&  f) const
  242. {
  243. return  m_fixed >= f.m_fixed;
  244. };
  245. int operator>(const CFixed&  f) const
  246. {
  247. return  m_fixed > f.m_fixed;
  248. };
  249. // Conversion routines
  250. operator int() const
  251. {
  252. return  (int)(m_fixed >> 16);
  253. };
  254. operator Fixed() const
  255. {
  256. return  m_fixed;
  257. };
  258. operator float() const
  259. {
  260. return  (float)(m_fixed / 65536.0);
  261. };
  262. operator double() const
  263. {
  264. return  FXReal2Dbl(m_fixed);
  265. };
  266. protected:
  267. Fixed m_fixed;
  268. };
  269. #endif // _FIXED__H