// 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 introduction classe XY dans le package gp #include #include #include #include #include inline gp_Dir2d::gp_Dir2d() : coord (1.,0.) { } inline gp_Dir2d::gp_Dir2d (const gp_Vec2d& V) { const gp_XY& XY = V.XY(); Standard_Real X = XY.X(); Standard_Real Y = XY.Y(); Standard_Real D = sqrt(X * X + Y * Y); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d() - input vector has zero norm"); coord.SetX(X / D); coord.SetY(Y / D); } inline gp_Dir2d::gp_Dir2d (const gp_XY& XY) { Standard_Real X = XY.X(); Standard_Real Y = XY.Y(); Standard_Real D = sqrt(X * X + Y * Y); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d() - input vector has zero norm"); coord.SetX(X / D); coord.SetY(Y / D); } inline gp_Dir2d::gp_Dir2d (const Standard_Real Xv, const Standard_Real Yv) { Standard_Real D = sqrt (Xv * Xv + Yv * Yv); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d() - input vector has zero norm"); coord.SetX(Xv / D); coord.SetY(Yv / D); } inline void gp_Dir2d::SetCoord (const Standard_Integer Index, const Standard_Real Xi) { Standard_Real X = coord.X(); Standard_Real Y = coord.Y(); Standard_OutOfRange_Raise_if (Index < 1 || Index > 2, "gp_Dir2d::SetCoord() - index is out of range [1, 2]"); if (Index == 1) X = Xi; else Y = Xi; Standard_Real D = sqrt (X * X + Y * Y); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d::SetCoord() - result vector has zero norm"); coord.SetX(X / D); coord.SetY(Y / D); } inline void gp_Dir2d::SetCoord (const Standard_Real Xv, const Standard_Real Yv) { Standard_Real D = sqrt (Xv * Xv + Yv * Yv); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d::SetCoord() - result vector has zero norm"); coord.SetX(Xv / D); coord.SetY(Yv / D); } inline void gp_Dir2d::SetX (const Standard_Real X) { Standard_Real Y = coord.Y(); Standard_Real D = sqrt (X * X + Y * Y); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d::SetX() - result vector has zero norm"); coord.SetX(X / D); coord.SetY(Y / D); } inline void gp_Dir2d::SetY (const Standard_Real Y) { Standard_Real X = coord.X(); Standard_Real D = sqrt (X * X + Y * Y); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d::SetY() - result vector has zero norm"); coord.SetX(X / D); coord.SetY(Y / D); } inline void gp_Dir2d::SetXY (const gp_XY& XY) { Standard_Real X = XY.X(); Standard_Real Y = XY.Y(); Standard_Real D = sqrt(X * X + Y * Y); Standard_ConstructionError_Raise_if (D <= gp::Resolution(), "gp_Dir2d::SetZ() - result vector has zero norm"); coord.SetX(X / D); coord.SetY(Y / D); } inline Standard_Real gp_Dir2d::Coord (const Standard_Integer Index) const { return coord.Coord(Index); } inline void gp_Dir2d::Coord(Standard_Real& Xv, Standard_Real& Yv) const { coord.Coord (Xv, Yv); } inline Standard_Real gp_Dir2d::X() const { return coord.X() ; } inline Standard_Real gp_Dir2d::Y() const { return coord.Y() ; } inline const gp_XY& gp_Dir2d::XY () const { return coord; } inline Standard_Boolean gp_Dir2d::IsEqual (const gp_Dir2d& Other, const Standard_Real AngularTolerance) const { Standard_Real Ang = Angle(Other); if (Ang < 0) Ang = - Ang; return Ang <= AngularTolerance; } inline Standard_Boolean gp_Dir2d::IsNormal (const gp_Dir2d& Other, const Standard_Real AngularTolerance) const { Standard_Real Ang = Angle(Other); if (Ang < 0) Ang = - Ang; Ang = M_PI / 2.0 - Ang; if (Ang < 0) Ang = - Ang; return Ang <= AngularTolerance; } inline Standard_Boolean gp_Dir2d::IsOpposite (const gp_Dir2d& 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_Dir2d::IsParallel (const gp_Dir2d& 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_Dir2d::Crossed (const gp_Dir2d& Right) const { return coord.Crossed (Right.coord); } inline Standard_Real gp_Dir2d::Dot (const gp_Dir2d& Other) const { return coord.Dot (Other.coord); } inline void gp_Dir2d::Reverse() { coord.Reverse(); } inline gp_Dir2d gp_Dir2d::Reversed() const { gp_Dir2d V = *this; V.coord.Reverse (); return V; } inline void gp_Dir2d::Rotate (const Standard_Real Ang) { gp_Trsf2d T; T.SetRotation (gp_Pnt2d (0.0, 0.0), Ang); coord.Multiply (T.HVectorialPart()); } inline gp_Dir2d gp_Dir2d::Rotated (const Standard_Real Ang) const { gp_Dir2d V = *this; V.Rotate (Ang); return V; } inline gp_Dir2d gp_Dir2d::Transformed (const gp_Trsf2d& T) const { gp_Dir2d V = *this; V.Transform (T); return V; }