Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-18 09:20:30

0001 // Copyright (c) 1991-1999 Matra Datavision
0002 // Copyright (c) 1999-2014 OPEN CASCADE SAS
0003 //
0004 // This file is part of Open CASCADE Technology software library.
0005 //
0006 // This library is free software; you can redistribute it and/or modify it under
0007 // the terms of the GNU Lesser General Public License version 2.1 as published
0008 // by the Free Software Foundation, with special exception defined in the file
0009 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0010 // distribution for complete text of the license and disclaimer of any warranty.
0011 //
0012 // Alternatively, this file may be used under the terms of Open CASCADE
0013 // commercial license or contractual agreement.
0014 
0015 #ifndef _gp_Mat_HeaderFile
0016 #define _gp_Mat_HeaderFile
0017 
0018 #include <gp.hxx>
0019 #include <Standard_OutOfRange.hxx>
0020 #include <Standard_OStream.hxx>
0021 #include <Standard_ConstructionError.hxx>
0022 
0023 class gp_XYZ;
0024 
0025 //! Describes a three column, three row matrix.
0026 //! This sort of object is used in various vectorial or matrix computations.
0027 class gp_Mat
0028 {
0029 public:
0030   DEFINE_STANDARD_ALLOC
0031 
0032   //! Creates a matrix with null coefficients.
0033   constexpr gp_Mat() noexcept
0034       : myMat{{0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}
0035   {
0036   }
0037 
0038   constexpr gp_Mat(const double theA11,
0039                    const double theA12,
0040                    const double theA13,
0041                    const double theA21,
0042                    const double theA22,
0043                    const double theA23,
0044                    const double theA31,
0045                    const double theA32,
0046                    const double theA33) noexcept;
0047 
0048   //! Creates a matrix.
0049   //! theCol1, theCol2, theCol3 are the 3 columns of the matrix.
0050   Standard_EXPORT gp_Mat(const gp_XYZ& theCol1, const gp_XYZ& theCol2, const gp_XYZ& theCol3);
0051 
0052   //! Assigns the three coordinates of theValue to the column of index
0053   //! theCol of this matrix.
0054   //! Raises OutOfRange if theCol < 1 or theCol > 3.
0055   Standard_EXPORT void SetCol(const int theCol, const gp_XYZ& theValue);
0056 
0057   //! Assigns the number triples theCol1, theCol2, theCol3 to the three
0058   //! columns of this matrix.
0059   Standard_EXPORT void SetCols(const gp_XYZ& theCol1, const gp_XYZ& theCol2, const gp_XYZ& theCol3);
0060 
0061   //! Modifies the matrix M so that applying it to any number
0062   //! triple (X, Y, Z) produces the same result as the cross
0063   //! product of theRef and the number triple (X, Y, Z):
0064   //! i.e.: M * {X,Y,Z}t = theRef.Cross({X, Y ,Z})
0065   //! this matrix is anti symmetric. To apply this matrix to the
0066   //! triplet {XYZ} is the same as to do the cross product between the
0067   //! triplet theRef and the triplet {XYZ}.
0068   //! Note: this matrix is anti-symmetric.
0069   Standard_EXPORT void SetCross(const gp_XYZ& theRef);
0070 
0071   //! Modifies the main diagonal of the matrix.
0072   //! @code
0073   //! <me>.Value (1, 1) = theX1
0074   //! <me>.Value (2, 2) = theX2
0075   //! <me>.Value (3, 3) = theX3
0076   //! @endcode
0077   //! The other coefficients of the matrix are not modified.
0078   constexpr void SetDiagonal(const double theX1, const double theX2, const double theX3) noexcept
0079   {
0080     myMat[0][0] = theX1;
0081     myMat[1][1] = theX2;
0082     myMat[2][2] = theX3;
0083   }
0084 
0085   //! Modifies this matrix so that applying it to any number
0086   //! triple (X, Y, Z) produces the same result as the scalar
0087   //! product of theRef and the number triple (X, Y, Z):
0088   //! this * (X,Y,Z) = theRef.(X,Y,Z)
0089   //! Note: this matrix is symmetric.
0090   Standard_EXPORT void SetDot(const gp_XYZ& theRef) noexcept;
0091 
0092   //! Modifies this matrix so that it represents the Identity matrix.
0093   constexpr void SetIdentity() noexcept
0094   {
0095     myMat[0][0] = myMat[1][1] = myMat[2][2] = 1.0;
0096     myMat[0][1] = myMat[0][2] = myMat[1][0] = myMat[1][2] = myMat[2][0] = myMat[2][1] = 0.0;
0097   }
0098 
0099   //! Modifies this matrix so that it represents a rotation. theAng is the angular value in
0100   //! radians and the XYZ axis gives the direction of the
0101   //! rotation.
0102   //! Raises ConstructionError if XYZ.Modulus() <= Resolution()
0103   Standard_EXPORT void SetRotation(const gp_XYZ& theAxis, const double theAng);
0104 
0105   //! Assigns the three coordinates of Value to the row of index
0106   //! theRow of this matrix. Raises OutOfRange if theRow < 1 or theRow > 3.
0107   Standard_EXPORT void SetRow(const int theRow, const gp_XYZ& theValue);
0108 
0109   //! Assigns the number triples theRow1, theRow2, theRow3 to the three
0110   //! rows of this matrix.
0111   Standard_EXPORT void SetRows(const gp_XYZ& theRow1, const gp_XYZ& theRow2, const gp_XYZ& theRow3);
0112 
0113   //! Modifies the matrix so that it represents
0114   //! a scaling transformation, where theS is the scale factor. :
0115   //! @code
0116   //!         | theS    0.0  0.0 |
0117   //! <me> =  | 0.0   theS   0.0 |
0118   //!         | 0.0  0.0   theS  |
0119   //! @endcode
0120   constexpr void SetScale(const double theS) noexcept
0121   {
0122     myMat[0][0] = myMat[1][1] = myMat[2][2] = theS;
0123     myMat[0][1] = myMat[0][2] = myMat[1][0] = myMat[1][2] = myMat[2][0] = myMat[2][1] = 0.0;
0124   }
0125 
0126   //! Assigns <theValue> to the coefficient of row theRow, column theCol of this matrix.
0127   //! Raises OutOfRange if theRow < 1 or theRow > 3 or theCol < 1 or theCol > 3
0128   void SetValue(const int theRow, const int theCol, const double theValue)
0129   {
0130     Standard_OutOfRange_Raise_if(theRow < 1 || theRow > 3 || theCol < 1 || theCol > 3, " ");
0131     myMat[theRow - 1][theCol - 1] = theValue;
0132   }
0133 
0134   //! Returns the column of theCol index.
0135   //! Raises OutOfRange if theCol < 1 or theCol > 3
0136   Standard_EXPORT gp_XYZ Column(const int theCol) const;
0137 
0138   //! Computes the determinant of the matrix.
0139   constexpr double Determinant() const noexcept
0140   {
0141     const double a00 = myMat[0][0], a01 = myMat[0][1], a02 = myMat[0][2];
0142     const double a10 = myMat[1][0], a11 = myMat[1][1], a12 = myMat[1][2];
0143     const double a20 = myMat[2][0], a21 = myMat[2][1], a22 = myMat[2][2];
0144     // clang-format off
0145     return a00 * (a11 * a22 - a21 * a12)
0146          - a01 * (a10 * a22 - a20 * a12)
0147          + a02 * (a10 * a21 - a20 * a11);
0148     // clang-format on
0149   }
0150 
0151   //! Returns the main diagonal of the matrix.
0152   Standard_EXPORT gp_XYZ Diagonal() const;
0153 
0154   //! returns the row of theRow index.
0155   //! Raises OutOfRange if theRow < 1 or theRow > 3
0156   Standard_EXPORT gp_XYZ Row(const int theRow) const;
0157 
0158   //! Returns the coefficient of range (theRow, theCol)
0159   //! Raises OutOfRange if theRow < 1 or theRow > 3 or theCol < 1 or theCol > 3
0160   const double& Value(const int theRow, const int theCol) const
0161   {
0162     Standard_OutOfRange_Raise_if(theRow < 1 || theRow > 3 || theCol < 1 || theCol > 3, " ");
0163     return myMat[theRow - 1][theCol - 1];
0164   }
0165 
0166   const double& operator()(const int theRow, const int theCol) const
0167   {
0168     return Value(theRow, theCol);
0169   }
0170 
0171   //! Returns the coefficient of range (theRow, theCol)
0172   //! Raises OutOfRange if theRow < 1 or theRow > 3 or theCol < 1 or theCol > 3
0173   double& ChangeValue(const int theRow, const int theCol)
0174   {
0175     Standard_OutOfRange_Raise_if(theRow < 1 || theRow > 3 || theCol < 1 || theCol > 3, " ");
0176     return myMat[theRow - 1][theCol - 1];
0177   }
0178 
0179   double& operator()(const int theRow, const int theCol) { return ChangeValue(theRow, theCol); }
0180 
0181   //! The Gauss LU decomposition is used to invert the matrix
0182   //! (see Math package) so the matrix is considered as singular if
0183   //! the largest pivot found is lower or equal to Resolution from gp.
0184   constexpr bool IsSingular() const noexcept
0185   {
0186     // Pour etre sur que Gauss va fonctionner, il faut faire Gauss ...
0187     const double aDet = Determinant();
0188     return (aDet < 0.0 ? -aDet : aDet) <= gp::Resolution();
0189   }
0190 
0191   constexpr void Add(const gp_Mat& theOther) noexcept;
0192 
0193   constexpr void operator+=(const gp_Mat& theOther) noexcept { Add(theOther); }
0194 
0195   //! Computes the sum of this matrix and
0196   //! the matrix theOther for each coefficient of the matrix :
0197   //! <me>.Coef(i,j) + <theOther>.Coef(i,j)
0198   [[nodiscard]] constexpr gp_Mat Added(const gp_Mat& theOther) const noexcept;
0199 
0200   [[nodiscard]] constexpr gp_Mat operator+(const gp_Mat& theOther) const noexcept
0201   {
0202     return Added(theOther);
0203   }
0204 
0205   constexpr void Divide(const double theScalar);
0206 
0207   constexpr void operator/=(const double theScalar) { Divide(theScalar); }
0208 
0209   //! Divides all the coefficients of the matrix by Scalar
0210   [[nodiscard]] constexpr gp_Mat Divided(const double theScalar) const;
0211 
0212   [[nodiscard]] constexpr gp_Mat operator/(const double theScalar) const
0213   {
0214     return Divided(theScalar);
0215   }
0216 
0217   Standard_EXPORT void Invert();
0218 
0219   //! Inverses the matrix and raises if the matrix is singular.
0220   //! -   Invert assigns the result to this matrix, while
0221   //! -   Inverted creates a new one.
0222   //! Warning
0223   //! The Gauss LU decomposition is used to invert the matrix.
0224   //! Consequently, the matrix is considered as singular if the
0225   //! largest pivot found is less than or equal to gp::Resolution().
0226   //! Exceptions
0227   //! Standard_ConstructionError if this matrix is singular,
0228   //! and therefore cannot be inverted.
0229   [[nodiscard]] Standard_EXPORT gp_Mat Inverted() const;
0230 
0231   //! Computes the product of two matrices <me> * <Other>
0232   [[nodiscard]] constexpr gp_Mat Multiplied(const gp_Mat& theOther) const noexcept
0233   {
0234     gp_Mat aNewMat = *this;
0235     aNewMat.Multiply(theOther);
0236     return aNewMat;
0237   }
0238 
0239   [[nodiscard]] constexpr gp_Mat operator*(const gp_Mat& theOther) const noexcept
0240   {
0241     return Multiplied(theOther);
0242   }
0243 
0244   //! Computes the product of two matrices <me> = <Other> * <me>.
0245   constexpr void Multiply(const gp_Mat& theOther) noexcept;
0246 
0247   constexpr void operator*=(const gp_Mat& theOther) noexcept { Multiply(theOther); }
0248 
0249   constexpr void PreMultiply(const gp_Mat& theOther) noexcept;
0250 
0251   [[nodiscard]] constexpr gp_Mat Multiplied(const double theScalar) const noexcept;
0252 
0253   [[nodiscard]] constexpr gp_Mat operator*(const double theScalar) const noexcept
0254   {
0255     return Multiplied(theScalar);
0256   }
0257 
0258   //! Multiplies all the coefficients of the matrix by Scalar
0259   constexpr void Multiply(const double theScalar) noexcept;
0260 
0261   constexpr void operator*=(const double theScalar) noexcept { Multiply(theScalar); }
0262 
0263   Standard_EXPORT void Power(const int N);
0264 
0265   //! Computes <me> = <me> * <me> * .......* <me>, theN time.
0266   //! if theN = 0 <me> = Identity
0267   //! if theN < 0 <me> = <me>.Invert() *...........* <me>.Invert().
0268   //! If theN < 0 an exception will be raised if the matrix is not
0269   //! inversible
0270   [[nodiscard]] gp_Mat Powered(const int theN) const
0271   {
0272     gp_Mat aMatN = *this;
0273     aMatN.Power(theN);
0274     return aMatN;
0275   }
0276 
0277   constexpr void Subtract(const gp_Mat& theOther) noexcept;
0278 
0279   constexpr void operator-=(const gp_Mat& theOther) noexcept { Subtract(theOther); }
0280 
0281   //! cOmputes for each coefficient of the matrix :
0282   //! <me>.Coef(i,j) - <theOther>.Coef(i,j)
0283   [[nodiscard]] constexpr gp_Mat Subtracted(const gp_Mat& theOther) const noexcept;
0284 
0285   [[nodiscard]] constexpr gp_Mat operator-(const gp_Mat& theOther) const noexcept
0286   {
0287     return Subtracted(theOther);
0288   }
0289 
0290   void Transpose();
0291 
0292   //! Transposes the matrix. A(j, i) -> A (i, j)
0293   [[nodiscard]] gp_Mat Transposed() const
0294   {
0295     gp_Mat aNewMat = *this;
0296     aNewMat.Transpose();
0297     return aNewMat;
0298   }
0299 
0300   //! Dumps the content of me into the stream
0301   Standard_EXPORT void DumpJson(Standard_OStream& theOStream, int theDepth = -1) const;
0302 
0303   friend class gp_XYZ;
0304   friend class gp_Trsf;
0305   friend class gp_GTrsf;
0306 
0307 private:
0308   double myMat[3][3];
0309 };
0310 
0311 //=================================================================================================
0312 
0313 inline constexpr gp_Mat::gp_Mat(const double theA11,
0314                                 const double theA12,
0315                                 const double theA13,
0316                                 const double theA21,
0317                                 const double theA22,
0318                                 const double theA23,
0319                                 const double theA31,
0320                                 const double theA32,
0321                                 const double theA33) noexcept
0322     : myMat{{theA11, theA12, theA13}, {theA21, theA22, theA23}, {theA31, theA32, theA33}}
0323 {
0324 }
0325 
0326 //=================================================================================================
0327 
0328 inline constexpr void gp_Mat::Add(const gp_Mat& theOther) noexcept
0329 {
0330   myMat[0][0] += theOther.myMat[0][0];
0331   myMat[0][1] += theOther.myMat[0][1];
0332   myMat[0][2] += theOther.myMat[0][2];
0333   myMat[1][0] += theOther.myMat[1][0];
0334   myMat[1][1] += theOther.myMat[1][1];
0335   myMat[1][2] += theOther.myMat[1][2];
0336   myMat[2][0] += theOther.myMat[2][0];
0337   myMat[2][1] += theOther.myMat[2][1];
0338   myMat[2][2] += theOther.myMat[2][2];
0339 }
0340 
0341 //=================================================================================================
0342 
0343 inline constexpr gp_Mat gp_Mat::Added(const gp_Mat& theOther) const noexcept
0344 {
0345   gp_Mat aNewMat(*this);
0346   aNewMat.Add(theOther);
0347   return aNewMat;
0348 }
0349 
0350 //=================================================================================================
0351 
0352 inline constexpr void gp_Mat::Divide(const double theScalar)
0353 {
0354   Standard_ConstructionError_Raise_if((theScalar < 0.0 ? -theScalar : theScalar)
0355                                         <= gp::Resolution(),
0356                                       "gp_Mat : Divide by 0");
0357   const double anUnSurScalar = 1.0 / theScalar;
0358   myMat[0][0] *= anUnSurScalar;
0359   myMat[0][1] *= anUnSurScalar;
0360   myMat[0][2] *= anUnSurScalar;
0361   myMat[1][0] *= anUnSurScalar;
0362   myMat[1][1] *= anUnSurScalar;
0363   myMat[1][2] *= anUnSurScalar;
0364   myMat[2][0] *= anUnSurScalar;
0365   myMat[2][1] *= anUnSurScalar;
0366   myMat[2][2] *= anUnSurScalar;
0367 }
0368 
0369 //=================================================================================================
0370 
0371 inline constexpr gp_Mat gp_Mat::Divided(const double theScalar) const
0372 {
0373   gp_Mat aNewMat(*this);
0374   aNewMat.Divide(theScalar);
0375   return aNewMat;
0376 }
0377 
0378 //=================================================================================================
0379 
0380 inline constexpr void gp_Mat::Multiply(const gp_Mat& theOther) noexcept
0381 {
0382   const double aT00 = myMat[0][0] * theOther.myMat[0][0] + myMat[0][1] * theOther.myMat[1][0]
0383                       + myMat[0][2] * theOther.myMat[2][0];
0384   const double aT01 = myMat[0][0] * theOther.myMat[0][1] + myMat[0][1] * theOther.myMat[1][1]
0385                       + myMat[0][2] * theOther.myMat[2][1];
0386   const double aT02 = myMat[0][0] * theOther.myMat[0][2] + myMat[0][1] * theOther.myMat[1][2]
0387                       + myMat[0][2] * theOther.myMat[2][2];
0388   const double aT10 = myMat[1][0] * theOther.myMat[0][0] + myMat[1][1] * theOther.myMat[1][0]
0389                       + myMat[1][2] * theOther.myMat[2][0];
0390   const double aT11 = myMat[1][0] * theOther.myMat[0][1] + myMat[1][1] * theOther.myMat[1][1]
0391                       + myMat[1][2] * theOther.myMat[2][1];
0392   const double aT12 = myMat[1][0] * theOther.myMat[0][2] + myMat[1][1] * theOther.myMat[1][2]
0393                       + myMat[1][2] * theOther.myMat[2][2];
0394   const double aT20 = myMat[2][0] * theOther.myMat[0][0] + myMat[2][1] * theOther.myMat[1][0]
0395                       + myMat[2][2] * theOther.myMat[2][0];
0396   const double aT21 = myMat[2][0] * theOther.myMat[0][1] + myMat[2][1] * theOther.myMat[1][1]
0397                       + myMat[2][2] * theOther.myMat[2][1];
0398   const double aT22 = myMat[2][0] * theOther.myMat[0][2] + myMat[2][1] * theOther.myMat[1][2]
0399                       + myMat[2][2] * theOther.myMat[2][2];
0400   myMat[0][0] = aT00;
0401   myMat[0][1] = aT01;
0402   myMat[0][2] = aT02;
0403   myMat[1][0] = aT10;
0404   myMat[1][1] = aT11;
0405   myMat[1][2] = aT12;
0406   myMat[2][0] = aT20;
0407   myMat[2][1] = aT21;
0408   myMat[2][2] = aT22;
0409 }
0410 
0411 //=================================================================================================
0412 
0413 inline constexpr void gp_Mat::PreMultiply(const gp_Mat& theOther) noexcept
0414 {
0415   const double aT00 = theOther.myMat[0][0] * myMat[0][0] + theOther.myMat[0][1] * myMat[1][0]
0416                       + theOther.myMat[0][2] * myMat[2][0];
0417   const double aT01 = theOther.myMat[0][0] * myMat[0][1] + theOther.myMat[0][1] * myMat[1][1]
0418                       + theOther.myMat[0][2] * myMat[2][1];
0419   const double aT02 = theOther.myMat[0][0] * myMat[0][2] + theOther.myMat[0][1] * myMat[1][2]
0420                       + theOther.myMat[0][2] * myMat[2][2];
0421   const double aT10 = theOther.myMat[1][0] * myMat[0][0] + theOther.myMat[1][1] * myMat[1][0]
0422                       + theOther.myMat[1][2] * myMat[2][0];
0423   const double aT11 = theOther.myMat[1][0] * myMat[0][1] + theOther.myMat[1][1] * myMat[1][1]
0424                       + theOther.myMat[1][2] * myMat[2][1];
0425   const double aT12 = theOther.myMat[1][0] * myMat[0][2] + theOther.myMat[1][1] * myMat[1][2]
0426                       + theOther.myMat[1][2] * myMat[2][2];
0427   const double aT20 = theOther.myMat[2][0] * myMat[0][0] + theOther.myMat[2][1] * myMat[1][0]
0428                       + theOther.myMat[2][2] * myMat[2][0];
0429   const double aT21 = theOther.myMat[2][0] * myMat[0][1] + theOther.myMat[2][1] * myMat[1][1]
0430                       + theOther.myMat[2][2] * myMat[2][1];
0431   const double aT22 = theOther.myMat[2][0] * myMat[0][2] + theOther.myMat[2][1] * myMat[1][2]
0432                       + theOther.myMat[2][2] * myMat[2][2];
0433   myMat[0][0] = aT00;
0434   myMat[0][1] = aT01;
0435   myMat[0][2] = aT02;
0436   myMat[1][0] = aT10;
0437   myMat[1][1] = aT11;
0438   myMat[1][2] = aT12;
0439   myMat[2][0] = aT20;
0440   myMat[2][1] = aT21;
0441   myMat[2][2] = aT22;
0442 }
0443 
0444 //=================================================================================================
0445 
0446 inline constexpr gp_Mat gp_Mat::Multiplied(const double theScalar) const noexcept
0447 {
0448   gp_Mat aNewMat(*this);
0449   aNewMat.Multiply(theScalar);
0450   return aNewMat;
0451 }
0452 
0453 //=================================================================================================
0454 
0455 inline constexpr void gp_Mat::Multiply(const double theScalar) noexcept
0456 {
0457   myMat[0][0] *= theScalar;
0458   myMat[0][1] *= theScalar;
0459   myMat[0][2] *= theScalar;
0460   myMat[1][0] *= theScalar;
0461   myMat[1][1] *= theScalar;
0462   myMat[1][2] *= theScalar;
0463   myMat[2][0] *= theScalar;
0464   myMat[2][1] *= theScalar;
0465   myMat[2][2] *= theScalar;
0466 }
0467 
0468 //=================================================================================================
0469 
0470 inline constexpr void gp_Mat::Subtract(const gp_Mat& theOther) noexcept
0471 {
0472   myMat[0][0] -= theOther.myMat[0][0];
0473   myMat[0][1] -= theOther.myMat[0][1];
0474   myMat[0][2] -= theOther.myMat[0][2];
0475   myMat[1][0] -= theOther.myMat[1][0];
0476   myMat[1][1] -= theOther.myMat[1][1];
0477   myMat[1][2] -= theOther.myMat[1][2];
0478   myMat[2][0] -= theOther.myMat[2][0];
0479   myMat[2][1] -= theOther.myMat[2][1];
0480   myMat[2][2] -= theOther.myMat[2][2];
0481 }
0482 
0483 //=================================================================================================
0484 
0485 inline constexpr gp_Mat gp_Mat::Subtracted(const gp_Mat& theOther) const noexcept
0486 {
0487   gp_Mat aNewMat(*this);
0488   aNewMat.Subtract(theOther);
0489   return aNewMat;
0490 }
0491 
0492 //=================================================================================================
0493 
0494 // On macOS 10.13.6 with XCode 9.4.1 the compiler has a bug leading to
0495 // generation of invalid code when method gp_Mat::Transpose() is called
0496 // for a matrix which is when applied to vector; it looks like vector
0497 // is transformed before the matrix is actually transposed; see #29978.
0498 // To avoid this, we disable compiler optimization here.
0499 #if defined(__APPLE__) && (__apple_build_version__ > 9020000)
0500 __attribute__((optnone))
0501 #endif
0502 inline void
0503   gp_Mat::Transpose()
0504 {
0505   std::swap(myMat[0][1], myMat[1][0]);
0506   std::swap(myMat[0][2], myMat[2][0]);
0507   std::swap(myMat[1][2], myMat[2][1]);
0508 }
0509 
0510 //=======================================================================
0511 // function : operator*
0512 // purpose :
0513 //=======================================================================
0514 inline constexpr gp_Mat operator*(const double theScalar, const gp_Mat& theMat3D) noexcept
0515 {
0516   return theMat3D.Multiplied(theScalar);
0517 }
0518 
0519 #endif // _gp_Mat_HeaderFile