00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "gMatrix.H"
00027
00028 int
00029 VECTOR::MakeNonHomogeneous()
00030
00031
00032 {
00033 if (v[3] == 0)
00034 {
00035 opserr << "ERROR: w coordinate of vector is 0, cannot unhomogeneize" << endln;
00036 return 0;
00037 }
00038 v[0] = v[0]/v[3];
00039 v[1] = v[1]/v[3];
00040 v[2] = v[2]/v[3];
00041 v[3] = 1;
00042 return 1;
00043 }
00044
00045
00046 VECTOR
00047 VECTOR::operator*(MATRIX &M)
00048
00049 {
00050 VECTOR *V = new VECTOR;
00051 V[0] = v[0] * M.m[0][0] + v[1] * M.m[1][0] + v[2] * M.m[2][0] + v[3] * M.m[3][0];
00052 V[1] = v[0] * M.m[0][1] + v[1] * M.m[1][1] + v[2] * M.m[2][1] + v[3] * M.m[3][1];
00053 V[2] = v[0] * M.m[0][2] + v[1] * M.m[1][2] + v[2] * M.m[2][2] + v[3] * M.m[3][2];
00054 V[3] = v[0] * M.m[0][3] + v[1] * M.m[1][3] + v[2] * M.m[2][3] + v[3] * M.m[3][3];
00055 return *V;
00056 }
00057 void
00058 VECTOR::TimesMat(MATRIX &M)
00059
00060 {
00061 float a,b,c,d;
00062 a = v[0] * M.m[0][0] + v[1] * M.m[0][1] + v[2] * M.m[0][2] + v[3] * M.m[0][3];
00063 b = v[0] * M.m[1][0] + v[1] * M.m[1][1] + v[2] * M.m[1][2] + v[3] * M.m[1][3];
00064 c = v[0] * M.m[2][0] + v[1] * M.m[2][1] + v[2] * M.m[2][2] + v[3] * M.m[2][3];
00065 d = v[0] * M.m[3][0] + v[1] * M.m[3][1] + v[2] * M.m[3][2] + v[3] * M.m[3][3];
00066 v[0] = a; v[1] = b; v[2] = c; v[3] = d;
00067 }
00068
00069 void
00070 MATRIX::Set(float a1, float a2, float a3, float a4,
00071 float b1, float b2, float b3, float b4,
00072 float c1, float c2, float c3, float c4,
00073 float d1, float d2, float d3, float d4)
00074
00075 {
00076 m[0][0] = a1;
00077 m[0][1] = a2;
00078 m[0][2] = a3;
00079 m[0][3] = a4;
00080
00081 m[1][0] = b1;
00082 m[1][1] = b2;
00083 m[1][2] = b3;
00084 m[1][3] = b4;
00085
00086 m[2][0] = c1;
00087 m[2][1] = c2;
00088 m[2][2] = c3;
00089 m[2][3] = c4;
00090
00091 m[3][0] = d1;
00092 m[3][1] = d2;
00093 m[3][2] = d3;
00094 m[3][3] = d4;
00095 }
00096
00097 MATRIX
00098 MATRIX::Transpose()
00099 {
00100 MATRIX *retMat = new MATRIX();
00101 int i,j;
00102 for (i=0; i<4; i++)
00103 for (j=0; j<4; j++)
00104 retMat->m[i][j] = m[j][i];
00105 return *retMat;
00106 }
00107
00108 MATRIX
00109 MATRIX::operator*(MATRIX &M)
00110
00111 {
00112 MATRIX *retMat = new MATRIX();
00113 int i,j,k;
00114 float sum;
00115 for (i=0; i<4; i++)
00116 for (j=0; j<4; j++) {
00117 sum = 0.0;
00118 for (k=0; k<4; k++)
00119 sum = sum + m[i][k] * M.m[k][j];
00120 retMat->m[i][j] = sum;
00121 }
00122
00123 return *retMat;
00124 }
00125
00126
00127
00128
00129 OPS_Stream &
00130 operator<<(OPS_Stream &os, VECTOR &v)
00131 {
00132 os << "[ " << v[0] << ' ' << v[1] << ' ' << v[2] << ' ' << v[3] << " ]";
00133 return os;
00134 }
00135
00136 OPS_Stream &
00137 operator<<(OPS_Stream &os, MATRIX &M)
00138 {
00139 os << "{ " << M.m[0][0] << ' ' << M.m[0][1] << ' ' << M.m[0][2] << ' ' << M.m[0][3] << " }" << endln;
00140 os << "{ " << M.m[1][0] << ' ' << M.m[1][1] << ' ' << M.m[1][2] << ' ' << M.m[1][3] << " }" << endln;
00141 os << "{ " << M.m[2][0] << ' ' << M.m[2][1] << ' ' << M.m[2][2] << ' ' << M.m[2][3] << " }" << endln;
00142 os << "{ " << M.m[3][0] << ' ' << M.m[3][1] << ' ' << M.m[3][2] << ' ' << M.m[3][3] << " }" << endln;
00143 return os;
00144 }
00145
00146