Math.h
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:5k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     Linear Algebra / Math library
  3.     Copyright (C) 2003-2009, Marek Olsak (maraeo@gmail.com), All Rights Reserved.
  4.     Copyright (C) 2003-2005, Tomas Pastorek (tomas@tomaspastorek.cz), All Rights Reserved.
  5.     This program is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU General Public License
  7.     as published by the Free Software Foundation; either version 2
  8.     of the License, or (at your option) any later version.
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.     You should have received a copy of the GNU General Public License
  14.     along with this program; if not, write to the Free Software
  15.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  16. */
  17. #pragma once
  18. namespace Rune
  19. {
  20.     /**
  21.         Definuje matematicke konstanty a funkce, vhodne pro pouziti v sablonach. Vetsina z nich je
  22.         designovana pro typy realnych cisel.
  23.     **************************************************************************************************/
  24.     template<typename T>
  25.     class Math
  26.     {
  27.     public:
  28.         // Konstanty
  29.         static T Pi()                   { return T(3.1415926535897932384626433832795); }
  30.         static T Pi2()                  { return T(6.283185307179586476925286766559); }
  31.         static T PiHalf()               { return T(1.5707963267948966192313216916398); }
  32.         static T Deg()                  { return T(57.295779513082320876798154814105); }
  33.         static T Rad()                  { return T(0.017453292519943295769236907684886); }
  34.         static T Epsilon()              { return T(0.0001); }
  35.         static T Epsilon2()             { return T(0.000001); }
  36.         static T Sqrt2()                { return T(1.4142135623730950488016887242097); }
  37.         static T Sqrt2Inv()             { return T(0.70710678118654752440084436210485); }
  38.         // Funkce
  39.         static T Sin(T f)               { return T(sin(f)); }
  40.         static T SinDeg(T f)            { return Sin(f*Rad()); }
  41.         static T Asin(T f)              { return T(asin(f)); }
  42.         static T Cos(T f)               { return T(cos(f)); }
  43.         static T CosDeg(T f)            { return Cos(f*Rad()); }
  44.         static T Acos(T f)              { return (f > 1)? 0 : (f < -1)? Pi() : T(acos(f)); }
  45.         static T Tan(T f)               { return T(tan(f)); }
  46.         static T TanDeg(T f)            { return Tan(f*Rad()); }
  47.         static T Atan(T f)              { return T(atan(f)); }
  48.         static T Cotan(T f)             { return 1 / Tan(f); }
  49.         static T CotanDeg(T f)          { return Cotan(f*Rad()); }
  50.         static T Atan2(T f, T g)        { return T(atan2(f, g)); }
  51.         static T Sqr(T f)               { return f*f; }
  52.         static T Sqrt(T f)              { return T(sqrt(f)); }
  53.         static T Cube(T f)              { return f*f*f; }
  54.         static T Abs(T f)               { return fabs(f); }
  55.         static T Min(T f, T g)          { return (f < g)? f : g; }
  56.         static T Max(T f, T g)          { return (f > g)? f : g; }
  57.         static T Clamp(T f, T min, T max) { return Min(Max(f, min), max); }
  58.         static T Saturate(T f)          { return Clamp(f, 0, 1); }
  59.         static T Sign(T f)              { return f < 0 ? -1 : (f > 0 ?  1 : 0); }
  60.         static T Floor(T f)             { return T(floor(f)); }
  61.         static T Ceil(T f)              { return T(ceil(f)); }
  62.         static T Round(T f)             { return Floor(f + T(0.5)); }
  63.         static T Frac(T f)              { return T(fmod(f, 1)); }
  64.         static bool SafeIsZero(T f)     { return f < Epsilon() && f > -Epsilon(); }
  65.         static bool SafeIsEqual(T f, T g) { return f < g+Epsilon() && f > g-Epsilon(); }
  66.         static T Discriminant(T a, T b, T c) { return b*b - 4*a*c; }
  67.         static T QuadraticEquationRoot(T a, T b, T d, T sign) { return (-b + sign * Sqrt(d)) / (2*a); }
  68.         static float RsqrtApprox(float a)
  69.         {
  70.             return union_cast<float>(0x5f3759df - (union_cast<int32>(a) >> 1));
  71.         }
  72.         // Commented out because it's too slow and doesn't give us any advantage over standard 1/sqrt
  73.         // Isn't the 64bit integer arithmetic little sluggish on 32bit architecture?
  74.         /*inline double RsqrtApprox(double a)
  75.         {
  76.             return union_cast<double>(0x5fe6ec85e7de30daLL - (union_cast<int64>(a) >> 1));
  77.         }*/
  78. #if 1
  79.         // 1 / Sqrt(f).
  80.         static T Rsqrt(T a)
  81.         {
  82.             return 1 / Sqrt(a);
  83.         }
  84. #else
  85.         // Fast approximation of 1 / Sqrt(f).
  86.         static T Rsqrt(T a, int iterations = 4)
  87.         {
  88.             T g = T(RsqrtApprox(float(a)));
  89.             // Improve the accuracy using Newton's method
  90.             T halfa = T(0.5) * a;
  91.             for (int i = 0; i < iterations; i++)
  92.                 g *= T(1.5) - halfa*g*g;
  93.             return g;
  94.         }
  95. #endif
  96.     };
  97.     typedef Math<float> Mathf;
  98.     typedef Math<double> Mathd;
  99.     typedef Math<int32> Mathi;
  100. }