1 #ifndef vm_m3math_h_INCLUDED
2 #define vm_m3math_h_INCLUDED
39 #include <vm_math/vm_vmath.h>
82 enum ENelts_ { ENelts = 9 };
83 enum EColStride_ { EColStride = 3 };
84 enum ERows_ { ERow0 = 0, ERow1 = 3, ERow2 = 6 };
89 typedef T_fp value_type;
108 static int at(
int i,
int j );
151 inline static void dyad_product( T_fp m[], T_fp
const v1[], T_fp
const v2[] );
167 T_fp
const row[],
int whichrow );
179 T_fp
const col[],
int whichcol );
189 T_fp row[],
int whichrow );
199 T_fp col[],
int whichcol );
217 inline static void mvmult( T_fp res[], T_fp
const m[], T_fp
const v[] );
228 inline static void mtvmult( T_fp res[], T_fp
const m[], T_fp
const v[] );
237 inline static void mmult( T_fp mres[], T_fp
const m1[], T_fp
const m2[] );
253 inline static std::ostream&
254 print_on( std::ostream& os, T_fp
const m[],
255 char const prefix[] =
"",
char const postfix[] =
"" );
267 char const prefix[] =
"",
char const postfix[] =
"" );
288 template <
class T_fp>
291 {
return i * EColStride + j; }
296 template <
class T_fp>
302 { memcpy( &m[ERow0], row0, 3 *
sizeof(T_fp) );
303 memcpy( &m[ERow1], row1, 3 *
sizeof(T_fp) );
304 memcpy( &m[ERow2], row2, 3 *
sizeof(T_fp) ); }
306 template <
class T_fp>
312 { m[0] = col0[0]; m[3] = col0[1]; m[6] = col0[2];
313 m[1] = col1[0]; m[4] = col1[1]; m[7] = col1[2];
314 m[2] = col2[0]; m[5] = col2[1]; m[8] = col2[2]; }
319 template <
class T_fp>
322 T_fp
const row[],
int whichrow )
323 { memcpy( &m[whichrow*EColStride], row, 3 *
sizeof(T_fp) ); }
325 template <
class T_fp>
328 T_fp
const col[],
int whichcol )
330 double* pm = &m[whichcol];
331 *pm = *col++; pm += EColStride;
332 *pm = *col++; pm += EColStride;
339 template <
class T_fp>
342 T_fp row[],
int whichrow )
343 { memcpy( row, &m[whichrow*EColStride], 3 *
sizeof(T_fp) ); }
345 template <
class T_fp>
348 T_fp col[],
int whichcol )
350 double const* pm = &m[whichcol];
351 *col = *pm; pm += EColStride; ++col;
352 *col = *pm; pm += EColStride; ++col;
359 template <
class T_fp>
363 m[0] = v1[0] * v2[0]; m[1] = v1[0] * v2[1]; m[2] = v1[0] * v2[2];
364 m[3] = v1[1] * v2[0]; m[4] = v1[1] * v2[1]; m[5] = v1[1] * v2[2];
365 m[6] = v1[2] * v2[0]; m[7] = v1[2] * v2[1]; m[8] = v1[2] * v2[2];
371 template <
class T_fp>
373 mvmult( T_fp res[], T_fp
const m[], T_fp
const v[] )
375 res[0] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2];
376 res[1] = m[3] * v[0] + m[4] * v[1] + m[5] * v[2];
377 res[2] = m[6] * v[0] + m[7] * v[1] + m[8] * v[2];
380 template <
class T_fp>
382 mtvmult( T_fp res[], T_fp
const m[], T_fp
const v[] )
384 res[0] = m[0] * v[0] + m[3] * v[1] + m[6] * v[2];
385 res[1] = m[1] * v[0] + m[4] * v[1] + m[7] * v[2];
386 res[2] = m[2] * v[0] + m[5] * v[1] + m[8] * v[2];
389 template <
class T_fp>
391 mmult( T_fp mres[], T_fp
const m1[], T_fp
const m2[] )
393 mres[0] = m1[0] * m2[0] + m1[1] * m2[3] + m1[2] * m2[6];
394 mres[1] = m1[0] * m2[1] + m1[1] * m2[4] + m1[2] * m2[7];
395 mres[2] = m1[0] * m2[2] + m1[1] * m2[5] + m1[2] * m2[8];
397 mres[3] = m1[3] * m2[0] + m1[4] * m2[3] + m1[5] * m2[6];
398 mres[4] = m1[3] * m2[1] + m1[4] * m2[4] + m1[5] * m2[7];
399 mres[5] = m1[3] * m2[2] + m1[4] * m2[5] + m1[5] * m2[8];
401 mres[6] = m1[6] * m2[0] + m1[7] * m2[3] + m1[8] * m2[6];
402 mres[7] = m1[6] * m2[1] + m1[7] * m2[4] + m1[8] * m2[7];
403 mres[8] = m1[6] * m2[2] + m1[7] * m2[5] + m1[8] * m2[8];
406 template <
class T_fp>
409 char const prefix[],
char const postfix[] )
411 if ( std::strlen(prefix) ) { os << prefix; }
412 os << m[0] <<
" " << m[1] <<
" " << m[2] <<
"\n"
413 << m[3] <<
" " << m[4] <<
" " << m[5] <<
"\n"
414 << m[6] <<
" " << m[7] <<
" " << m[8] <<
"\n";
415 if ( std::strlen(postfix) ) { os << postfix; }
419 template <
class T_fp>
422 char const prefix[],
char const postfix[] )
424 if ( std::strlen(prefix) ) { std::fprintf(of,
"%s", prefix); }
425 std::fprintf(of,
"%.18e %.18e %.18e\n", m[0], m[1], m[2]);
426 std::fprintf(of,
"%.18e %.18e %.18e\n", m[3], m[4], m[5]);
427 std::fprintf(of,
"%.18e %.18e %.18e\n", m[6], m[7], m[8]);
428 if ( std::strlen(postfix) ) { std::fprintf(of,
"%s", postfix); }