1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #include <Standard_OutOfRange.hxx>
17 #include <Standard_ConstructionError.hxx>
19 #define Mat00 matrix[0][0]
20 #define Mat01 matrix[0][1]
21 #define Mat02 matrix[0][2]
22 #define Mat10 matrix[1][0]
23 #define Mat11 matrix[1][1]
24 #define Mat12 matrix[1][2]
25 #define Mat20 matrix[2][0]
26 #define Mat21 matrix[2][1]
27 #define Mat22 matrix[2][2]
29 #define Nat00 NewMat.matrix[0][0]
30 #define Nat01 NewMat.matrix[0][1]
31 #define Nat02 NewMat.matrix[0][2]
32 #define Nat10 NewMat.matrix[1][0]
33 #define Nat11 NewMat.matrix[1][1]
34 #define Nat12 NewMat.matrix[1][2]
35 #define Nat20 NewMat.matrix[2][0]
36 #define Nat21 NewMat.matrix[2][1]
37 #define Nat22 NewMat.matrix[2][2]
39 #define Oat00 Other.matrix[0][0]
40 #define Oat01 Other.matrix[0][1]
41 #define Oat02 Other.matrix[0][2]
42 #define Oat10 Other.matrix[1][0]
43 #define Oat11 Other.matrix[1][1]
44 #define Oat12 Other.matrix[1][2]
45 #define Oat20 Other.matrix[2][0]
46 #define Oat21 Other.matrix[2][1]
47 #define Oat22 Other.matrix[2][2]
49 inline gp_Mat::gp_Mat () {
61 inline gp_Mat::gp_Mat (const Standard_Real a11,
62 const Standard_Real a12,
63 const Standard_Real a13,
64 const Standard_Real a21,
65 const Standard_Real a22,
66 const Standard_Real a23,
67 const Standard_Real a31,
68 const Standard_Real a32,
69 const Standard_Real a33) {
82 inline void gp_Mat::SetDiagonal (const Standard_Real X1,
83 const Standard_Real X2,
84 const Standard_Real X3)
86 Mat00 = X1; Mat11 = X2; Mat22 = X3;
89 inline void gp_Mat::SetIdentity ()
91 Mat00 = Mat11 = Mat22 = 1.0;
92 Mat01 = Mat02 = Mat10 = Mat12 = Mat20 = Mat21 = 0.0;
95 inline void gp_Mat::SetScale (const Standard_Real S)
97 Mat00 = Mat11 = Mat22 = S;
98 Mat01 = Mat02 = Mat10 = Mat12 = Mat20 = Mat21 = 0.0;
101 inline void gp_Mat::SetValue (const Standard_Integer Row,
102 const Standard_Integer Col,
103 const Standard_Real Value)
105 Standard_OutOfRange_Raise_if
106 (Row < 1 || Row > 3 || Col < 1 || Col > 3, " ");
107 matrix[Row-1][Col-1] = Value;
110 inline Standard_Real gp_Mat::Determinant () const
113 Mat00 * (Mat11 * Mat22 - Mat21 * Mat12) -
114 Mat01 * (Mat10 * Mat22 - Mat20 * Mat12) +
115 Mat02 * (Mat10 * Mat21 - Mat20 * Mat11);
118 inline const Standard_Real& gp_Mat::Value (const Standard_Integer Row,
119 const Standard_Integer Col) const
121 Standard_OutOfRange_Raise_if
122 (Row < 1 || Row > 3 || Col < 1 || Col > 3, " ");
123 return matrix[Row-1][Col-1];
126 inline Standard_Real& gp_Mat::ChangeValue (const Standard_Integer Row,
127 const Standard_Integer Col)
129 Standard_OutOfRange_Raise_if
130 (Row < 1 || Row > 3 || Col < 1 || Col > 3, " ");
131 return matrix[Row-1][Col-1];
134 inline Standard_Boolean gp_Mat::IsSingular () const
136 // Pour etre sur que Gauss va fonctionner, il faut faire Gauss ...
137 Standard_Real val = Determinant();
138 if (val < 0) val = - val;
139 return val <= gp::Resolution();
142 inline void gp_Mat::Add (const gp_Mat& Other)
144 Mat00 = Mat00 + Oat00;
145 Mat01 = Mat01 + Oat01;
146 Mat02 = Mat02 + Oat02;
147 Mat10 = Mat10 + Oat10;
148 Mat11 = Mat11 + Oat11;
149 Mat12 = Mat12 + Oat12;
150 Mat20 = Mat20 + Oat20;
151 Mat21 = Mat21 + Oat21;
152 Mat22 = Mat22 + Oat22;
155 inline gp_Mat gp_Mat::Added (const gp_Mat& Other) const
158 Nat00 = Mat00 + Oat00;
159 Nat01 = Mat01 + Oat01;
160 Nat02 = Mat02 + Oat02;
161 Nat10 = Mat10 + Oat10;
162 Nat11 = Mat11 + Oat11;
163 Nat12 = Mat12 + Oat12;
164 Nat20 = Mat20 + Oat20;
165 Nat21 = Mat21 + Oat21;
166 Nat22 = Mat22 + Oat22;
170 inline void gp_Mat::Divide (const Standard_Real Scalar)
172 Standard_Real val = Scalar;
173 if (val < 0) val = - val;
174 Standard_ConstructionError_Raise_if
175 (val <= gp::Resolution(),"gp_Mat : Divide by 0");
176 Standard_Real UnSurScalar = 1.0 / Scalar;
177 Mat00 *= UnSurScalar;
178 Mat01 *= UnSurScalar;
179 Mat02 *= UnSurScalar;
180 Mat10 *= UnSurScalar;
181 Mat11 *= UnSurScalar;
182 Mat12 *= UnSurScalar;
183 Mat20 *= UnSurScalar;
184 Mat21 *= UnSurScalar;
185 Mat22 *= UnSurScalar;
188 inline gp_Mat gp_Mat::Divided (const Standard_Real Scalar) const
190 Standard_Real val = Scalar;
191 if (val < 0) val = - val;
192 Standard_ConstructionError_Raise_if
193 (val <= gp::Resolution(),"gp_Mat : Divide by 0");
195 Standard_Real UnSurScalar = 1.0 / Scalar;
196 Nat00 = Mat00 * UnSurScalar;
197 Nat01 = Mat01 * UnSurScalar;
198 Nat02 = Mat02 * UnSurScalar;
199 Nat10 = Mat10 * UnSurScalar;
200 Nat11 = Mat11 * UnSurScalar;
201 Nat12 = Mat12 * UnSurScalar;
202 Nat20 = Mat20 * UnSurScalar;
203 Nat21 = Mat21 * UnSurScalar;
204 Nat22 = Mat22 * UnSurScalar;
208 inline gp_Mat gp_Mat::Multiplied (const gp_Mat& Other) const
210 gp_Mat NewMat = *this;
211 NewMat.Multiply(Other);
215 inline void gp_Mat::Multiply (const gp_Mat& Other)
217 Standard_Real T00,T01,T02,T10,T11,T12,T20,T21,T22;
218 T00 = Mat00 * Oat00 + Mat01 * Oat10 + Mat02 * Oat20;
219 T01 = Mat00 * Oat01 + Mat01 * Oat11 + Mat02 * Oat21;
220 T02 = Mat00 * Oat02 + Mat01 * Oat12 + Mat02 * Oat22;
221 T10 = Mat10 * Oat00 + Mat11 * Oat10 + Mat12 * Oat20;
222 T11 = Mat10 * Oat01 + Mat11 * Oat11 + Mat12 * Oat21;
223 T12 = Mat10 * Oat02 + Mat11 * Oat12 + Mat12 * Oat22;
224 T20 = Mat20 * Oat00 + Mat21 * Oat10 + Mat22 * Oat20;
225 T21 = Mat20 * Oat01 + Mat21 * Oat11 + Mat22 * Oat21;
226 T22 = Mat20 * Oat02 + Mat21 * Oat12 + Mat22 * Oat22;
238 inline void gp_Mat::PreMultiply (const gp_Mat& Other)
240 Standard_Real T00,T01,T02,T10,T11,T12,T20,T21,T22;
241 T00 = Oat00 * Mat00 + Oat01 * Mat10 + Oat02 * Mat20;
242 T01 = Oat00 * Mat01 + Oat01 * Mat11 + Oat02 * Mat21;
243 T02 = Oat00 * Mat02 + Oat01 * Mat12 + Oat02 * Mat22;
244 T10 = Oat10 * Mat00 + Oat11 * Mat10 + Oat12 * Mat20;
245 T11 = Oat10 * Mat01 + Oat11 * Mat11 + Oat12 * Mat21;
246 T12 = Oat10 * Mat02 + Oat11 * Mat12 + Oat12 * Mat22;
247 T20 = Oat20 * Mat00 + Oat21 * Mat10 + Oat22 * Mat20;
248 T21 = Oat20 * Mat01 + Oat21 * Mat11 + Oat22 * Mat21;
249 T22 = Oat20 * Mat02 + Oat21 * Mat12 + Oat22 * Mat22;
261 inline gp_Mat gp_Mat::Multiplied (const Standard_Real Scalar) const
264 Nat00 = Scalar * Mat00;
265 Nat01 = Scalar * Mat01;
266 Nat02 = Scalar * Mat02;
267 Nat10 = Scalar * Mat10;
268 Nat11 = Scalar * Mat11;
269 Nat12 = Scalar * Mat12;
270 Nat20 = Scalar * Mat20;
271 Nat21 = Scalar * Mat21;
272 Nat22 = Scalar * Mat22;
276 inline void gp_Mat::Multiply (const Standard_Real Scalar)
289 inline gp_Mat gp_Mat::Powered (const Standard_Integer N) const
296 inline void gp_Mat::Subtract (const gp_Mat& Other)
309 inline gp_Mat gp_Mat::Subtracted (const gp_Mat& Other) const
312 Nat00 = Mat00 - Oat00;
313 Nat01 = Mat01 - Oat01;
314 Nat02 = Mat02 - Oat02;
315 Nat10 = Mat10 - Oat10;
316 Nat11 = Mat11 - Oat11;
317 Nat12 = Mat12 - Oat12;
318 Nat20 = Mat20 - Oat20;
319 Nat21 = Mat21 - Oat21;
320 Nat22 = Mat22 - Oat22;
324 inline void gp_Mat::Transpose ()
338 inline gp_Mat gp_Mat::Transposed () const
340 gp_Mat NewMat = *this;
345 inline gp_Mat operator* (const Standard_Real Scalar, const gp_Mat& Mat3D)
346 { return Mat3D.Multiplied (Scalar); }