![]() |
VR-Link API Documentation for HLA 1.3
|
00001 /********************************************************************* 00002 ** Copyright (c) 1992-2010 VT MAK 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 00006 00007 #ifndef vlMath_H 00008 #define vlMath_H 00009 00014 00015 #if !defined(_WIN32) && !defined(VXWORKS) 00016 #include <sys/param.h> 00017 #endif 00018 00019 00020 #include <vlutil/vlMachineTypes.h> 00021 #include <math.h> 00022 #include <vlutil/vlExceptions.h> 00023 00024 #ifdef DtUSE_UTILITIES_NAMESPACE 00025 namespace DtUSE_UTILITIES_NAMESPACE 00026 { 00027 #endif 00028 00031 #define DtEPico 1.0E-12 00032 #define DtENano 1.0E-09 00033 #define DtEMicro 1.0E-06 00034 #define DtEMilli 1.0E-03 00035 #define DtECenti 1.0E-02 00036 #define DtEDeci 1.0E-01 00037 #define DtEHalf 5.0E-01 00038 #define DtENineTenths 9.0E-01 00039 #define DtEOne 1.0 00040 #define DtEDeca 1.0E01 00041 #define DtEHecto 1.0E02 00042 #define DtEKilo 1.0E03 00043 #define DtEMega 1.0E06 00044 #define DtEGiga 1.0E09 00045 00047 #define DtEq(x, y, e) ((DtAbs((x) - (y)) <= (e)) ? true : false) 00048 00049 #define M_2PI 6.28318530717958647693 /* 2Pi */ 00050 00051 #ifndef __darwin__ 00052 #define M_E 2.7182818284590452354 /* Euler constant "e" */ 00053 #define M_1_E 0.36787944117144232160 /* 1/e */ 00054 #define M_LN2 0.69314718055994530942 /* ln(2) */ 00055 #define M_LN10 2.30258509299404568402 /* ln(10) */ 00056 #define M_LOG2E 1.4426950408889634074 /* log2(e) = 1/ln(2) */ 00057 #define M_LOG10E 0.43429448190325182765 /* log10(e) = 1/ln(10) */ 00058 #define M_PI 3.14159265358979323846 /* Pythagorean constant "Pi" */ 00059 #define M_PI_2 1.57079632679489661923 /* Pi/2 */ 00060 #define M_PI_3 1.04719755119659774615 /* Pi/3 */ 00061 #define M_PI_4 0.78539816339744830962 /* Pi/4 */ 00062 #define M_1_PI 0.31830988618379067154 /* 1/Pi */ 00063 #define M_2_PI 0.63661977236758134308 /* 2/Pi */ 00064 #define M_3_PI 0.954929658551372014613 /* 3/Pi */ 00065 #define M_4_PI 1.27323954473516268615 /* 4/Pi */ 00066 #define M_SQRTPI 1.77245385090551602730 /* Sqrt(Pi) */ 00067 #define M_1_SQRTPI 0.564189583547756286948 /* 1/Sqrt(Pi) */ 00068 #define M_2_SQRTPI 1.12837916709551257390 /* 2/Sqrt(Pi) */ 00069 #define M_3_SQRTPI 1.69256875064326886084 /* 3/Sqrt(Pi) */ 00070 #define M_4_SQRTPI 2.25675833419102514779 /* 4/Sqrt(Pi) */ 00071 #define M_SQRT2PI 2.50662827463100050242 /* Sqrt(2Pi) */ 00072 #define M_1_SQRT2PI 0.39894228040143267794 /* 1/Sqrt(2Pi) */ 00073 #define M_RAD2DEG 57.2957795130823208768 /* 180/Pi radians --> degrees */ 00074 #define M_DEG2RAD 0.0174532925199432957692 /* Pi/180 degrees --> radians */ 00075 #define M_SQRT2 1.41421356237309504880 /* Sqrt(2) */ 00076 #define M_SQRT_2 0.707106781186547524401 /* 1/Sqrt(2) */ 00077 #define M_GOLDEN_R 0.6180339887498948482046 /* GoldenRatio: (Sqrt(5) - 1)/2 */ 00078 #endif 00079 00081 inline DT_DLL_MATRIX double DtRad2Deg(double rad) 00082 { 00083 return ((rad / M_PI) * 180.0); 00084 } 00085 00087 inline DT_DLL_MATRIX double DtDeg2Rad(double deg) 00088 { 00089 return ((deg * M_PI) / 180.0); 00090 } 00091 00093 template<typename T> 00094 T DtAbs(T x) 00095 { 00096 return (((x) >= 0) ? (x) : (-(x))); 00097 } 00098 00100 template<typename T> 00101 int DtSgn(T x) 00102 { 00103 return (((x) >= 0) ? 1 : -1); 00104 } 00105 00107 template<typename T> 00108 T DtPos(T x) 00109 { 00110 return (((x) >= 0) ? (x) : 0); 00111 } 00112 00114 template <typename T> 00115 T DtNeg(const T&val) 00116 { 00117 if (val >= 0) return 0; 00118 else return val; 00119 } 00120 00122 template <typename T> 00123 T DtSquare(const T& val) 00124 { 00125 return val * val; 00126 } 00127 00129 template <typename T> 00130 T DtLimit(T x,T lo ,T hi) 00131 { 00132 if(lo > hi) 00133 { 00135 return DtLimit(x,hi,lo); 00136 } 00137 if(x > hi) 00138 { 00139 return hi; 00140 } 00141 if(x < lo) 00142 { 00143 return lo; 00144 } 00145 return x; 00146 } 00147 00149 template <typename T> 00150 inline T DtMod(T a, T b) 00151 { 00152 return a % b; 00153 } 00154 00156 template <> 00157 inline float DtMod(float a, float b) 00158 { 00159 return (float)fmod((float)a,(float)b); 00160 } 00161 00163 template <> 00164 inline double DtMod(double a,double b) 00165 { 00166 return fmod(a,b); 00167 } 00168 00170 template <typename T> 00171 T DtGCD(T a, T b) 00172 { 00173 if(a == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero"); 00174 if(b == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero"); 00175 while( true ) 00176 { 00177 a = DtMod(a,b); 00178 if( a == 0 ) return b; 00179 b = DtMod(b,a); 00180 if( b == 0 ) return a; 00181 } 00182 } 00183 00185 template <typename T> 00186 T DtLCM(T a,T b) 00187 { 00188 if(a == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero"); 00189 if(b == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero"); 00190 return (a * b) / DtGCD(a,b); 00191 } 00192 00193 #ifdef DtUSE_UTILITIES_NAMESPACE 00194 } 00195 #endif 00196 #endif 00197