|
cgma
|
#include <CubitTransformMatrix.hpp>
Definition at line 20 of file CubitTransformMatrix.hpp.
Definition at line 16 of file CubitTransformMatrix.cpp.
: CubitMatrix(4) { // Just creates a 4x4 matrix set to identity }
| CubitTransformMatrix::CubitTransformMatrix | ( | const CubitTransformMatrix & | from | ) |
Definition at line 22 of file CubitTransformMatrix.cpp.
: CubitMatrix(from) { // Just copies it }
Definition at line 29 of file CubitTransformMatrix.cpp.
{
// Just deletes it
}
| CubitTransformMatrix CubitTransformMatrix::construct_matrix | ( | const CubitVector & | origin, |
| const CubitVector & | x_axis, | ||
| const CubitVector & | y_axis | ||
| ) | [static] |
Definition at line 386 of file CubitTransformMatrix.cpp.
{
CubitTransformMatrix mat;
double angle = x_axis.interior_angle(CubitVector(1,0,0));
CubitVector axis = angle == 180 ? CubitVector(0,1,0) : CubitVector(1,0,0) * x_axis;
mat.rotate(angle, axis);
CubitVector y = mat * CubitVector(0,1,0);
angle = y_axis.interior_angle(y);
axis = angle == 180 ? CubitVector(0,0,1) : y * y_axis;
mat.rotate(angle, axis);
mat.translate(origin);
return mat;
}
| void CubitTransformMatrix::get_rotation_axis_and_angle | ( | CubitVector & | rotation_axis, |
| double & | angle | ||
| ) |
Definition at line 402 of file CubitTransformMatrix.cpp.
{
double cos_theta = (this->get(0,0) + this->get(1,1) + this->get(2,2) - 1) / 2;
double x = 0;
double y = 0;
double z = 0;
if (fabs(cos_theta - 1) < .0001)
{
// theta is 1 or almost 1
angle = 0;
x = 0;
y = 0;
z = 1;
}
else if (fabs(cos_theta + 1) > .0001)
{
// theta is NOT -1 or almost -1
angle = acos(cos_theta);
angle = (angle * 180.0) / CUBIT_PI; // convert to degrees
double sin_theta = sqrt(1 - cos_theta * cos_theta);
x = ( (this->get(2,1) - this->get(1,2)) / 2 ) / sin_theta;
y = ( (this->get(0,2) - this->get(2,0)) / 2 ) / sin_theta;
z = ( (this->get(1,0) - this->get(0,1)) / 2 ) / sin_theta;
}
else
{
angle = 180;
if (this->get(0,0) >= this->get(1,1))
{
if (this->get(0,0) >= this->get(2,2))
{
// 0,0 is maximal diagonal term
x = sqrt(this->get(0,0) - this->get(1,1) - this->get(2,2) + 1) / 2;
double half_inverse = 1 / (2 * x);
y = half_inverse * this->get(0,1);
z = half_inverse * this->get(0,2);
}
else
{
// 2,2 is maximal diagonal term
z = sqrt(this->get(2,2) - this->get(0,0) - this->get(1,1) + 1) / 2;
double half_inverse = 1 / (2 * z);
x = half_inverse * this->get(0,2);
y = half_inverse * this->get(1,2);
}
}
else
{
if (this->get(1,1) >= this->get(2,2))
{
// 1,1 is maximal diagonal term
y = sqrt(this->get(1,1) - this->get(0,0) - this->get(2,2) + 1) / 2;
double half_inverse = 1 / (2 * y);
x = half_inverse * this->get(0,1);
z = half_inverse * this->get(1,2);
}
else
{
// 2,2 is maximal diagonal term
z = sqrt(this->get(2,2) - this->get(0,0) - this->get(1,1) + 1) / 2;
double half_inverse = 1 / (2 * z);
x = half_inverse * this->get(0,2);
y = half_inverse * this->get(1,2);
}
}
}
rotation_axis.x(x);
rotation_axis.y(y);
rotation_axis.z(z);
}
Reimplemented from CubitMatrix.
Definition at line 255 of file CubitTransformMatrix.cpp.
{
CubitMatrix matrix = *this;
matrix = matrix.inverse();
for( int ii = 0; ii < 4; ii++ )
{
for( int jj = 0; jj < 4; jj++ )
{
set( ii, jj, matrix.get(ii,jj) );
}
}
return *this;
}
| CubitVector CubitTransformMatrix::operator* | ( | const CubitVector & | point | ) | const |
Reimplemented from CubitMatrix.
Definition at line 271 of file CubitTransformMatrix.cpp.
{
// Make a sub-matrix, multiply the point by it.
CubitVector vec = (this->sub_matrix(3, 3))*point;
// Handle the fourth column here
vec.x(vec.x() + get(0, 3));
vec.y(vec.y() + get(1, 3));
vec.z(vec.z() + get(2, 3));
return vec;
}
| CubitTransformMatrix CubitTransformMatrix::operator* | ( | const CubitTransformMatrix & | matrix | ) | const |
Definition at line 305 of file CubitTransformMatrix.cpp.
{
CubitTransformMatrix rv;
CubitMatrix temp(4);
temp = CubitMatrix::operator*(matrix);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
rv.set(i, j, temp.get(i,j));
return rv;
}
| CubitMatrix CubitTransformMatrix::operator* | ( | const CubitMatrix & | matrix | ) | const |
Reimplemented from CubitMatrix.
Definition at line 317 of file CubitTransformMatrix.cpp.
{
return CubitMatrix::operator*(matrix);
}
| CubitTransformMatrix CubitTransformMatrix::operator* | ( | double | val | ) | const |
Reimplemented from CubitMatrix.
Definition at line 322 of file CubitTransformMatrix.cpp.
{
CubitTransformMatrix rv;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
rv.set(i, j, this->get(i,j)*val);
return rv;
}
| CubitVector CubitTransformMatrix::origin | ( | ) | const |
return the origin of this system
Definition at line 344 of file CubitTransformMatrix.cpp.
{
return CubitVector(this->get(0,3), this->get(1,3), this->get(2,3));
}
| void CubitTransformMatrix::print_me | ( | ) | const |
Definition at line 331 of file CubitTransformMatrix.cpp.
{
PRINT_INFO("%8.4f %8.4f %8.4f %8.4f\n",
get(0,0), get(0,1), get(0,2), get(0,3));
PRINT_INFO("%8.4f %8.4f %8.4f %8.4f\n",
get(1,0), get(1,1), get(1,2), get(1,3));
PRINT_INFO("%8.4f %8.4f %8.4f %8.4f\n",
get(2,0), get(2,1), get(2,2), get(2,3));
PRINT_INFO("%8.4f %8.4f %8.4f %8.4f\n",
get(3,0), get(3,1), get(3,2), get(3,3));
}
| CubitTransformMatrix & CubitTransformMatrix::reflect | ( | const CubitVector & | vector | ) |
Definition at line 142 of file CubitTransformMatrix.cpp.
{
double a, b, c, d;
CubitVector axis = vector;
axis.normalize();
a = axis.x();
b = axis.y();
c = axis.z();
d = sqrt(b*b + c*c);
// Make an Identity matrix
CubitTransformMatrix mat;
if(d)
{
// Place values in appropriate places for negative rotate about x
mat.set(1, 1, c/d);
mat.set(1, 2, -b/d);
mat.set(2, 1, b/d);
mat.set(2, 2, c/d);
// Perform Pre-Multiplication
*this = mat * *this;
mat.set_to_identity();
}
// Place values in appropriate places for negative rotate about y
mat.set(0, 0, d);
mat.set(0, 2, -a);
mat.set(2, 0, a);
mat.set(2, 2, d);
// Perform Pre-Multiplication
*this = mat * *this;
mat.set_to_identity();
// Place values in appropriate places for reflect across z
mat.set(2, 2, -1);
// Perform Pre-Multiplication
*this = mat * *this;
mat.set_to_identity();
// Place values in appropriate places for rotate about y
mat.set(0, 0, d);
mat.set(0, 2, a);
mat.set(2, 0, -a);
mat.set(2, 2, d);
// Perform Pre-Multiplication
*this = mat * *this;
mat.set_to_identity();
if(d)
{
// Place values in appropriate places for rotate about x
mat.set(1, 1, c/d);
mat.set(1, 2, b/d);
mat.set(2, 1, -b/d);
mat.set(2, 2, c/d);
// Perform Pre-Multiplication
*this = mat * *this;
mat.set_to_identity();
}
return *this;
}
| CubitTransformMatrix & CubitTransformMatrix::rotate | ( | double | degrees, |
| const CubitVector & | vector | ||
| ) |
Definition at line 51 of file CubitTransformMatrix.cpp.
{
double angle, ct, st;
// Make a copy of vector so we don't have to change it
CubitVector axis = vector;
// Convert degrees to radians
angle = -degrees * CUBIT_PI/180.0;
// Take sin and cos
ct = cos(angle);
st = sin(angle);
// Normalize the axis vector
axis.normalize();
// Make an identity matrix
CubitTransformMatrix mat;
// Setup some calculations that occur repeatedly
double one_minus_cos = 1.0 - ct;
double dx_ct = axis.x() * one_minus_cos;
double dy_ct = axis.y() * one_minus_cos;
double dz_ct = axis.z() * one_minus_cos;
double dx_st = axis.x() * st;
double dy_st = axis.y() * st;
double dz_st = axis.z() * st;
// Set the values in the matrix
mat.set(0, 0, ct + axis.x() * dx_ct);
mat.set(1, 0, -dz_st + axis.x() * dy_ct);
mat.set(2, 0, dy_st + axis.x() * dz_ct);
mat.set(0, 1, dz_st + axis.y() * dx_ct);
mat.set(1, 1, ct + axis.y() * dy_ct);
mat.set(2, 1, -dx_st + axis.y() * dz_ct);
mat.set(0, 2, -dy_st + axis.z() * dx_ct);
mat.set(1, 2, dx_st + axis.z() * dy_ct);
mat.set(2, 2, ct + axis.z() * dz_ct);
// Premultiply the matrix
*this = mat * *this;
// Return
return *this;
}
| CubitTransformMatrix & CubitTransformMatrix::rotate | ( | double | degrees, |
| char | axis | ||
| ) |
Definition at line 99 of file CubitTransformMatrix.cpp.
{
if(axis != 'x' && axis != 'y' && axis != 'z')
throw std::invalid_argument("Invalid Axis: must be X, Y, or Z");
//assert (axis == 'x' || axis == 'y' || axis == 'z');
// Convert to Radians, Get the sine and cosine
double angle = degrees * CUBIT_PI/180.;
double s, c;
s = sin(angle);
c = cos(angle);
// Make an Identity matrix
CubitTransformMatrix mat;
// Place values in appropriate places
switch (axis)
{
case 'x':
mat.set(1, 1, c);
mat.set(2, 2, c);
mat.set(1, 2, -s);
mat.set(2, 1, s);
break;
case 'y':
mat.set(0, 0, c);
mat.set(0, 2, s);
mat.set(2, 0, -s);
mat.set(2, 2, c);
break;
case 'z':
mat.set(0, 0, c);
mat.set(1, 0, s);
mat.set(0, 1, -s);
mat.set(1, 1, c);
break;
}
// Perform Pre-Multiplication
*this = mat * *this;
return *this;
}
| CubitTransformMatrix & CubitTransformMatrix::rotate | ( | double | degrees, |
| const CubitVector & | axis_from, | ||
| const CubitVector & | axis_to | ||
| ) |
Definition at line 216 of file CubitTransformMatrix.cpp.
| CubitTransformMatrix & CubitTransformMatrix::scale_about_origin | ( | const CubitVector & | scale | ) |
Definition at line 232 of file CubitTransformMatrix.cpp.
{
return scale_about_origin(scale.x(), scale.y(), scale.z());
}
| CubitTransformMatrix & CubitTransformMatrix::scale_about_origin | ( | double | x, |
| double | y, | ||
| double | z | ||
| ) |
Definition at line 237 of file CubitTransformMatrix.cpp.
{
CubitTransformMatrix mat;
mat.set(0, 0, x);
mat.set(1, 1, y);
mat.set(2, 2, z);
// Perform Pre-Multiplication
*this = mat * *this;
return *this;
}
| CubitTransformMatrix & CubitTransformMatrix::scale_about_origin | ( | double | scale | ) |
Definition at line 250 of file CubitTransformMatrix.cpp.
{
return scale_about_origin(scale, scale, scale);
}
| CubitTransformMatrix & CubitTransformMatrix::translate | ( | const CubitVector & | v | ) |
| CubitTransformMatrix & CubitTransformMatrix::translate | ( | double | x, |
| double | y, | ||
| double | z | ||
| ) |
Definition at line 42 of file CubitTransformMatrix.cpp.
{
set (0, 3, get(0, 3) + x);
set (1, 3, get(1, 3) + y);
set (2, 3, get(2, 3) + z);
return *this;
}
| CubitVector CubitTransformMatrix::x_axis | ( | ) | const |
return the x-axis
Definition at line 350 of file CubitTransformMatrix.cpp.
{
CubitMatrix tmp1(4,1);
tmp1.set(0,0,1);
tmp1.set(1,0,0);
tmp1.set(2,0,0);
tmp1.set(3,0,0);
CubitMatrix tmp2 = (*this) * tmp1;
return CubitVector(tmp2.get(0,0), tmp2.get(1,0), tmp2.get(2,0));
}
| CubitVector CubitTransformMatrix::y_axis | ( | ) | const |
return the y-axis
Definition at line 362 of file CubitTransformMatrix.cpp.
{
CubitMatrix tmp1(4,1);
tmp1.set(0,0,0);
tmp1.set(1,0,1);
tmp1.set(2,0,0);
tmp1.set(3,0,0);
CubitMatrix tmp2 = (*this) * tmp1;
return CubitVector(tmp2.get(0,0), tmp2.get(1,0), tmp2.get(2,0));
}
| CubitVector CubitTransformMatrix::z_axis | ( | ) | const |
return the z-axis
Definition at line 374 of file CubitTransformMatrix.cpp.
{
CubitMatrix tmp1(4,1);
tmp1.set(0,0,0);
tmp1.set(1,0,0);
tmp1.set(2,0,1);
tmp1.set(3,0,0);
CubitMatrix tmp2 = (*this) * tmp1;
return CubitVector(tmp2.get(0,0), tmp2.get(1,0), tmp2.get(2,0));
}
| CUBIT_UTIL_EXPORT CubitVector operator* | ( | const CubitVector & | point, |
| const CubitTransformMatrix & | matrix | ||
| ) | [friend] |
Definition at line 286 of file CubitTransformMatrix.cpp.
{
// Make a 1x4 matrix, multiply matrix by it.
CubitMatrix m1(1,4);
m1.set(0, 0, point.x());
m1.set(0, 1, point.y());
m1.set(0, 2, point.z());
m1.set(0, 3, 1);
// Perform the multiplication
m1 = m1 * matrix;
// The result is a 1x4
// Put the results into a vector (dividing by w), and return
double w = m1.get(0,3);
return CubitVector(m1.get(0,0)/w, m1.get(0,1)/w, m1.get(0,2)/w);
}