// Copyright (c) 1995-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include inline gp_GTrsf::gp_GTrsf () { shape = gp_Identity; matrix.SetScale (1.0); loc.SetCoord (0.0, 0.0, 0.0); scale = 1.0; } inline gp_GTrsf::gp_GTrsf (const gp_Trsf& T) { shape = T.Form(); matrix = T.matrix; loc = T.TranslationPart(); scale = T.ScaleFactor(); } inline gp_GTrsf::gp_GTrsf (const gp_Mat& M, const gp_XYZ& V) : matrix(M), loc(V) { shape = gp_Other; scale = 0.0; } inline void gp_GTrsf::SetAffinity (const gp_Ax1& A1, const Standard_Real Ratio) { shape = gp_Other; scale = 0.0; matrix.SetDot (A1.Direction().XYZ()); matrix.Multiply (1.0 - Ratio); matrix.SetDiagonal (matrix.Value (1,1) + Ratio, matrix.Value (2,2) + Ratio, matrix.Value (3,3) + Ratio); loc = A1.Location().XYZ(); loc.Reverse (); loc.Multiply (matrix); loc.Add (A1.Location().XYZ()); } //======================================================================= //function : SetAffinity //history : AGV 2-05-06: Correct the implementation //======================================================================= inline void gp_GTrsf::SetAffinity (const gp_Ax2& A2, const Standard_Real Ratio) { shape = gp_Other; scale = 0.0; matrix.SetDot (A2.Direction().XYZ()); matrix.Multiply (Ratio - 1.); loc = A2.Location().XYZ(); loc.Reverse (); loc.Multiply (matrix); matrix.SetDiagonal (matrix.Value (1,1) +1., matrix.Value (2,2) +1., matrix.Value (3,3) +1.); } inline void gp_GTrsf::SetValue (const Standard_Integer Row, const Standard_Integer Col, const Standard_Real Value) { Standard_OutOfRange_Raise_if (Row < 1 || Row > 3 || Col < 1 || Col > 4, " "); if (Col == 4) { loc.SetCoord (Row, Value); if (shape == gp_Identity) shape = gp_Translation; return; } else { if (!(shape == gp_Other) && !(scale == 1.0)) matrix.Multiply (scale); matrix.SetValue (Row, Col, Value); shape = gp_Other; scale = 0.0; return; } } inline void gp_GTrsf::SetVectorialPart (const gp_Mat& Matrix) { matrix = Matrix; shape = gp_Other; scale = 0.0; } inline void gp_GTrsf::SetTrsf (const gp_Trsf& T) { shape = T.shape; matrix = T.matrix; loc = T.loc; scale = T.scale; } inline Standard_Boolean gp_GTrsf::IsNegative () const { return matrix.Determinant() < 0.0; } inline Standard_Boolean gp_GTrsf::IsSingular () const { return matrix.IsSingular(); } inline gp_TrsfForm gp_GTrsf::Form () const { return shape; } inline const gp_XYZ& gp_GTrsf::TranslationPart () const { return loc; } inline const gp_Mat& gp_GTrsf::VectorialPart () const { return matrix; } inline Standard_Real gp_GTrsf::Value (const Standard_Integer Row, const Standard_Integer Col) const { Standard_OutOfRange_Raise_if (Row < 1 || Row > 3 || Col < 1 || Col > 4, " "); if (Col == 4) return loc.Coord (Row); if (shape == gp_Other) return matrix.Value (Row, Col); return scale * matrix.Value (Row, Col); } inline gp_GTrsf gp_GTrsf::Inverted () const { gp_GTrsf T = *this; T.Invert (); return T; } inline gp_GTrsf gp_GTrsf::Multiplied (const gp_GTrsf& T) const { gp_GTrsf Tres = *this; Tres.Multiply (T); return Tres; } inline gp_GTrsf gp_GTrsf::Powered (const Standard_Integer N) const { gp_GTrsf T = *this; T.Power (N); return T; } inline void gp_GTrsf::Transforms (gp_XYZ& Coord) const { Coord.Multiply (matrix); if (!(shape == gp_Other) && !(scale == 1.0)) Coord.Multiply (scale); Coord.Add(loc); } inline void gp_GTrsf::Transforms (Standard_Real& X, Standard_Real& Y, Standard_Real& Z) const { gp_XYZ Triplet (X, Y, Z); Triplet.Multiply (matrix); if (!(shape == gp_Other) && !(scale == 1.0)) Triplet.Multiply (scale); Triplet.Add(loc); Triplet.Coord (X, Y, Z); } inline gp_Trsf gp_GTrsf::Trsf () const { if ( Form() == gp_Other ) throw Standard_ConstructionError("gp_GTrsf::Trsf() - non-orthogonal GTrsf"); gp_Trsf T; T.shape = shape; T.scale = scale; T.matrix = matrix; T.loc = loc; return T; }