home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch7_7 / libgm / gmutils.h < prev    next >
C/C++ Source or Header  |  1995-03-07  |  2KB  |  155 lines

  1. // gmUtils.h - graphics math utility functions
  2. //
  3. // libgm++: Graphics Math Library
  4. // Ferdi Scheepers and Stephen F May
  5. // 15 June 1994
  6.  
  7. #ifndef GMUTILS_H
  8. #define GMUTILS_H
  9.  
  10. #include <iostream.h>
  11. #include <math.h>
  12. #include <bool.h>
  13. #include <gmConst.h>
  14.  
  15. // ONE-ARGUMENT UTILITY FUNCTIONS
  16.  
  17. inline double gmAbs(double f)
  18. {
  19.   return (f >= 0) ? f : -f;
  20. }
  21.  
  22. inline double gmCeil(double f)
  23. {
  24.   return (f == int(f)) ? f : (f > 0) ? double(int(f) + 1) : double(int(f));
  25. }
  26.  
  27. inline double gmCube(double f)
  28. {
  29.   return f * f * f;
  30. }
  31.  
  32. inline double gmDegrees(double f)
  33. {
  34.   return f * gmRADTODEG;
  35. }
  36.  
  37. inline double gmFloor(double f)
  38. {
  39.   return (f == int(f)) ? f : (f > 0) ? double(int(f)) : double(int(f) - 1);
  40. }
  41.  
  42. inline double gmInv(double f)
  43. {
  44.   return 1.0 / f;
  45. }
  46.  
  47. inline bool gmIsZero(double f)
  48. {
  49.   return (gmAbs(f) < gmEPSILON);
  50. }
  51.  
  52. inline double gmRadians(double f)
  53. {
  54.   return f * gmDEGTORAD;
  55. }
  56.  
  57. inline double gmRound(double f)
  58. {
  59.   return (f >= 0) ? double(int(f + 0.5)) : double(- int(0.5 - f));
  60. }
  61.  
  62. inline double gmSign(double f)
  63. {
  64.   return (f < 0) ? -1.0 : 1.0;
  65. }
  66.  
  67. inline double gmSmooth(double f)
  68. {
  69.   return (3.0 - 2.0 * f) * f * f;
  70. }
  71.  
  72. inline double gmSqr(double f)
  73. {
  74.   return f * f;
  75. }
  76.  
  77. inline double gmTrunc(double f)
  78. {
  79.   return double(int(f));
  80. }
  81.  
  82. inline double gmZSign(double f)
  83. {
  84.   return (f > 0) ? 1.0 : (f < 0) ? -1.0 : 0.0;
  85. }
  86.  
  87. // TWO-ARGUMENT UTILITY FUNCTIONS
  88.  
  89. inline bool gmFuzEQ(double f, double g)
  90. {
  91.   return (f <= g) ? (f >= g - gmEPSILON) : (f <= g + gmEPSILON);
  92. }
  93.  
  94. inline bool gmFuzGEQ(double f, double g)
  95. {
  96.   return (f >= g - gmEPSILON);
  97. }
  98.  
  99. inline bool gmFuzLEQ(double f, double g)
  100. {
  101.   return (f <= g + gmEPSILON);
  102. }
  103.  
  104. inline double gmMax(double f, double g)
  105. {
  106.   return (f > g) ? f : g;
  107. }
  108.  
  109. inline double gmMin(double f, double g)
  110. {
  111.   return (f < g) ? f : g;
  112. }
  113.  
  114. inline void gmSwap(double& f, double& g)
  115. {
  116.   double gmTmp = f; f = g; g = gmTmp;
  117. }
  118.  
  119. inline void gmSwap(int& i, int& j)
  120. {
  121.   int gmTmp = i; i = j; j = gmTmp;
  122. }
  123.  
  124. // MULTI-ARGUMENT UTILITY FUNCTIONS
  125.  
  126. inline void gmClamp(double &f, double l, double h)
  127. {
  128.   if(f < l) f = l;
  129.   if(f > h) f = h;
  130. }
  131.  
  132. inline double gmLerp(double f, double l, double h)
  133. {
  134.   return l + ((h - l) * f );
  135. }
  136.  
  137. inline double gmMax(double f, double g, double h)
  138. {
  139.   return (f > g) ? gmMax(f, h) : gmMax(g, h);
  140. }
  141.  
  142. inline double gmMin(double f, double g, double h)
  143. {
  144.   return (f < g) ? gmMin(f, h) : gmMin(g, h);
  145. }
  146.  
  147. inline double gmSlide(double f, double l, double h)
  148. {
  149.   return (f < 0) ? l : (f > 1) ? h : gmLerp(gmSmooth(f), l, h);
  150. }
  151.  
  152. #endif
  153.  
  154.  
  155.