VR-Link API Documentation for DIS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vlMath.h
Go to the documentation of this file.
1 /*********************************************************************
2 ** Copyright (c) 1992-2010 VT MAK
3 ** All rights reserved.
4 *********************************************************************/
5 
6 
7 #ifndef vlMath_H
8 #define vlMath_H
9 
14 
15 #if !defined(_WIN32) && !defined(VXWORKS)
16 #include <sys/param.h>
17 #endif
18 
19 
20 #include <vlutil/vlMachineTypes.h>
21 #include <math.h>
22 #include <vlutil/vlExceptions.h>
23 
24 #ifdef DtUSE_UTILITIES_NAMESPACE
25 namespace DtUSE_UTILITIES_NAMESPACE
26 {
27 #endif
28 
31 #define DtEPico 1.0E-12
32 #define DtENano 1.0E-09
33 #define DtEMicro 1.0E-06
34 #define DtEMilli 1.0E-03
35 #define DtECenti 1.0E-02
36 #define DtEDeci 1.0E-01
37 #define DtEHalf 5.0E-01
38 #define DtENineTenths 9.0E-01
39 #define DtEOne 1.0
40 #define DtEDeca 1.0E01
41 #define DtEHecto 1.0E02
42 #define DtEKilo 1.0E03
43 #define DtEMega 1.0E06
44 #define DtEGiga 1.0E09
45 
47 #define DtEq(x, y, e) ((DtAbs((x) - (y)) <= (e)) ? true : false)
48 
49 #define M_2PI 6.28318530717958647693 /* 2Pi */
50 
51 #ifndef __darwin__
52 #define M_E 2.7182818284590452354 /* Euler constant "e" */
53 #define M_1_E 0.36787944117144232160 /* 1/e */
54 #define M_LN2 0.69314718055994530942 /* ln(2) */
55 #define M_LN10 2.30258509299404568402 /* ln(10) */
56 #define M_LOG2E 1.4426950408889634074 /* log2(e) = 1/ln(2) */
57 #define M_LOG10E 0.43429448190325182765 /* log10(e) = 1/ln(10) */
58 #define M_PI 3.14159265358979323846 /* Pythagorean constant "Pi" */
59 #define M_PI_2 1.57079632679489661923 /* Pi/2 */
60 #define M_PI_3 1.04719755119659774615 /* Pi/3 */
61 #define M_PI_4 0.78539816339744830962 /* Pi/4 */
62 #define M_1_PI 0.31830988618379067154 /* 1/Pi */
63 #define M_2_PI 0.63661977236758134308 /* 2/Pi */
64 #define M_3_PI 0.954929658551372014613 /* 3/Pi */
65 #define M_4_PI 1.27323954473516268615 /* 4/Pi */
66 #define M_SQRTPI 1.77245385090551602730 /* Sqrt(Pi) */
67 #define M_1_SQRTPI 0.564189583547756286948 /* 1/Sqrt(Pi) */
68 #define M_2_SQRTPI 1.12837916709551257390 /* 2/Sqrt(Pi) */
69 #define M_3_SQRTPI 1.69256875064326886084 /* 3/Sqrt(Pi) */
70 #define M_4_SQRTPI 2.25675833419102514779 /* 4/Sqrt(Pi) */
71 #define M_SQRT2PI 2.50662827463100050242 /* Sqrt(2Pi) */
72 #define M_1_SQRT2PI 0.39894228040143267794 /* 1/Sqrt(2Pi) */
73 #define M_RAD2DEG 57.2957795130823208768 /* 180/Pi radians --> degrees */
74 #define M_DEG2RAD 0.0174532925199432957692 /* Pi/180 degrees --> radians */
75 #define M_SQRT2 1.41421356237309504880 /* Sqrt(2) */
76 #define M_SQRT_2 0.707106781186547524401 /* 1/Sqrt(2) */
77 #define M_GOLDEN_R 0.6180339887498948482046 /* GoldenRatio: (Sqrt(5) - 1)/2 */
78 #endif
79 
81 inline DT_DLL_MATRIX double DtRad2Deg(double rad)
82 {
83  return ((rad / M_PI) * 180.0);
84 }
85 
87 inline DT_DLL_MATRIX double DtDeg2Rad(double deg)
88 {
89  return ((deg * M_PI) / 180.0);
90 }
91 
93 template<typename T>
94 T DtAbs(T x)
95 {
96  return (((x) >= 0) ? (x) : (-(x)));
97 }
98 
100 template<typename T>
101 int DtSgn(T x)
102 {
103  return (((x) >= 0) ? 1 : -1);
104 }
105 
107 template<typename T>
108 T DtPos(T x)
109 {
110  return (((x) >= 0) ? (x) : 0);
111 }
112 
114 template <typename T>
115 T DtNeg(const T&val)
116 {
117  if (val >= 0) return 0;
118  else return val;
119 }
120 
122 template <typename T>
123 T DtSquare(const T& val)
124 {
125  return val * val;
126 }
127 
129 template <typename T>
130 T DtLimit(T x,T lo ,T hi)
131 {
132  if(lo > hi)
133  {
135  return DtLimit(x,hi,lo);
136  }
137  if(x > hi)
138  {
139  return hi;
140  }
141  if(x < lo)
142  {
143  return lo;
144  }
145  return x;
146 }
147 
149 template <typename T>
150 inline T DtMod(T a, T b)
151 {
152  return a % b;
153 }
154 
156 template <>
157 inline float DtMod(float a, float b)
158 {
159  return (float)fmod((float)a,(float)b);
160 }
161 
163 template <>
164 inline double DtMod(double a,double b)
165 {
166  return fmod(a,b);
167 }
168 
170 template <typename T>
171 T DtGCD(T a, T b)
172 {
173  if(a == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero");
174  if(b == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero");
175  while( true )
176  {
177  a = DtMod(a,b);
178  if( a == 0 ) return b;
179  b = DtMod(b,a);
180  if( b == 0 ) return a;
181  }
182 }
183 
185 template <typename T>
186 T DtLCM(T a,T b)
187 {
188  if(a == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero");
189  if(b == 0) DtTHROW_NEW(DtInvalidInput,"Can't divide by zero");
190  return (a * b) / DtGCD(a,b);
191 }
192 
193 #ifdef DtUSE_UTILITIES_NAMESPACE
194 }
195 #endif
196 #endif
197 

Document ID: Generated on Mon Jun 22 21:18:40 EDT 2020 from SVN revision 213785
Copyright © 2005-2018 MAK Technologies. All Rights Reserved (www.mak.com)