Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/geomfuncs.hpp
3206 views
#ifndef FILE_GEOMFUNCS1#define FILE_GEOMFUNCS23/* *************************************************************************/4/* File: geomfuncs.hpp */5/* Author: Joachim Schoeberl */6/* Date: 20. Jul. 02 */7/* *************************************************************************/8910template <int D>11inline double Abs (const Vec<D> & v)12{13double sum = 0;14for (int i = 0; i < D; i++)15sum += v(i) * v(i);16return sqrt (sum);17}181920template <int D>21inline double Abs2 (const Vec<D> & v)22{23double sum = 0;24for (int i = 0; i < D; i++)25sum += v(i) * v(i);26return sum;27}28293031template <int D>32inline double Dist (const Point<D> & a, const Point<D> & b)33{34return Abs (a-b);35}3637template <int D>38inline double Dist2 (const Point<D> & a, const Point<D> & b)39{40return Abs2 (a-b);41}424344template <int D>45inline Point<D> Center (const Point<D> & a, const Point<D> & b)46{47Point<D> res;48for (int i = 0; i < D; i++)49res(i) = 0.5 * (a(i) + b(i));50return res;51}5253template <int D>54inline Point<D> Center (const Point<D> & a, const Point<D> & b, const Point<D> & c)55{56Point<D> res;57for (int i = 0; i < D; i++)58res(i) = (1.0/3.0) * (a(i) + b(i) + c(i));59return res;60}6162template <int D>63inline Point<D> Center (const Point<D> & a, const Point<D> & b, const Point<D> & c, const Point<D> & d)64{65Point<D> res;66for (int i = 0; i < D; i++)67res(i) = (1.0/4.0) * (a(i) + b(i) + c(i) + d(i));68return res;69}70717273inline Vec<3> Cross (const Vec<3> & v1, const Vec<3> & v2)74{75return Vec<3>76( v1(1) * v2(2) - v1(2) * v2(1),77v1(2) * v2(0) - v1(0) * v2(2),78v1(0) * v2(1) - v1(1) * v2(0) );79}808182inline double Determinant (const Vec<3> & col1,83const Vec<3> & col2,84const Vec<3> & col3)85{86return87col1(0) * ( col2(1) * col3(2) - col2(2) * col3(1)) +88col1(1) * ( col2(2) * col3(0) - col2(0) * col3(2)) +89col1(2) * ( col2(0) * col3(1) - col2(1) * col3(0));90}91929394template <>95inline Vec<2> Vec<2> :: GetNormal () const96{97return Vec<2> (-x[1], x[0]);98}99100template <>101inline Vec<3> Vec<3> :: GetNormal () const102{103if (fabs (x[0]) > fabs (x[2]))104return Vec<3> (-x[1], x[0], 0);105else106return Vec<3> (0, x[2], -x[1]);107}108109110111// template <int H, int W>112inline void CalcInverse (const Mat<2,2> & m, Mat<2,2> & inv)113{114double det = m(0,0) * m(1,1) - m(0,1) * m(1,0);115if (det == 0)116{117inv = 0;118return;119}120121double idet = 1.0 / det;122inv(0,0) = idet * m(1,1);123inv(0,1) = -idet * m(0,1);124inv(1,0) = -idet * m(1,0);125inv(1,1) = idet * m(0,0);126}127128void CalcInverse (const Mat<3,3> & m, Mat<3,3> & inv);129130inline void CalcInverse (const Mat<2,3> & m, Mat<3,2> & inv)131{132Mat<2,2> a = m * Trans (m);133Mat<2,2> ainv;134CalcInverse (a, ainv);135inv = Trans (m) * ainv;136}137138void CalcInverse (const Mat<3,2> & m, Mat<2,3> & inv);139140inline void CalcInverse (const Mat<3,2> & m, Mat<2,3> & inv)141{142Mat<2,2> a = Trans (m) * m;143Mat<2,2> ainv;144CalcInverse (a, ainv);145inv = ainv * Trans (m);146}147148149double Det (const Mat<2,2> & m);150double Det (const Mat<3,3> & m);151152// eigenvalues of a symmetric matrix153void EigenValues (const Mat<3,3> & m, Vec<3> & ev);154void EigenValues (const Mat<2,2> & m, Vec<3> & ev);155156#endif157158159