20 inline double norm(
double const * a)
22 return std::sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);
27 inline double dot(
double const * a,
double const * b)
29 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
34 inline void cross(
double const * a,
double const * b,
double *
const axb)
36 axb[0] = a[1] * b[2] - a[2] * b[1];
37 axb[1] = a[2] * b[0] - a[0] * b[2];
38 axb[2] = a[0] * b[1] - a[1] * b[0];
43 inline double det(
double const * mat)
45 return mat[0] * mat[4] * mat[8] - mat[0] * mat[5] * mat[7]
46 - mat[1] * mat[3] * mat[8] + mat[1] * mat[5] * mat[6]
47 + mat[2] * mat[3] * mat[7] - mat[2] * mat[4] * mat[6];
52 inline double det2(
double a11,
double a12,
double a21,
double a22)
54 return (a11 * a22) - (a12 * a21);
59 inline void transpose(
double const * mat,
double *
const trans)
61 for (
int i = 0; i < 3; i++)
63 for (
int j = 0; j < 3; j++) { trans[3 * i + j] = mat[3 * j + i]; }
69 inline int inverse(
double const * mat,
double *
const inv)
71 inv[0] =
det2(mat[4], mat[5], mat[7], mat[8]);
72 inv[1] =
det2(mat[2], mat[1], mat[8], mat[7]);
73 inv[2] =
det2(mat[1], mat[2], mat[4], mat[5]);
74 inv[3] =
det2(mat[5], mat[3], mat[8], mat[6]);
75 inv[4] =
det2(mat[0], mat[3], mat[6], mat[8]);
76 inv[5] =
det2(mat[2], mat[0], mat[5], mat[3]);
77 inv[6] =
det2(mat[3], mat[4], mat[6], mat[7]);
78 inv[7] =
det2(mat[1], mat[0], mat[7], mat[6]);
79 inv[8] =
det2(mat[0], mat[1], mat[3], mat[4]);
82 if (std::abs(dd) <
SMALL)
84 MY_WARNING(
"Cannot invert cell matrix. Determinant is 0.");
87 for (
int i = 0; i < 9; i++) { inv[i] /= dd; }
98 for (
int i = 0; i < 3; i++)
101 =
static_cast<int>(((x[i] - min[i]) / (max[i] - min[i])) * size[i]);
102 index[i] = std::min(index[i],
107 template<
typename T >
122 int pos = barWidth * progress;
123 for (
int i = 0; i < barWidth; ++i)
125 if (i < pos) std::cout <<
"=";
126 else if (i == pos) std::cout <<
">";
127 else std::cout <<
" ";
129 std::cout <<
"] " << int(progress * 100.0) <<
"\n";
133 std::cout << std::endl;
void transpose(double const *mat, double *const trans)
double dot(double const *a, double const *b)
double det(double const *mat)
#define MY_WARNING(message)
void progressBar(const double &progress)
double det2(double a11, double a12, double a21, double a22)
void cross(double const *a, double const *b, double *const axb)
int inverse(double const *mat, double *const inv)
double norm(double const *a)
void operator()(T const *p)
void coords_to_index(double const *x, int const *size, double const *max, double const *min, int *const index)