67 #ifndef __ConstantValues_h 88 const T& a5,
const T& a6,
const T& a7,
const T& a8,
89 const T& a9,
const T& a10,
const T& a11,
const T& a12,
90 const T& a13,
const T& a14,
const T& a15,
const T& a16):
92 m_small_matrix_up_to_date(false)
100 m_p_4x4_data[5] = a6;
101 m_p_4x4_data[6] = a7;
102 m_p_4x4_data[7] = a8;
103 m_p_4x4_data[8] = a9;
104 m_p_4x4_data[9] = a10;
105 m_p_4x4_data[10] = a11;
106 m_p_4x4_data[11] = a12;
107 m_p_4x4_data[12] = a13;
108 m_p_4x4_data[13] = a14;
109 m_p_4x4_data[14] = a15;
110 m_p_4x4_data[15] = a16;
117 m_small_matrix_up_to_date(false)
120 memcpy(m_p_4x4_data, aMatrix.
m_p_4x4_data,
sizeof(m_p_4x4_data));
127 m_small_matrix_up_to_date(false)
130 memcpy(m_p_4x4_data, apMatrix,
sizeof(m_p_4x4_data));
137 m_small_matrix_up_to_date(false)
140 if (apMatrix.size() != 16)
142 throw Exception(__FILE__, __FUNCTION__, __LINE__,
"The input matrix is not 4x4.");
145 for (
unsigned int i = 0; i < 16; ++i)
146 m_p_4x4_data[i] = apMatrix[i];
154 m_p_4x4_data[0] = 1.0;
155 m_p_4x4_data[1] = 0.0;
156 m_p_4x4_data[2] = 0.0;
157 m_p_4x4_data[3] = 0.0;
159 m_p_4x4_data[4] = 0.0;
160 m_p_4x4_data[5] = 1.0;
161 m_p_4x4_data[6] = 0.0;
162 m_p_4x4_data[7] = 0.0;
164 m_p_4x4_data[8] = 0.0;
165 m_p_4x4_data[9] = 0.0;
166 m_p_4x4_data[10] = 1.0;
167 m_p_4x4_data[11] = 0.0;
169 m_p_4x4_data[12] = 0.0;
170 m_p_4x4_data[13] = 0.0;
171 m_p_4x4_data[14] = 0.0;
172 m_p_4x4_data[15] = 1.0;
174 m_small_matrix_up_to_date =
false;
182 if (apMatrix.size() != 16)
184 throw Exception(__FILE__, __FUNCTION__, __LINE__,
"The input matrix is not 4x4.");
187 m_small_matrix_up_to_date =
false;
189 for (
unsigned int i = 0; i < 16; ++i)
190 m_p_4x4_data[i] = apMatrix[i];
198 *
this *= buildRotationMatrix(anAngle, aVector);
200 m_small_matrix_up_to_date =
false;
210 *
this *= buildYawPitchRollRotationMatrix(yaw, pitch, roll);
212 m_small_matrix_up_to_date =
false;
220 *
this *= buildTranslationMatrix(aVector);
222 m_small_matrix_up_to_date =
false;
230 *
this *= buildTranslationMatrix(x, y, z);
232 m_small_matrix_up_to_date =
false;
244 0.0, 0.0, 0.0, 1.0));
252 return (buildTranslationMatrix(aVector.
getX(), aVector.
getY(), aVector.
getZ()));
271 return ( buildScaleMatrix( aVector.
getX( ), aVector.
getY( ), aVector.
getZ( ) ) );
283 std::stringstream error_message;
284 error_message <<
"Invalid scaling factors, all of them are null: " << temp;
285 throw Exception(__FILE__, __FUNCTION__, __LINE__, error_message.str());
292 0.0, 0.0, 0.0, 1.0 ) );
302 return (buildRotationMatrix(anAngle, aVector.
getX(), aVector.
getY(), aVector.
getZ()));
314 if (temp_rotation_axis.
length() < 1e-9)
316 std::stringstream error_message;
317 error_message <<
"Invalid rotation axis, (" << temp_rotation_axis <<
")'s length is zero.";
318 throw Exception(__FILE__, __FUNCTION__, __LINE__, error_message.str());
322 double angle(
Pi * anAngle / 180.0);
323 double c(cos(angle));
324 double s(sin(angle));
325 double one_minus_cos(1.0 - c);
326 double xy(rotation_axis.getX() * rotation_axis.getY());
327 double xz(rotation_axis.getX() * rotation_axis.getZ());
328 double yz(rotation_axis.getY() * rotation_axis.getZ());
331 rotation_axis.getX() * rotation_axis.getX() * (1.0 - c) + c,
332 xy * one_minus_cos + rotation_axis.getZ() * s,
333 xz * one_minus_cos - rotation_axis.getY() * s,
336 xy * one_minus_cos - rotation_axis.getZ() * s,
337 rotation_axis.getY() * rotation_axis.getY() * one_minus_cos + c,
338 yz * one_minus_cos + rotation_axis.getX() * s,
341 xz * one_minus_cos + rotation_axis.getY() * s,
342 yz * one_minus_cos - rotation_axis.getX() * s,
343 rotation_axis.getZ() * rotation_axis.getZ() * one_minus_cos + c,
351 return (rotation_matrix);
359 T alpha =
Pi * yaw / 180.0;
360 T cos_alpha = cos(alpha);
361 T sin_alpha = sin(alpha);
363 T beta =
Pi * pitch / 180.0;
364 T cos_beta = cos(beta);
365 T sin_beta = sin(beta);
367 T gamma =
Pi * roll / 180.0;
368 T cos_gamma = cos(gamma);
369 T sin_gamma = sin(gamma);
373 cos_alpha * cos_beta,
374 sin_alpha * cos_beta,
378 cos_alpha * sin_beta * sin_gamma - sin_alpha * cos_gamma,
379 sin_alpha * sin_beta * sin_gamma + cos_alpha * cos_gamma,
380 cos_beta * sin_gamma,
383 cos_alpha * sin_beta * cos_gamma + sin_alpha * sin_gamma,
384 sin_alpha * sin_beta * cos_gamma - cos_alpha * sin_gamma,
385 cos_beta * cos_gamma,
393 return (rotation_matrix);
406 std::stringstream error_message;
407 error_message <<
"Invalid scaling factors, all of them are null: " << temp;
408 throw Exception(__FILE__, __FUNCTION__, __LINE__, error_message.str());
417 *
this *= scaling_matrix;
419 m_small_matrix_up_to_date =
false;
428 m_p_4x4_data[0], m_p_4x4_data[4], m_p_4x4_data[8], m_p_4x4_data[12],
429 m_p_4x4_data[1], m_p_4x4_data[5], m_p_4x4_data[9], m_p_4x4_data[13],
430 m_p_4x4_data[2], m_p_4x4_data[6], m_p_4x4_data[10], m_p_4x4_data[14],
431 m_p_4x4_data[3], m_p_4x4_data[7], m_p_4x4_data[11], m_p_4x4_data[15]);
440 m_p_4x4_data[3] * m_p_4x4_data[6] * m_p_4x4_data[9] * m_p_4x4_data[12] - m_p_4x4_data[2] * m_p_4x4_data[7] * m_p_4x4_data[9] * m_p_4x4_data[12] - m_p_4x4_data[3] * m_p_4x4_data[5] * m_p_4x4_data[10] * m_p_4x4_data[12]+m_p_4x4_data[1] * m_p_4x4_data[7] * m_p_4x4_data[10] * m_p_4x4_data[12]+
441 m_p_4x4_data[2] * m_p_4x4_data[5] * m_p_4x4_data[11] * m_p_4x4_data[12] - m_p_4x4_data[1] * m_p_4x4_data[6] * m_p_4x4_data[11] * m_p_4x4_data[12] - m_p_4x4_data[3] * m_p_4x4_data[6] * m_p_4x4_data[8] * m_p_4x4_data[13]+m_p_4x4_data[2] * m_p_4x4_data[7] * m_p_4x4_data[8] * m_p_4x4_data[13]+
442 m_p_4x4_data[3] * m_p_4x4_data[4] * m_p_4x4_data[10] * m_p_4x4_data[13] - m_p_4x4_data[0] * m_p_4x4_data[7] * m_p_4x4_data[10] * m_p_4x4_data[13] - m_p_4x4_data[2] * m_p_4x4_data[4] * m_p_4x4_data[11] * m_p_4x4_data[13]+m_p_4x4_data[0] * m_p_4x4_data[6] * m_p_4x4_data[11] * m_p_4x4_data[13]+
443 m_p_4x4_data[3] * m_p_4x4_data[5] * m_p_4x4_data[8] * m_p_4x4_data[14] - m_p_4x4_data[1] * m_p_4x4_data[7] * m_p_4x4_data[8] * m_p_4x4_data[14] - m_p_4x4_data[3] * m_p_4x4_data[4] * m_p_4x4_data[9] * m_p_4x4_data[14]+m_p_4x4_data[0] * m_p_4x4_data[7] * m_p_4x4_data[9] * m_p_4x4_data[14]+
444 m_p_4x4_data[1] * m_p_4x4_data[4] * m_p_4x4_data[11] * m_p_4x4_data[14] - m_p_4x4_data[0] * m_p_4x4_data[5] * m_p_4x4_data[11] * m_p_4x4_data[14] - m_p_4x4_data[2] * m_p_4x4_data[5] * m_p_4x4_data[8] * m_p_4x4_data[15]+m_p_4x4_data[1] * m_p_4x4_data[6] * m_p_4x4_data[8] * m_p_4x4_data[15]+
445 m_p_4x4_data[2] * m_p_4x4_data[4] * m_p_4x4_data[9] * m_p_4x4_data[15] - m_p_4x4_data[0] * m_p_4x4_data[6] * m_p_4x4_data[9] * m_p_4x4_data[15] - m_p_4x4_data[1] * m_p_4x4_data[4] * m_p_4x4_data[10] * m_p_4x4_data[15]+m_p_4x4_data[0] * m_p_4x4_data[5] * m_p_4x4_data[10] * m_p_4x4_data[15];
453 T m0(0), m1(0),
m2(0),
m3(0), m4(0), m5(0), m6(0), m7(0), m8(0), m9(0), m10(0), m11(0), m12(0), m13(0), m14(0), m15(0);
454 T matrix_determinant(determinant());
456 if (fabs(matrix_determinant) > 0.000001)
458 m0 = (m_p_4x4_data[6]*m_p_4x4_data[11]*m_p_4x4_data[13] - m_p_4x4_data[7]*m_p_4x4_data[10]*m_p_4x4_data[13] + m_p_4x4_data[7]*m_p_4x4_data[9]*m_p_4x4_data[14] - m_p_4x4_data[5]*m_p_4x4_data[11]*m_p_4x4_data[14] - m_p_4x4_data[6]*m_p_4x4_data[9]*m_p_4x4_data[15] + m_p_4x4_data[5]*m_p_4x4_data[10]*m_p_4x4_data[15]) / matrix_determinant;
459 m1 = (m_p_4x4_data[3]*m_p_4x4_data[10]*m_p_4x4_data[13] - m_p_4x4_data[2]*m_p_4x4_data[11]*m_p_4x4_data[13] - m_p_4x4_data[3]*m_p_4x4_data[9]*m_p_4x4_data[14] + m_p_4x4_data[1]*m_p_4x4_data[11]*m_p_4x4_data[14] + m_p_4x4_data[2]*m_p_4x4_data[9]*m_p_4x4_data[15] - m_p_4x4_data[1]*m_p_4x4_data[10]*m_p_4x4_data[15]) / matrix_determinant;
460 m2 = (m_p_4x4_data[2]*m_p_4x4_data[7]*m_p_4x4_data[13] - m_p_4x4_data[3]*m_p_4x4_data[6]*m_p_4x4_data[13] + m_p_4x4_data[3]*m_p_4x4_data[5]*m_p_4x4_data[14] - m_p_4x4_data[1]*m_p_4x4_data[7]*m_p_4x4_data[14] - m_p_4x4_data[2]*m_p_4x4_data[5]*m_p_4x4_data[15] + m_p_4x4_data[1]*m_p_4x4_data[6]*m_p_4x4_data[15]) / matrix_determinant;
461 m3 = (m_p_4x4_data[3]*m_p_4x4_data[6]*m_p_4x4_data[9] - m_p_4x4_data[2]*m_p_4x4_data[7]*m_p_4x4_data[9] - m_p_4x4_data[3]*m_p_4x4_data[5]*m_p_4x4_data[10] + m_p_4x4_data[1]*m_p_4x4_data[7]*m_p_4x4_data[10] + m_p_4x4_data[2]*m_p_4x4_data[5]*m_p_4x4_data[11] - m_p_4x4_data[1]*m_p_4x4_data[6]*m_p_4x4_data[11]) / matrix_determinant;
462 m4 = (m_p_4x4_data[7]*m_p_4x4_data[10]*m_p_4x4_data[12] - m_p_4x4_data[6]*m_p_4x4_data[11]*m_p_4x4_data[12] - m_p_4x4_data[7]*m_p_4x4_data[8]*m_p_4x4_data[14] + m_p_4x4_data[4]*m_p_4x4_data[11]*m_p_4x4_data[14] + m_p_4x4_data[6]*m_p_4x4_data[8]*m_p_4x4_data[15] - m_p_4x4_data[4]*m_p_4x4_data[10]*m_p_4x4_data[15]) / matrix_determinant;
463 m5 = (m_p_4x4_data[2]*m_p_4x4_data[11]*m_p_4x4_data[12] - m_p_4x4_data[3]*m_p_4x4_data[10]*m_p_4x4_data[12] + m_p_4x4_data[3]*m_p_4x4_data[8]*m_p_4x4_data[14] - m_p_4x4_data[0]*m_p_4x4_data[11]*m_p_4x4_data[14] - m_p_4x4_data[2]*m_p_4x4_data[8]*m_p_4x4_data[15] + m_p_4x4_data[0]*m_p_4x4_data[10]*m_p_4x4_data[15]) / matrix_determinant;
464 m6 = (m_p_4x4_data[3]*m_p_4x4_data[6]*m_p_4x4_data[12] - m_p_4x4_data[2]*m_p_4x4_data[7]*m_p_4x4_data[12] - m_p_4x4_data[3]*m_p_4x4_data[4]*m_p_4x4_data[14] + m_p_4x4_data[0]*m_p_4x4_data[7]*m_p_4x4_data[14] + m_p_4x4_data[2]*m_p_4x4_data[4]*m_p_4x4_data[15] - m_p_4x4_data[0]*m_p_4x4_data[6]*m_p_4x4_data[15]) / matrix_determinant;
465 m7 = (m_p_4x4_data[2]*m_p_4x4_data[7]*m_p_4x4_data[8] - m_p_4x4_data[3]*m_p_4x4_data[6]*m_p_4x4_data[8] + m_p_4x4_data[3]*m_p_4x4_data[4]*m_p_4x4_data[10] - m_p_4x4_data[0]*m_p_4x4_data[7]*m_p_4x4_data[10] - m_p_4x4_data[2]*m_p_4x4_data[4]*m_p_4x4_data[11] + m_p_4x4_data[0]*m_p_4x4_data[6]*m_p_4x4_data[11]) / matrix_determinant;
466 m8 = (m_p_4x4_data[5]*m_p_4x4_data[11]*m_p_4x4_data[12] - m_p_4x4_data[7]*m_p_4x4_data[9]*m_p_4x4_data[12] + m_p_4x4_data[7]*m_p_4x4_data[8]*m_p_4x4_data[13] - m_p_4x4_data[4]*m_p_4x4_data[11]*m_p_4x4_data[13] - m_p_4x4_data[5]*m_p_4x4_data[8]*m_p_4x4_data[15] + m_p_4x4_data[4]*m_p_4x4_data[9]*m_p_4x4_data[15]) / matrix_determinant;
467 m9 = (m_p_4x4_data[3]*m_p_4x4_data[9]*m_p_4x4_data[12] - m_p_4x4_data[1]*m_p_4x4_data[11]*m_p_4x4_data[12] - m_p_4x4_data[3]*m_p_4x4_data[8]*m_p_4x4_data[13] + m_p_4x4_data[0]*m_p_4x4_data[11]*m_p_4x4_data[13] + m_p_4x4_data[1]*m_p_4x4_data[8]*m_p_4x4_data[15] - m_p_4x4_data[0]*m_p_4x4_data[9]*m_p_4x4_data[15]) / matrix_determinant;
468 m10 = (m_p_4x4_data[1]*m_p_4x4_data[7]*m_p_4x4_data[12] - m_p_4x4_data[3]*m_p_4x4_data[5]*m_p_4x4_data[12] + m_p_4x4_data[3]*m_p_4x4_data[4]*m_p_4x4_data[13] - m_p_4x4_data[0]*m_p_4x4_data[7]*m_p_4x4_data[13] - m_p_4x4_data[1]*m_p_4x4_data[4]*m_p_4x4_data[15] + m_p_4x4_data[0]*m_p_4x4_data[5]*m_p_4x4_data[15]) / matrix_determinant;
469 m11 = (m_p_4x4_data[3]*m_p_4x4_data[5]*m_p_4x4_data[8] - m_p_4x4_data[1]*m_p_4x4_data[7]*m_p_4x4_data[8] - m_p_4x4_data[3]*m_p_4x4_data[4]*m_p_4x4_data[9] + m_p_4x4_data[0]*m_p_4x4_data[7]*m_p_4x4_data[9] + m_p_4x4_data[1]*m_p_4x4_data[4]*m_p_4x4_data[11] - m_p_4x4_data[0]*m_p_4x4_data[5]*m_p_4x4_data[11]) / matrix_determinant;
470 m12 = (m_p_4x4_data[6]*m_p_4x4_data[9]*m_p_4x4_data[12] - m_p_4x4_data[5]*m_p_4x4_data[10]*m_p_4x4_data[12] - m_p_4x4_data[6]*m_p_4x4_data[8]*m_p_4x4_data[13] + m_p_4x4_data[4]*m_p_4x4_data[10]*m_p_4x4_data[13] + m_p_4x4_data[5]*m_p_4x4_data[8]*m_p_4x4_data[14] - m_p_4x4_data[4]*m_p_4x4_data[9]*m_p_4x4_data[14]) / matrix_determinant;
471 m13 = (m_p_4x4_data[1]*m_p_4x4_data[10]*m_p_4x4_data[12] - m_p_4x4_data[2]*m_p_4x4_data[9]*m_p_4x4_data[12] + m_p_4x4_data[2]*m_p_4x4_data[8]*m_p_4x4_data[13] - m_p_4x4_data[0]*m_p_4x4_data[10]*m_p_4x4_data[13] - m_p_4x4_data[1]*m_p_4x4_data[8]*m_p_4x4_data[14] + m_p_4x4_data[0]*m_p_4x4_data[9]*m_p_4x4_data[14]) / matrix_determinant;
472 m14 = (m_p_4x4_data[2]*m_p_4x4_data[5]*m_p_4x4_data[12] - m_p_4x4_data[1]*m_p_4x4_data[6]*m_p_4x4_data[12] - m_p_4x4_data[2]*m_p_4x4_data[4]*m_p_4x4_data[13] + m_p_4x4_data[0]*m_p_4x4_data[6]*m_p_4x4_data[13] + m_p_4x4_data[1]*m_p_4x4_data[4]*m_p_4x4_data[14] - m_p_4x4_data[0]*m_p_4x4_data[5]*m_p_4x4_data[14]) / matrix_determinant;
473 m15 = (m_p_4x4_data[1]*m_p_4x4_data[6]*m_p_4x4_data[8] - m_p_4x4_data[2]*m_p_4x4_data[5]*m_p_4x4_data[8] + m_p_4x4_data[2]*m_p_4x4_data[4]*m_p_4x4_data[9] - m_p_4x4_data[0]*m_p_4x4_data[6]*m_p_4x4_data[9] - m_p_4x4_data[1]*m_p_4x4_data[4]*m_p_4x4_data[10] + m_p_4x4_data[0]*m_p_4x4_data[5]*m_p_4x4_data[10]) / matrix_determinant;
476 return (
Matrix4x4<T>(m0, m1,
m2,
m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15));
484 memcpy(m_p_4x4_data, aMatrix.
m_p_4x4_data,
sizeof(m_p_4x4_data));
486 m_small_matrix_up_to_date =
false;
497 x = m_p_4x4_data[0] * aVector.getX() + m_p_4x4_data[4] * aVector.getY() + m_p_4x4_data[8] * aVector.getZ() + m_p_4x4_data[12];
498 y = m_p_4x4_data[1] * aVector.getX() + m_p_4x4_data[5] * aVector.getY() + m_p_4x4_data[9] * aVector.getZ() + m_p_4x4_data[13];
499 z = m_p_4x4_data[2] * aVector.getX() + m_p_4x4_data[6] * aVector.getY() + m_p_4x4_data[10] * aVector.getZ() + m_p_4x4_data[14];
500 w = m_p_4x4_data[3] * aVector.getX() + m_p_4x4_data[7] * aVector.getY() + m_p_4x4_data[11] * aVector.getZ() + m_p_4x4_data[15];
501 return (
Vec3<T>(x / w, y / w, z / w));
511 T* p_matrix1(const_cast<T*>(aMatrix.m_p_4x4_data));
515 for (
int i(0); i < 4; i++, p_matrix1 += 4)
517 T* p_matrix0(const_cast<T*>(m_p_4x4_data));
520 for (
int j(0); j < 4; j++, p_matrix0++, p_result++)
522 T* p_temp(p_matrix1);
524 *p_result = p_matrix0[0] * *p_temp++;
525 *p_result += p_matrix0[4] * *p_temp++;
526 *p_result += p_matrix0[8] * *p_temp++;
527 *p_result += p_matrix0[12] * *p_temp++;
539 *
this = *
this * aMatrix;
541 m_small_matrix_up_to_date =
false;
551 return (&m_p_4x4_data[0]);
559 return (&m_p_4x4_data[0]);
568 if (!m_small_matrix_up_to_date)
570 m_p_3x3_data[0] = m_p_4x4_data[ 0];
571 m_p_3x3_data[1] = m_p_4x4_data[ 1];
572 m_p_3x3_data[2] = m_p_4x4_data[ 2];
574 m_p_3x3_data[3] = m_p_4x4_data[ 4];
575 m_p_3x3_data[4] = m_p_4x4_data[ 5];
576 m_p_3x3_data[5] = m_p_4x4_data[ 6];
578 m_p_3x3_data[6] = m_p_4x4_data[ 8];
579 m_p_3x3_data[7] = m_p_4x4_data[ 9];
580 m_p_3x3_data[8] = m_p_4x4_data[10];
582 m_small_matrix_up_to_date =
true;
585 return (&m_p_3x3_data[0]);
593 std::vector<double> temp;
595 for (
unsigned int i = 0; i < 16; ++i)
597 temp.push_back(m_p_4x4_data[i]);
616 anOutputStream << m_p_4x4_data[0] <<
" " << m_p_4x4_data[4] <<
" " << m_p_4x4_data[ 8] <<
" " << m_p_4x4_data[12] << std::endl;
617 anOutputStream << m_p_4x4_data[1] <<
" " << m_p_4x4_data[5] <<
" " << m_p_4x4_data[ 9] <<
" " << m_p_4x4_data[13] << std::endl;
618 anOutputStream << m_p_4x4_data[2] <<
" " << m_p_4x4_data[6] <<
" " << m_p_4x4_data[10] <<
" " << m_p_4x4_data[14] << std::endl;
619 anOutputStream << m_p_4x4_data[3] <<
" " << m_p_4x4_data[7] <<
" " << m_p_4x4_data[11] <<
" " << m_p_4x4_data[15] << std::endl;
624 template <
typename T> std::ostream&
operator<<(std::ostream& anOutputStream,
628 aMatrix.
print(anOutputStream);
629 return (anOutputStream);
const double m2
square meter
T m_p_4x4_data[4 *4]
the matrix data
double length() const
Get the length of the vector.
Matrix4x4(const T &a1=1.0f, const T &a2=0.0f, const T &a3=0.0f, const T &a4=0.0f, const T &a5=0.0f, const T &a6=1.0f, const T &a7=0.0f, const T &a8=0.0f, const T &a9=0.0f, const T &a10=0.0f, const T &a11=1.0f, const T &a12=0.0f, const T &a13=0.0f, const T &a14=0.0f, const T &a15=0.0f, const T &a16=1.0f)
Default Constructor (create an identity matrix).
Vec3 is a template class to handle a 3D vector.
T getX() const
Accessor on the position along the x-axis.
T getZ() const
Accessor on the position along the z-axis.
Exception is a class to handle exceptions.
Vec3 normal() const
Get the unit vector corresponding to the normed current vector.
Generic class to handle exceptions.
T getY() const
Accessor on the position along the y-axis.
void print() const
Print the matrix in the console.
std::ostream & operator<<(std::ostream &anOutputSream, const gVirtualXRay::AtomicElement &anElement)
operator <<
Constant values, such as the Z number of different atoms, etc.
Matrix4x4 is a template class to handle a 4 by 4 matrix.
Image< T > operator*(const T &aValue, const Image< T > &anImage)
const double m3
cubic meter