0dad11cbce0552774129a833d66fb8f02ba74bcd
[occt.git] / src / gp / gp_Trsf2d.lxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
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.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <gp_Trsf.hxx>
16 #include <gp_Pnt2d.hxx>
17
18 inline gp_Trsf2d::gp_Trsf2d () {
19   shape = gp_Identity;
20   scale = 1.0;
21   matrix.SetIdentity ();
22   loc.SetCoord (0.0, 0.0);
23 }
24
25 inline gp_Trsf2d::gp_Trsf2d (const gp_Trsf& T) :
26 scale(T.ScaleFactor()),
27 shape(T.Form()),
28 loc(T.TranslationPart().X(),T.TranslationPart().Y())
29 {
30   const gp_Mat& M = T.HVectorialPart();
31   matrix(1,1) = M(1,1);
32   matrix(1,2) = M(1,2);
33   matrix(2,1) = M(2,1);
34   matrix(2,2) = M(2,2);
35 }
36
37 inline void gp_Trsf2d::SetMirror(const gp_Pnt2d& P)
38 {   
39   shape = gp_PntMirror;
40   scale = -1.0;
41   matrix.SetIdentity ();
42   loc = P.XY();
43   loc.Multiply (2.0);
44 }
45
46 inline void gp_Trsf2d::SetRotation (const gp_Pnt2d& P,
47                                     const Standard_Real Ang)
48 {
49   shape = gp_Rotation;
50   scale = 1.0;
51   loc = P.XY ();
52   loc.Reverse ();
53   matrix.SetRotation (Ang);
54   loc.Multiply (matrix);
55   loc.Add (P.XY());
56 }
57
58 inline void gp_Trsf2d::SetScale (const gp_Pnt2d& P,
59                                  const Standard_Real S)
60 {
61   shape = gp_Scale;
62   scale = S;
63   matrix.SetIdentity ();
64   loc = P.XY ();
65   loc.Multiply (1.0 - S);
66 }
67
68 inline void gp_Trsf2d::SetTranslation(const gp_Vec2d& V)
69 {
70   shape = gp_Translation;
71   scale = 1.0;
72   matrix.SetIdentity ();
73   loc = V.XY ();
74 }
75
76 inline void gp_Trsf2d::SetTranslation (const gp_Pnt2d& P1,
77                                        const gp_Pnt2d& P2)
78 {
79   shape = gp_Translation;
80   scale = 1.0;
81   matrix.SetIdentity ();
82   loc = (P2.XY()).Subtracted (P1.XY());
83 }
84
85 inline Standard_Boolean gp_Trsf2d::IsNegative() const
86 { return (matrix.Determinant() < 0.0); }
87
88 inline const gp_XY& gp_Trsf2d::TranslationPart () const
89 { return loc; }
90
91 inline const gp_Mat2d& gp_Trsf2d::HVectorialPart () const
92 { return matrix; }
93
94 inline Standard_Real gp_Trsf2d::Value (const Standard_Integer Row,
95                                        const Standard_Integer Col) const
96 {
97   Standard_OutOfRange_Raise_if
98     (Row < 1 || Row > 2 || Col < 1 || Col > 3, " ");
99   if (Col < 3) return scale * matrix.Value (Row, Col);
100   else         return loc.Coord (Row);
101 }
102
103 inline gp_TrsfForm gp_Trsf2d::Form() const
104 { return shape; }
105
106 inline Standard_Real gp_Trsf2d::ScaleFactor() const
107 { return scale; }
108
109 inline gp_Trsf2d gp_Trsf2d::Inverted() const
110
111   gp_Trsf2d T = *this;
112   T.Invert();
113   return T;
114 }
115
116 inline gp_Trsf2d gp_Trsf2d::Multiplied (const gp_Trsf2d& T) const {
117   gp_Trsf2d Tresult(*this);
118   Tresult.Multiply(T);
119   return Tresult;
120 }
121
122 inline gp_Trsf2d gp_Trsf2d::Powered (const Standard_Integer N)
123 {
124   gp_Trsf2d T = *this;
125   T.Power (N);
126   return T;
127 }
128
129 inline void gp_Trsf2d::Transforms (Standard_Real& X,
130                                    Standard_Real& Y) const
131 {
132   gp_XY Doublet (X, Y);
133   Doublet.Multiply (matrix);
134   if (scale != 1.0) Doublet.Multiply (scale);
135   Doublet.Add(loc);
136   Doublet.Coord (X, Y);
137 }
138
139 inline void gp_Trsf2d::Transforms (gp_XY& Coord) const
140 {
141   Coord.Multiply (matrix);
142   if (scale != 1.0) Coord.Multiply (scale);
143   Coord.Add(loc);
144 }
145