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.
15 // Modif JCV 08/01/91 modifs suite a la deuxieme revue de projet
16 // et introduction des classes XY, Mat2d + nouveau operateurs
18 #include <gp_Dir2d.hxx>
19 #include <gp_Trsf2d.hxx>
20 #include <gp_Pnt2d.hxx>
22 inline gp_Vec2d::gp_Vec2d()
25 inline gp_Vec2d::gp_Vec2d (const gp_Dir2d& V)
28 inline gp_Vec2d::gp_Vec2d (const gp_XY& Coord) : coord(Coord)
31 inline gp_Vec2d::gp_Vec2d (const Standard_Real Xv,
32 const Standard_Real Yv) : coord (Xv, Yv)
35 inline gp_Vec2d::gp_Vec2d (const gp_Pnt2d& P1,
37 { coord = P2.XY().Subtracted (P1.XY()); }
39 inline void gp_Vec2d::SetCoord (const Standard_Integer Index,
40 const Standard_Real Xi)
41 { coord.SetCoord (Index, Xi); }
43 inline void gp_Vec2d::SetCoord (const Standard_Real Xv,
44 const Standard_Real Yv)
45 { coord.SetCoord (Xv, Yv); }
47 inline void gp_Vec2d::SetX (const Standard_Real X)
50 inline void gp_Vec2d::SetY (const Standard_Real Y)
53 inline void gp_Vec2d::SetXY (const gp_XY& Coord)
56 inline Standard_Real gp_Vec2d::Coord (const Standard_Integer Index) const
57 { return coord.Coord(Index); }
59 inline void gp_Vec2d::Coord(Standard_Real& Xv,
60 Standard_Real& Yv) const
61 { coord.Coord(Xv, Yv); }
63 inline Standard_Real gp_Vec2d::X() const
66 inline Standard_Real gp_Vec2d::Y() const
69 inline const gp_XY& gp_Vec2d::XY () const
72 inline Standard_Boolean gp_Vec2d::IsNormal
73 (const gp_Vec2d& theOther,
74 const Standard_Real theAngularTolerance) const
76 const Standard_Real anAng = Abs(M_PI_2 - Abs(Angle(theOther)));
77 return !(anAng > theAngularTolerance);
80 inline Standard_Boolean gp_Vec2d::IsOpposite
81 (const gp_Vec2d& Other,
82 const Standard_Real AngularTolerance) const
84 Standard_Real Ang = Angle(Other);
85 if (Ang < 0) Ang = - Ang;
86 return M_PI - Ang <= AngularTolerance;
89 inline Standard_Boolean gp_Vec2d::IsParallel
90 (const gp_Vec2d& Other,
91 const Standard_Real AngularTolerance) const
93 Standard_Real Ang = Angle(Other);
94 if (Ang < 0) Ang = - Ang;
95 return Ang <= AngularTolerance || M_PI - Ang <= AngularTolerance;
98 inline Standard_Real gp_Vec2d::Magnitude() const
99 { return coord.Modulus(); }
101 inline Standard_Real gp_Vec2d::SquareMagnitude() const
102 { return coord.SquareModulus(); }
104 inline void gp_Vec2d::Add (const gp_Vec2d& Other)
105 { coord.Add (Other.coord); }
107 inline gp_Vec2d gp_Vec2d::Added (const gp_Vec2d& Other) const
110 V.coord.Add (Other.coord);
114 inline Standard_Real gp_Vec2d::Crossed (const gp_Vec2d& Right) const
115 { return coord.Crossed (Right.coord); }
117 inline Standard_Real gp_Vec2d::CrossMagnitude (const gp_Vec2d& Right) const
118 { return coord.CrossMagnitude (Right.coord); }
120 inline Standard_Real gp_Vec2d::CrossSquareMagnitude
121 (const gp_Vec2d& Right) const
122 { return coord.CrossSquareMagnitude (Right.coord); }
124 inline void gp_Vec2d::Divide (const Standard_Real Scalar)
125 { coord.Divide (Scalar); }
127 inline gp_Vec2d gp_Vec2d::Divided (const Standard_Real Scalar) const
130 V.coord.Divide(Scalar);
134 inline Standard_Real gp_Vec2d::Dot (const gp_Vec2d& Other) const
135 { return coord.Dot (Other.coord); }
137 inline void gp_Vec2d::Multiply (const Standard_Real Scalar)
138 { coord.Multiply (Scalar); }
140 inline gp_Vec2d gp_Vec2d::Multiplied (const Standard_Real Scalar) const
143 V.coord.Multiply(Scalar);
147 inline void gp_Vec2d::Normalize()
149 Standard_Real D = coord.Modulus();
150 Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "");
154 inline gp_Vec2d gp_Vec2d::Normalized() const
156 Standard_Real D = coord.Modulus();
157 Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "");
163 inline void gp_Vec2d::Reverse()
166 inline gp_Vec2d gp_Vec2d::Reversed() const
173 inline void gp_Vec2d::Subtract (const gp_Vec2d& Right)
174 { coord.Subtract (Right.coord); }
176 inline gp_Vec2d gp_Vec2d::Subtracted (const gp_Vec2d& Right) const
179 V.coord.Subtract (Right.coord);
183 inline void gp_Vec2d::SetLinearForm (const Standard_Real L,
184 const gp_Vec2d& Left,
185 const Standard_Real R,
186 const gp_Vec2d& Right)
187 { coord.SetLinearForm (L, Left.coord, R, Right.coord); }
189 inline void gp_Vec2d::SetLinearForm (const Standard_Real L,
190 const gp_Vec2d& Left,
191 const gp_Vec2d& Right)
192 { coord.SetLinearForm (L, Left.coord, Right.coord); }
194 inline void gp_Vec2d::SetLinearForm (const gp_Vec2d& Left,
195 const gp_Vec2d& Right)
196 { coord.SetLinearForm (Left.coord, Right.coord); }
198 inline void gp_Vec2d::SetLinearForm (const Standard_Real A1,
200 const Standard_Real A2,
203 { coord.SetLinearForm (A1, V1.coord, A2, V2.coord, V3.coord); }
205 inline void gp_Vec2d::Rotate (const Standard_Real Ang)
208 T.SetRotation (gp_Pnt2d (0.0, 0.0), Ang);
209 coord.Multiply (T.VectorialPart ());
212 inline gp_Vec2d gp_Vec2d::Rotated (const Standard_Real Ang) const
219 inline void gp_Vec2d::Scale (const Standard_Real S)
220 { coord.Multiply (S); }
222 inline gp_Vec2d gp_Vec2d::Scaled (const Standard_Real S) const
225 V.coord.Multiply (S);
229 inline gp_Vec2d gp_Vec2d::Transformed (const gp_Trsf2d& T) const
236 inline gp_Vec2d operator* (const Standard_Real Scalar,
238 { return V.Multiplied(Scalar); }
240 inline gp_Vec2d gp_Vec2d::GetNormal() const
242 return gp_Vec2d(this->Y(), (-1)*this->X());