Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/geomops.hpp
3206 views
#ifndef FILE_GEOMOPS1#define FILE_GEOMOPS23/* *************************************************************************/4/* File: geomops.hpp */5/* Author: Joachim Schoeberl */6/* Date: 20. Jul. 02 */7/* *************************************************************************/8910/*1112Point - Vector operations1314*/151617template <int D>18inline Vec<D> operator+ (const Vec<D> & a, const Vec<D> & b)19{20Vec<D> res;21for (int i = 0; i < D; i++)22res(i) = a(i) + b(i);23return res;24}25262728template <int D>29inline Point<D> operator+ (const Point<D> & a, const Vec<D> & b)30{31Point<D> res;32for (int i = 0; i < D; i++)33res(i) = a(i) + b(i);34return res;35}36373839template <int D>40inline Vec<D> operator- (const Point<D> & a, const Point<D> & b)41{42Vec<D> res;43for (int i = 0; i < D; i++)44res(i) = a(i) - b(i);45return res;46}4748template <int D>49inline Point<D> operator- (const Point<D> & a, const Vec<D> & b)50{51Point<D> res;52for (int i = 0; i < D; i++)53res(i) = a(i) - b(i);54return res;55}5657template <int D>58inline Vec<D> operator- (const Vec<D> & a, const Vec<D> & b)59{60Vec<D> res;61for (int i = 0; i < D; i++)62res(i) = a(i) - b(i);63return res;64}65666768template <int D>69inline Vec<D> operator* (double s, const Vec<D> & b)70{71Vec<D> res;72for (int i = 0; i < D; i++)73res(i) = s * b(i);74return res;75}767778template <int D>79inline double operator* (const Vec<D> & a, const Vec<D> & b)80{81double sum = 0;82for (int i = 0; i < D; i++)83sum += a(i) * b(i);84return sum;85}86878889template <int D>90inline Vec<D> operator- (const Vec<D> & b)91{92Vec<D> res;93for (int i = 0; i < D; i++)94res(i) = -b(i);95return res;96}979899template <int D>100inline Point<D> & operator+= (Point<D> & a, const Vec<D> & b)101{102for (int i = 0; i < D; i++)103a(i) += b(i);104return a;105}106107template <int D>108inline Vec<D> & operator+= (Vec<D> & a, const Vec<D> & b)109{110for (int i = 0; i < D; i++)111a(i) += b(i);112return a;113}114115116template <int D>117inline Point<D> & operator-= (Point<D> & a, const Vec<D> & b)118{119for (int i = 0; i < D; i++)120a(i) -= b(i);121return a;122}123124template <int D>125inline Vec<D> & operator-= (Vec<D> & a, const Vec<D> & b)126{127for (int i = 0; i < D; i++)128a(i) -= b(i);129return a;130}131132133134template <int D>135inline Vec<D> & operator*= (Vec<D> & a, double s)136{137for (int i = 0; i < D; i++)138a(i) *= s;139return a;140}141142143template <int D>144inline Vec<D> & operator/= (Vec<D> & a, double s)145{146for (int i = 0; i < D; i++)147a(i) /= s;148return a;149}150151152153154// Matrix - Vector operations155156/*157template <int H, int W>158inline Vec<H> operator* (const Mat<H,W> & m, const Vec<W> & v)159{160Vec<H> res;161for (int i = 0; i < H; i++)162{163res(i) = 0;164for (int j = 0; j < W; j++)165res(i) += m(i,j) * v(j);166}167return res;168}169*/170171// thanks to VC60 partial template specialization features !!!172173inline Vec<2> operator* (const Mat<2,2> & m, const Vec<2> & v)174{175Vec<2> res;176for (int i = 0; i < 2; i++)177{178res(i) = 0;179for (int j = 0; j < 2; j++)180res(i) += m(i,j) * v(j);181}182return res;183}184185inline Vec<2> operator* (const Mat<2,3> & m, const Vec<3> & v)186{187Vec<2> res;188for (int i = 0; i < 2; i++)189{190res(i) = 0;191for (int j = 0; j < 3; j++)192res(i) += m(i,j) * v(j);193}194return res;195}196197198inline Vec<3> operator* (const Mat<3,2> & m, const Vec<2> & v)199{200Vec<3> res;201for (int i = 0; i < 3; i++)202{203res(i) = 0;204for (int j = 0; j < 2; j++)205res(i) += m(i,j) * v(j);206}207return res;208}209210211inline Vec<3> operator* (const Mat<3,3> & m, const Vec<3> & v)212{213Vec<3> res;214for (int i = 0; i < 3; i++)215{216res(i) = 0;217for (int j = 0; j < 3; j++)218res(i) += m(i,j) * v(j);219}220return res;221}222223224225226227228229/*230template <int H1, int W1, int H2, int W2>231inline Mat<H1,W2> operator* (const Mat<H1,W1> & a, const Mat<H2,W2> & b)232{233Mat<H1,W2> m;234for (int i = 0; i < H1; i++)235for (int j = 0; j < W2; j++)236{237double sum = 0;238for (int k = 0; k < W1; k++)239sum += a(i,k) * b(k, j);240m(i,j) = sum;241}242return m;243}244*/245246inline Mat<2,2> operator* (const Mat<2,2> & a, const Mat<2,2> & b)247{248Mat<2,2> m;249for (int i = 0; i < 2; i++)250for (int j = 0; j < 2; j++)251{252double sum = 0;253for (int k = 0; k < 2; k++)254sum += a(i,k) * b(k, j);255m(i,j) = sum;256}257return m;258}259260inline Mat<2,2> operator* (const Mat<2,3> & a, const Mat<3,2> & b)261{262Mat<2,2> m;263for (int i = 0; i < 2; i++)264for (int j = 0; j < 2; j++)265{266double sum = 0;267for (int k = 0; k < 3; k++)268sum += a(i,k) * b(k, j);269m(i,j) = sum;270}271return m;272}273274275inline Mat<3,2> operator* (const Mat<3,2> & a, const Mat<2,2> & b)276{277Mat<3,2> m;278for (int i = 0; i < 3; i++)279for (int j = 0; j < 2; j++)280{281double sum = 0;282for (int k = 0; k < 2; k++)283sum += a(i,k) * b(k, j);284m(i,j) = sum;285}286return m;287}288289290291inline Mat<2,3> operator* (const Mat<2,2> & a, const Mat<2,3> & b)292{293Mat<2,3> m;294for (int i = 0; i < 2; i++)295for (int j = 0; j < 3; j++)296{297double sum = 0;298for (int k = 0; k < 2; k++)299sum += a(i,k) * b(k, j);300m(i,j) = sum;301}302return m;303}304305306inline Mat<3,3> operator* (const Mat<3,3> & a, const Mat<3,3> & b)307{308Mat<3,3> m;309for (int i = 0; i < 3; i++)310for (int j = 0; j < 3; j++)311{312double sum = 0;313for (int k = 0; k < 3; k++)314sum += a(i,k) * b(k, j);315m(i,j) = sum;316}317return m;318}319320321322323324325326327template <int H, int W>328inline Mat<W,H> Trans (const Mat<H,W> & m)329{330Mat<W,H> res;331for (int i = 0; i < H; i++)332for (int j = 0; j < W; j++)333res(j,i) = m(i,j);334return res;335}336337338339340341342343344345346347template <int D>348inline ostream & operator<< (ostream & ost, const Vec<D> & a)349{350ost << "(";351for (int i = 0; i < D-1; i++)352ost << a(i) << ", ";353ost << a(D-1) << ")";354return ost;355}356357template <int D>358inline ostream & operator<< (ostream & ost, const Point<D> & a)359{360ost << "(";361for (int i = 0; i < D-1; i++)362ost << a(i) << ", ";363ost << a(D-1) << ")";364return ost;365}366367template <int D>368inline ostream & operator<< (ostream & ost, const Box<D> & b)369{370ost << b.PMin() << " - " << b.PMax();371return ost;372}373374template <int H, int W>375inline ostream & operator<< (ostream & ost, const Mat<H,W> & m)376{377ost << "(";378for (int i = 0; i < H; i++)379{380for (int j = 0; j < W; j++)381ost << m(i,j) << " ";382ost << endl;383}384return ost;385}386387388389390#endif391392393