00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __MATH_EXTENSIONS_DOT_H
00021 #define __MATH_EXTENSIONS_DOT_H
00022
00023 #include <iostream>
00024 #include <limits>
00025 #include "vec3.h"
00026 #include "quat.h"
00027 #include "mat3.h"
00028
00029 #ifdef max
00030 #undef max
00031 #endif
00032 #ifdef min
00033 #undef min
00034 #endif
00035
00036 namespace gutz {
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #ifndef M_E
00061 #define M_E 2.71828182845904523536
00062 #endif
00063 #ifndef M_LOG2E
00064 #define M_LOG2E 1.44269504088896340736
00065 #endif
00066 #ifndef M_LOG10E
00067 #define M_LOG10E 0.434294481903251827651
00068 #endif
00069 #ifndef M_LN2
00070 #define M_LN2 0.693147180559945309417
00071 #endif
00072 #ifndef M_LN10
00073 #define M_LN10 2.30258509299404568402
00074 #endif
00075 #ifndef M_PI
00076 #define M_PI 3.14159265358979323846
00077 #endif
00078 #ifndef M_PI_2
00079 #define M_PI_2 1.57079632679489661923
00080 #endif
00081 #ifndef M_PI_4
00082 #define M_PI_4 0.785398163397448309616
00083 #endif
00084 #ifndef M_1_PI
00085 #define M_1_PI 0.318309886183790671538
00086 #endif
00087 #ifndef M_2_PI
00088 #define M_2_PI 0.636619772367581343076
00089 #endif
00090 #ifndef M_2_SQRTPI
00091 #define M_2_SQRTPI 1.12837916709551257390
00092 #endif
00093 #ifndef M_SQRT2
00094 #define M_SQRT2 1.41421356237309504880
00095 #endif
00096 #ifndef M_SQRT1_2
00097 #define M_SQRT1_2 0.707106781186547524401
00098 #endif
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 template<class T>
00116 inline
00117 T clamp(const T &x)
00118 { return (x > 0 ? ( x < 1 ? x : 1) : 0) ; }
00119
00120
00121 template<class L, class T, class U>
00122 inline
00123 T clamp(const L &c, const T &x, const U &C)
00124 { return (x > c ? ( x < C ? x : C) : c) ;}
00125
00126
00127
00128 template<class T>
00129 inline
00130 T g_min(const T &x, const T &y)
00131 { return (x > y ? y : x); }
00132
00133
00134 template<class T>
00135 inline
00136 T g_max(const T &x, const T &y)
00137 { return (x > y ? x : y); }
00138
00139
00140
00141 template<class T>
00142 inline
00143 T g_abs(const T &x)
00144 { return (x > 0 ? x : -x); }
00145
00146
00147
00148 template<class T>
00149 inline
00150 double g_sgn(const T &x)
00151 { return (x > 0 ? 1.0 : (x < 0 ? -1.0 : 0.0)); }
00152
00153
00154
00155 #define RAD2DEG(x) (180.0/M_PI*(x))
00156 #define DEG2RAD(x) (M_PI/180.0*(x))
00157 #define SGN(x) ((x)>0 ? 1.0 : ((x)<0 ? -1.0 : 0))
00158 #define SQ(x) ((x)*(x))
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 template<class TI,
00178 class TO>
00179 inline
00180 TO g_affine(const TI &i, const TI &x, const TI &I, const TO &o, const TO &O)
00181 {
00182 return TO((O - o)*(x - i)/float((I - i)) + o);
00183 }
00184
00185
00186
00187 #ifndef DRAND48
00188 #define DRAND48 (rand()/(double)RAND_MAX)
00189 #endif
00190
00191
00192
00193 template< class T >
00194 inline
00195 T intersect2D(const T p1x, const T p1y, const T d1x, const T d1y,
00196 const T p2x, const T p2y, const T d2x, const T d2y)
00197 {
00198
00199 const T div = d1x * -d2y + d1y * d2x;
00200 if(!div)
00201 return std::numeric_limits<T>::infinity();
00202
00203 return (p2x * -d2y + p2y * d2x - p1x * -d2y - p1y * d2x)/div;
00204
00205
00206
00207
00208
00209
00210
00211 }
00212
00213
00214
00215
00216 template< class T >
00217 inline
00218 vec3<T> project(const vec3<T> &p1, const vec3<T> &p2)
00219 {
00220 return p2/p2.dot(p2) * p2.dot(p1);
00221 }
00222
00223
00224
00225
00226 template< class T >
00227 inline
00228 T intersectRayPlane(const vec3<T> &rpos, const vec3<T> &rdir,
00229 const vec3<T> &ppos, const vec3<T> &pnorm)
00230 {
00231 const T rdDpn = rdir.dot(pnorm);
00232 if(!rdDpn) return std::numeric_limits<T>::max();
00233 return ( ppos.dot(pnorm) - rpos.dot(pnorm) )/rdDpn;
00234 }
00235
00236
00237
00238
00239
00240 template< class T >
00241 inline
00242 vec2<T> intersectRaySphere(const vec3<T> &rpos, const vec3<T> &rdir,
00243 const vec3<T> ¢, const T r)
00244 {
00245 vec3<T> x = rpos - cent;
00246 T a = rdir.dot(rdir);
00247 T b = rdir.dot(x) * 2;
00248 T c = x.dot(x) - r*r;
00249 T d = b*b - 4*a*c;
00250 if( d <= 0 ) return vec2<T>(std::numeric_limits<T>::max());
00251 return vec2<T>((-b-sqrt(d))/(2*a), (-b+sqrt(d))/(2*a));
00252 }
00253
00254
00255
00256
00257 template< class T >
00258 mat3<T> axis2axisPN(const vec3<T> &v1, const vec3<T> &v2)
00259 {
00260 vec3<T> axis = -v1.cross(v2);
00261 float theta = v1.dot(v2);
00262 if(theta > 0)
00263 {
00264 theta = T(M_PI - 2 * asin( (-v1-v2).norm()/2.0 ));
00265 }
00266 else
00267 {
00268 theta = T(2 * asin( (v1-v2).norm()/2.0 ));
00269 }
00270 return mat3<T>(theta,axis);
00271 }
00272 template< class T >
00273 mat3<T> axis2axis(const vec3<T> &v1, const vec3<T> &v2)
00274 {
00275 return axis2axisPN(v1/v1.norm(), v2/v2.norm());
00276 }
00277
00278
00279
00280
00281
00282
00283
00284
00285 template<class T>
00286 struct OwnAllocPolicy {
00287
00288 bool cpyVec(T *v, const T *c, int num) const
00289 {
00290 if(v) delVec(v);
00291 v = new T[num];
00292 if(!c) return true;
00293 for(int i=0; i<num; ++i)
00294 v[i] = c[i];
00295 return false;
00296 }
00297 void delVec(T *v) const { if(v) delete[] v; }
00298 void delVal(T *v) const { if(v) delete v; }
00299 };
00300
00301
00302 template<class T>
00303 struct WrapAllocPolicy {
00304 bool cpyVec(T *v, T *c, int num) const
00305 {
00306 v = c;
00307 if(!c) return true;
00308 return false;
00309 }
00310 void delVec(T *v) const {}
00311 void delVal(T *v) const {}
00312 };
00313
00314
00315
00316
00317 }
00318
00319
00320 #endif
00321