27 #include "../WAssert.h"
28 #include "../WLimits.h"
30 #include "WLinearAlgebraFunctions.h"
32 #include "linearAlgebra/WVectorFixed.h"
37 result[0] = mat( 0, 0 ) * vec[0] + mat( 0, 1 ) * vec[1] + mat( 0, 2 ) * vec[2];
38 result[1] = mat( 1, 0 ) * vec[0] + mat( 1, 1 ) * vec[1] + mat( 1, 2 ) * vec[2];
39 result[2] = mat( 2, 0 ) * vec[0] + mat( 2, 1 ) * vec[1] + mat( 2, 2 ) * vec[2];
46 std::vector< double > resultVec4D( 4 );
47 resultVec4D[0] = mat( 0, 0 ) * vec[0] + mat( 0, 1 ) * vec[1] + mat( 0, 2 ) * vec[2] ;
48 resultVec4D[1] = mat( 1, 0 ) * vec[0] + mat( 1, 1 ) * vec[1] + mat( 1, 2 ) * vec[2] ;
49 resultVec4D[2] = mat( 2, 0 ) * vec[0] + mat( 2, 1 ) * vec[1] + mat( 2, 2 ) * vec[2] ;
50 resultVec4D[3] = mat( 3, 0 ) * vec[0] + mat( 3, 1 ) * vec[1] + mat( 3, 2 ) * vec[2] ;
53 result[0] = resultVec4D[0] / resultVec4D[3];
54 result[1] = resultVec4D[1] / resultVec4D[3];
55 result[2] = resultVec4D[2] / resultVec4D[3];
62 std::vector< double > resultVec4D( 4 );
63 resultVec4D[0] = mat( 0, 0 ) * vec[0] + mat( 0, 1 ) * vec[1] + mat( 0, 2 ) * vec[2] + mat( 0, 3 ) * 1;
64 resultVec4D[1] = mat( 1, 0 ) * vec[0] + mat( 1, 1 ) * vec[1] + mat( 1, 2 ) * vec[2] + mat( 1, 3 ) * 1;
65 resultVec4D[2] = mat( 2, 0 ) * vec[0] + mat( 2, 1 ) * vec[1] + mat( 2, 2 ) * vec[2] + mat( 2, 3 ) * 1;
66 resultVec4D[3] = mat( 3, 0 ) * vec[0] + mat( 3, 1 ) * vec[1] + mat( 3, 2 ) * vec[2] + mat( 3, 3 ) * 1;
69 result[0] = resultVec4D[0] / resultVec4D[3];
70 result[1] = resultVec4D[1] / resultVec4D[3];
71 result[2] = resultVec4D[2] / resultVec4D[3];
77 WAssert( mat.
getNbRows(),
"Zero rows found." );
78 WAssert( mat.
getNbCols(),
"Zero columns found." );
79 double det = mat( 0, 0 ) * mat( 1, 1 ) * mat( 2, 2 ) +
80 mat( 0, 1 ) * mat( 1, 2 ) * mat( 2, 0 ) +
81 mat( 0, 2 ) * mat( 1, 0 ) * mat( 2, 1 ) -
82 mat( 0, 2 ) * mat( 1, 1 ) * mat( 2, 0 ) -
83 mat( 0, 1 ) * mat( 1, 0 ) * mat( 2, 2 ) -
84 mat( 0, 0 ) * mat( 1, 2 ) * mat( 2, 1 );
86 WAssert( det != 0,
"Determinant is zero. This matrix can not be inverted." );
90 r( 0, 0 ) = ( mat( 1, 1 ) * mat( 2, 2 ) - mat( 1, 2 ) * mat( 2, 1 ) ) / det;
91 r( 1, 0 ) = ( mat( 1, 2 ) * mat( 2, 0 ) - mat( 1, 0 ) * mat( 2, 2 ) ) / det;
92 r( 2, 0 ) = ( mat( 1, 0 ) * mat( 2, 1 ) - mat( 1, 1 ) * mat( 2, 0 ) ) / det;
93 r( 0, 1 ) = ( mat( 0, 2 ) * mat( 2, 1 ) - mat( 0, 1 ) * mat( 2, 2 ) ) / det;
94 r( 1, 1 ) = ( mat( 0, 0 ) * mat( 2, 2 ) - mat( 0, 2 ) * mat( 2, 0 ) ) / det;
95 r( 2, 1 ) = ( mat( 0, 1 ) * mat( 2, 0 ) - mat( 0, 0 ) * mat( 2, 1 ) ) / det;
96 r( 0, 2 ) = ( mat( 0, 1 ) * mat( 1, 2 ) - mat( 0, 2 ) * mat( 1, 1 ) ) / det;
97 r( 1, 2 ) = ( mat( 0, 2 ) * mat( 1, 0 ) - mat( 0, 0 ) * mat( 1, 2 ) ) / det;
98 r( 2, 2 ) = ( mat( 0, 0 ) * mat( 1, 1 ) - mat( 0, 1 ) * mat( 1, 0 ) ) / det;
105 WAssert( mat.
getNbRows(),
"Zero rows found." );
106 WAssert( mat.
getNbCols(),
"Zero columns found." );
108 mat( 0, 0 ) * mat( 1, 1 ) * mat( 2, 2 ) * mat( 3, 3 ) +
109 mat( 0, 0 ) * mat( 1, 2 ) * mat( 2, 3 ) * mat( 3, 1 ) +
110 mat( 0, 0 ) * mat( 1, 3 ) * mat( 2, 1 ) * mat( 3, 2 ) +
112 mat( 0, 1 ) * mat( 1, 0 ) * mat( 2, 3 ) * mat( 3, 2 ) +
113 mat( 0, 1 ) * mat( 1, 2 ) * mat( 2, 0 ) * mat( 3, 3 ) +
114 mat( 0, 1 ) * mat( 1, 3 ) * mat( 2, 2 ) * mat( 3, 0 ) +
116 mat( 0, 2 ) * mat( 1, 0 ) * mat( 2, 1 ) * mat( 3, 3 ) +
117 mat( 0, 2 ) * mat( 1, 1 ) * mat( 2, 3 ) * mat( 3, 0 ) +
118 mat( 0, 2 ) * mat( 1, 3 ) * mat( 2, 0 ) * mat( 3, 1 ) +
120 mat( 0, 3 ) * mat( 1, 0 ) * mat( 2, 2 ) * mat( 3, 1 ) +
121 mat( 0, 3 ) * mat( 1, 1 ) * mat( 2, 0 ) * mat( 3, 2 ) +
122 mat( 0, 3 ) * mat( 1, 2 ) * mat( 2, 1 ) * mat( 3, 0 ) -
124 mat( 0, 0 ) * mat( 1, 1 ) * mat( 2, 3 ) * mat( 3, 2 ) -
125 mat( 0, 0 ) * mat( 1, 2 ) * mat( 2, 1 ) * mat( 3, 3 ) -
126 mat( 0, 0 ) * mat( 1, 3 ) * mat( 2, 2 ) * mat( 3, 1 ) -
128 mat( 0, 1 ) * mat( 1, 0 ) * mat( 2, 2 ) * mat( 3, 3 ) -
129 mat( 0, 1 ) * mat( 1, 2 ) * mat( 2, 3 ) * mat( 3, 0 ) -
130 mat( 0, 1 ) * mat( 1, 3 ) * mat( 2, 0 ) * mat( 3, 2 ) -
132 mat( 0, 2 ) * mat( 1, 0 ) * mat( 2, 3 ) * mat( 3, 1 ) -
133 mat( 0, 2 ) * mat( 1, 1 ) * mat( 2, 0 ) * mat( 3, 3 ) -
134 mat( 0, 2 ) * mat( 1, 3 ) * mat( 2, 1 ) * mat( 3, 0 ) -
136 mat( 0, 3 ) * mat( 1, 0 ) * mat( 2, 1 ) * mat( 3, 2 ) -
137 mat( 0, 3 ) * mat( 1, 1 ) * mat( 2, 2 ) * mat( 3, 0 ) -
138 mat( 0, 3 ) * mat( 1, 2 ) * mat( 2, 0 ) * mat( 3, 1 );
143 mat( 1, 1 ) * mat( 2, 2 ) * mat( 3, 3 ) +
144 mat( 1, 2 ) * mat( 2, 3 ) * mat( 3, 1 ) +
145 mat( 1, 3 ) * mat( 2, 1 ) * mat( 3, 2 ) -
146 mat( 1, 1 ) * mat( 2, 3 ) * mat( 3, 2 ) -
147 mat( 1, 2 ) * mat( 2, 1 ) * mat( 3, 3 ) -
148 mat( 1, 3 ) * mat( 2, 2 ) * mat( 3, 1 );
151 mat( 0, 1 ) * mat( 2, 3 ) * mat( 3, 2 ) +
152 mat( 0, 2 ) * mat( 2, 1 ) * mat( 3, 3 ) +
153 mat( 0, 3 ) * mat( 2, 2 ) * mat( 3, 1 ) -
154 mat( 0, 1 ) * mat( 2, 2 ) * mat( 3, 3 ) -
155 mat( 0, 2 ) * mat( 2, 3 ) * mat( 3, 1 ) -
156 mat( 0, 3 ) * mat( 2, 1 ) * mat( 3, 2 );
159 mat( 0, 1 ) * mat( 1, 2 ) * mat( 3, 3 ) +
160 mat( 0, 2 ) * mat( 1, 3 ) * mat( 3, 1 ) +
161 mat( 0, 3 ) * mat( 1, 1 ) * mat( 3, 2 ) -
162 mat( 0, 1 ) * mat( 1, 3 ) * mat( 3, 2 ) -
163 mat( 0, 2 ) * mat( 1, 1 ) * mat( 3, 3 ) -
164 mat( 0, 3 ) * mat( 1, 2 ) * mat( 3, 1 );
167 mat( 0, 1 ) * mat( 1, 3 ) * mat( 2, 2 ) +
168 mat( 0, 2 ) * mat( 1, 1 ) * mat( 2, 3 ) +
169 mat( 0, 3 ) * mat( 1, 2 ) * mat( 2, 1 ) -
170 mat( 0, 1 ) * mat( 1, 2 ) * mat( 2, 3 ) -
171 mat( 0, 2 ) * mat( 1, 3 ) * mat( 2, 1 ) -
172 mat( 0, 3 ) * mat( 1, 1 ) * mat( 2, 2 );
175 mat( 1, 0 ) * mat( 2, 3 ) * mat( 3, 2 ) +
176 mat( 1, 2 ) * mat( 2, 0 ) * mat( 3, 3 ) +
177 mat( 1, 3 ) * mat( 2, 2 ) * mat( 3, 0 ) -
178 mat( 1, 0 ) * mat( 2, 2 ) * mat( 3, 3 ) -
179 mat( 1, 2 ) * mat( 2, 3 ) * mat( 3, 0 ) -
180 mat( 1, 3 ) * mat( 2, 0 ) * mat( 3, 2 );
183 mat( 0, 0 ) * mat( 2, 2 ) * mat( 3, 3 ) +
184 mat( 0, 2 ) * mat( 2, 3 ) * mat( 3, 0 ) +
185 mat( 0, 3 ) * mat( 2, 0 ) * mat( 3, 2 ) -
186 mat( 0, 0 ) * mat( 2, 3 ) * mat( 3, 2 ) -
187 mat( 0, 2 ) * mat( 2, 0 ) * mat( 3, 3 ) -
188 mat( 0, 3 ) * mat( 2, 2 ) * mat( 3, 0 );
191 mat( 0, 0 ) * mat( 1, 3 ) * mat( 3, 2 ) +
192 mat( 0, 2 ) * mat( 1, 0 ) * mat( 3, 3 ) +
193 mat( 0, 3 ) * mat( 1, 2 ) * mat( 3, 0 ) -
194 mat( 0, 0 ) * mat( 1, 2 ) * mat( 3, 3 ) -
195 mat( 0, 2 ) * mat( 1, 3 ) * mat( 3, 0 ) -
196 mat( 0, 3 ) * mat( 1, 0 ) * mat( 3, 2 );
199 mat( 0, 0 ) * mat( 1, 2 ) * mat( 2, 3 ) +
200 mat( 0, 2 ) * mat( 1, 3 ) * mat( 2, 0 ) +
201 mat( 0, 3 ) * mat( 1, 0 ) * mat( 2, 2 ) -
202 mat( 0, 0 ) * mat( 1, 3 ) * mat( 2, 2 ) -
203 mat( 0, 2 ) * mat( 1, 0 ) * mat( 2, 3 ) -
204 mat( 0, 3 ) * mat( 1, 2 ) * mat( 2, 0 );
207 mat( 1, 0 ) * mat( 2, 1 ) * mat( 3, 3 ) +
208 mat( 1, 1 ) * mat( 2, 3 ) * mat( 3, 0 ) +
209 mat( 1, 3 ) * mat( 2, 0 ) * mat( 3, 1 ) -
210 mat( 1, 0 ) * mat( 2, 3 ) * mat( 3, 1 ) -
211 mat( 1, 1 ) * mat( 2, 0 ) * mat( 3, 3 ) -
212 mat( 1, 3 ) * mat( 2, 1 ) * mat( 3, 0 );
215 mat( 0, 0 ) * mat( 2, 3 ) * mat( 3, 1 ) +
216 mat( 0, 1 ) * mat( 2, 0 ) * mat( 3, 3 ) +
217 mat( 0, 3 ) * mat( 2, 1 ) * mat( 3, 0 ) -
218 mat( 0, 0 ) * mat( 2, 1 ) * mat( 3, 3 ) -
219 mat( 0, 1 ) * mat( 2, 3 ) * mat( 3, 0 ) -
220 mat( 0, 3 ) * mat( 2, 0 ) * mat( 3, 1 );
223 mat( 0, 0 ) * mat( 1, 1 ) * mat( 3, 3 ) +
224 mat( 0, 1 ) * mat( 1, 3 ) * mat( 3, 0 ) +
225 mat( 0, 3 ) * mat( 1, 0 ) * mat( 3, 1 ) -
226 mat( 0, 0 ) * mat( 1, 3 ) * mat( 3, 1 ) -
227 mat( 0, 1 ) * mat( 1, 0 ) * mat( 3, 3 ) -
228 mat( 0, 3 ) * mat( 1, 1 ) * mat( 3, 0 );
231 mat( 0, 0 ) * mat( 1, 3 ) * mat( 2, 1 ) +
232 mat( 0, 1 ) * mat( 1, 0 ) * mat( 2, 3 ) +
233 mat( 0, 3 ) * mat( 1, 1 ) * mat( 2, 0 ) -
234 mat( 0, 0 ) * mat( 1, 1 ) * mat( 2, 3 ) -
235 mat( 0, 1 ) * mat( 1, 3 ) * mat( 2, 0 ) -
236 mat( 0, 3 ) * mat( 1, 0 ) * mat( 2, 1 );
239 mat( 1, 0 ) * mat( 2, 2 ) * mat( 3, 1 ) +
240 mat( 1, 1 ) * mat( 2, 0 ) * mat( 3, 2 ) +
241 mat( 1, 2 ) * mat( 2, 1 ) * mat( 3, 0 ) -
242 mat( 1, 0 ) * mat( 2, 1 ) * mat( 3, 2 ) -
243 mat( 1, 1 ) * mat( 2, 2 ) * mat( 3, 0 ) -
244 mat( 1, 2 ) * mat( 2, 0 ) * mat( 3, 1 );
247 mat( 0, 0 ) * mat( 2, 1 ) * mat( 3, 2 ) +
248 mat( 0, 1 ) * mat( 2, 2 ) * mat( 3, 0 ) +
249 mat( 0, 2 ) * mat( 2, 0 ) * mat( 3, 1 ) -
250 mat( 0, 0 ) * mat( 2, 2 ) * mat( 3, 1 ) -
251 mat( 0, 1 ) * mat( 2, 0 ) * mat( 3, 2 ) -
252 mat( 0, 2 ) * mat( 2, 1 ) * mat( 3, 0 );
255 mat( 0, 0 ) * mat( 1, 2 ) * mat( 3, 1 ) +
256 mat( 0, 1 ) * mat( 1, 0 ) * mat( 3, 2 ) +
257 mat( 0, 2 ) * mat( 1, 1 ) * mat( 3, 0 ) -
258 mat( 0, 0 ) * mat( 1, 1 ) * mat( 3, 2 ) -
259 mat( 0, 1 ) * mat( 1, 2 ) * mat( 3, 0 ) -
260 mat( 0, 2 ) * mat( 1, 0 ) * mat( 3, 1 );
263 mat( 0, 0 ) * mat( 1, 1 ) * mat( 2, 2 ) +
264 mat( 0, 1 ) * mat( 1, 2 ) * mat( 2, 0 ) +
265 mat( 0, 2 ) * mat( 1, 0 ) * mat( 2, 1 ) -
266 mat( 0, 0 ) * mat( 1, 2 ) * mat( 2, 1 ) -
267 mat( 0, 1 ) * mat( 1, 0 ) * mat( 2, 2 ) -
268 mat( 0, 2 ) * mat( 1, 1 ) * mat( 2, 0 );
270 WAssert( det != 0,
"Determinat is zero. This matrix can not be inverted." );
272 double detInv = 1. / det;
273 for(
size_t r = 0; r < 4; ++r )
275 for(
size_t c = 0; c < 4; ++c )
277 result( c, r ) *= detInv;
size_t getNbRows() const
Get number of rows.
size_t getNbCols() const
Get number of columns.
This only is a 3d double vector.
const double DBL_EPS
Smallest double such: 1.0 + DBL_EPS == 1.0 is still true.