// 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. // Modif JCV 08/01/91 modifs suite a la deuxieme revue de projet // et introduction des classes XY, Mat2d + nouveau operateurs #include #include #include inline gp_Vec2d::gp_Vec2d() {} inline gp_Vec2d::gp_Vec2d (const gp_Dir2d& V) { coord = V.XY(); } inline gp_Vec2d::gp_Vec2d (const gp_XY& Coord) : coord(Coord) {} inline gp_Vec2d::gp_Vec2d (const Standard_Real Xv, const Standard_Real Yv) : coord (Xv, Yv) { } inline gp_Vec2d::gp_Vec2d (const gp_Pnt2d& P1, const gp_Pnt2d& P2) { coord = P2.XY().Subtracted (P1.XY()); } inline void gp_Vec2d::SetCoord (const Standard_Integer Index, const Standard_Real Xi) { coord.SetCoord (Index, Xi); } inline void gp_Vec2d::SetCoord (const Standard_Real Xv, const Standard_Real Yv) { coord.SetCoord (Xv, Yv); } inline void gp_Vec2d::SetX (const Standard_Real X) { coord.SetX (X); } inline void gp_Vec2d::SetY (const Standard_Real Y) { coord.SetY (Y); } inline void gp_Vec2d::SetXY (const gp_XY& Coord) { coord = Coord; } inline Standard_Real gp_Vec2d::Coord (const Standard_Integer Index) const { return coord.Coord(Index); } inline void gp_Vec2d::Coord(Standard_Real& Xv, Standard_Real& Yv) const { coord.Coord(Xv, Yv); } inline Standard_Real gp_Vec2d::X() const { return coord.X(); } inline Standard_Real gp_Vec2d::Y() const { return coord.Y(); } inline const gp_XY& gp_Vec2d::XY () const { return coord; } inline Standard_Boolean gp_Vec2d::IsNormal (const gp_Vec2d& theOther, const Standard_Real theAngularTolerance) const { const Standard_Real anAng = Abs(M_PI_2 - Abs(Angle(theOther))); return !(anAng > theAngularTolerance); } inline Standard_Boolean gp_Vec2d::IsOpposite (const gp_Vec2d& Other, const Standard_Real AngularTolerance) const { Standard_Real Ang = Angle(Other); if (Ang < 0) Ang = - Ang; return M_PI - Ang <= AngularTolerance; } inline Standard_Boolean gp_Vec2d::IsParallel (const gp_Vec2d& Other, const Standard_Real AngularTolerance) const { Standard_Real Ang = Angle(Other); if (Ang < 0) Ang = - Ang; return Ang <= AngularTolerance || M_PI - Ang <= AngularTolerance; } inline Standard_Real gp_Vec2d::Magnitude() const { return coord.Modulus(); } inline Standard_Real gp_Vec2d::SquareMagnitude() const { return coord.SquareModulus(); } inline void gp_Vec2d::Add (const gp_Vec2d& Other) { coord.Add (Other.coord); } inline gp_Vec2d gp_Vec2d::Added (const gp_Vec2d& Other) const { gp_Vec2d V = *this; V.coord.Add (Other.coord); return V; } inline Standard_Real gp_Vec2d::Crossed (const gp_Vec2d& Right) const { return coord.Crossed (Right.coord); } inline Standard_Real gp_Vec2d::CrossMagnitude (const gp_Vec2d& Right) const { return coord.CrossMagnitude (Right.coord); } inline Standard_Real gp_Vec2d::CrossSquareMagnitude (const gp_Vec2d& Right) const { return coord.CrossSquareMagnitude (Right.coord); } inline void gp_Vec2d::Divide (const Standard_Real Scalar) { coord.Divide (Scalar); } inline gp_Vec2d gp_Vec2d::Divided (const Standard_Real Scalar) const { gp_Vec2d V = *this; V.coord.Divide(Scalar); return V; } inline Standard_Real gp_Vec2d::Dot (const gp_Vec2d& Other) const { return coord.Dot (Other.coord); } inline void gp_Vec2d::Multiply (const Standard_Real Scalar) { coord.Multiply (Scalar); } inline gp_Vec2d gp_Vec2d::Multiplied (const Standard_Real Scalar) const { gp_Vec2d V = *this; V.coord.Multiply(Scalar); return V; } inline void gp_Vec2d::Normalize() { Standard_Real D = coord.Modulus(); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Vec2d::Normalize() - vector has zero norm"); coord.Divide (D); } inline gp_Vec2d gp_Vec2d::Normalized() const { Standard_Real D = coord.Modulus(); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Vec2d::Normalized() - vector has zero norm"); gp_Vec2d V = *this; V.coord.Divide (D); return V; } inline void gp_Vec2d::Reverse() { coord.Reverse(); } inline gp_Vec2d gp_Vec2d::Reversed() const { gp_Vec2d V = *this; V.coord.Reverse(); return V; } inline void gp_Vec2d::Subtract (const gp_Vec2d& Right) { coord.Subtract (Right.coord); } inline gp_Vec2d gp_Vec2d::Subtracted (const gp_Vec2d& Right) const { gp_Vec2d V = *this; V.coord.Subtract (Right.coord); return V; } inline void gp_Vec2d::SetLinearForm (const Standard_Real L, const gp_Vec2d& Left, const Standard_Real R, const gp_Vec2d& Right) { coord.SetLinearForm (L, Left.coord, R, Right.coord); } inline void gp_Vec2d::SetLinearForm (const Standard_Real L, const gp_Vec2d& Left, const gp_Vec2d& Right) { coord.SetLinearForm (L, Left.coord, Right.coord); } inline void gp_Vec2d::SetLinearForm (const gp_Vec2d& Left, const gp_Vec2d& Right) { coord.SetLinearForm (Left.coord, Right.coord); } inline void gp_Vec2d::SetLinearForm (const Standard_Real A1, const gp_Vec2d& V1, const Standard_Real A2, const gp_Vec2d& V2, const gp_Vec2d& V3) { coord.SetLinearForm (A1, V1.coord, A2, V2.coord, V3.coord); } inline void gp_Vec2d::Rotate (const Standard_Real Ang) { gp_Trsf2d T; T.SetRotation (gp_Pnt2d (0.0, 0.0), Ang); coord.Multiply (T.VectorialPart ()); } inline gp_Vec2d gp_Vec2d::Rotated (const Standard_Real Ang) const { gp_Vec2d V = *this; V.Rotate (Ang); return V; } inline void gp_Vec2d::Scale (const Standard_Real S) { coord.Multiply (S); } inline gp_Vec2d gp_Vec2d::Scaled (const Standard_Real S) const { gp_Vec2d V = *this; V.coord.Multiply (S); return V; } inline gp_Vec2d gp_Vec2d::Transformed (const gp_Trsf2d& T) const { gp_Vec2d V = *this; V.Transform(T); return V; } inline gp_Vec2d operator* (const Standard_Real Scalar, const gp_Vec2d& V) { return V.Multiplied(Scalar); } inline gp_Vec2d gp_Vec2d::GetNormal() const { return gp_Vec2d(this->Y(), (-1)*this->X()); }