// 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. // LPA et JCV 07/92 mise a jour des methodes inline pour passage sur C1 #include #include #include inline gp_Hypr2d::gp_Hypr2d () : majorRadius(RealLast()), minorRadius(RealLast()) { } inline gp_Hypr2d::gp_Hypr2d (const gp_Ax22d& A, const Standard_Real MajorRadius, const Standard_Real MinorRadius) : pos(A), majorRadius(MajorRadius), minorRadius(MinorRadius) { Standard_ConstructionError_Raise_if (MinorRadius < 0.0 || MajorRadius < 0.0, "gp_Hypr2d() - invalid construction parameters"); } inline gp_Hypr2d::gp_Hypr2d (const gp_Ax2d& MajorAxis, const Standard_Real MajorRadius, const Standard_Real MinorRadius, const Standard_Boolean Sense) : majorRadius(MajorRadius), minorRadius(MinorRadius) { pos = gp_Ax22d(MajorAxis,Sense); Standard_ConstructionError_Raise_if (MinorRadius < 0.0 || MajorRadius < 0.0, "gp_Hypr2d() - invalid construction parameters"); } inline void gp_Hypr2d::SetLocation (const gp_Pnt2d& P) { pos.SetLocation (P); } inline void gp_Hypr2d::SetMajorRadius (const Standard_Real MajorRadius) { Standard_ConstructionError_Raise_if (MajorRadius < 0.0, "gp_Hypr2d::SetMajorRadius() - major radius should be greater or equal zero"); majorRadius = MajorRadius; } inline void gp_Hypr2d::SetMinorRadius (const Standard_Real MinorRadius) { Standard_ConstructionError_Raise_if (MinorRadius < 0.0, "gp_Hypr2d::SetMinorRadius() - minor radius should be greater or equal zero"); minorRadius = MinorRadius; } inline void gp_Hypr2d::SetAxis (const gp_Ax22d& A) { pos.SetAxis(A); } inline void gp_Hypr2d::SetXAxis (const gp_Ax2d& A) { pos.SetXAxis(A); } inline void gp_Hypr2d::SetYAxis (const gp_Ax2d& A) { pos.SetYAxis(A); } inline gp_Ax2d gp_Hypr2d::Asymptote1() const { Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), "gp_Hypr2d::Asymptote1() - major radius is zero"); gp_Dir2d Vdir = pos.XDirection(); gp_XY Coord1 (pos.YDirection().XY()); gp_XY Coord2 = Coord1.Multiplied (minorRadius / majorRadius); Coord1.Add (Coord2); Vdir.SetXY (Coord1); return gp_Ax2d (pos.Location(), Vdir); } inline gp_Ax2d gp_Hypr2d::Asymptote2() const { Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), "gp_Hypr2d::Asymptote2() - major radius is zero"); gp_Vec2d Vdir = pos.XDirection(); gp_XY Coord1 (pos.YDirection().XY()); gp_XY Coord2 = Coord1.Multiplied (-minorRadius / majorRadius); Coord1.Add (Coord2); Vdir.SetXY (Coord1); return gp_Ax2d (pos.Location(), Vdir); } inline gp_Hypr2d gp_Hypr2d::ConjugateBranch1() const { gp_Dir2d V (pos.YDirection()); Standard_Boolean sign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; return gp_Hypr2d (gp_Ax2d (pos.Location(),V), minorRadius, majorRadius,sign); } inline gp_Hypr2d gp_Hypr2d::ConjugateBranch2() const { gp_Dir2d V (pos.YDirection().Reversed()); Standard_Boolean sign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; return gp_Hypr2d (gp_Ax2d(pos.Location(),V),minorRadius, majorRadius,sign); } inline gp_Ax2d gp_Hypr2d::Directrix1() const { Standard_Real E = Eccentricity(); gp_XY Orig = pos.XDirection().XY(); Orig.Multiply (majorRadius/E); Orig.Add (pos.Location().XY()); return gp_Ax2d (gp_Pnt2d(Orig),gp_Dir2d (pos.YDirection())); } inline gp_Ax2d gp_Hypr2d::Directrix2() const { Standard_Real E = Eccentricity(); gp_XY Orig = pos.XDirection().XY(); Orig.Multiply (Parameter()/E); Orig.Add (Focus1().XY()); return gp_Ax2d (gp_Pnt2d(Orig),gp_Dir2d (pos.YDirection())); } inline Standard_Real gp_Hypr2d::Eccentricity() const { Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "gp_Hypr2d::Eccentricity() - major radius is zero"); return sqrt(majorRadius * majorRadius + minorRadius * minorRadius) / majorRadius; } inline Standard_Real gp_Hypr2d::Focal() const { return 2.0 * sqrt (majorRadius * majorRadius + minorRadius * minorRadius); } inline gp_Pnt2d gp_Hypr2d::Focus1() const { Standard_Real C = sqrt (majorRadius * majorRadius + minorRadius * minorRadius); return gp_Pnt2d (pos.Location().X() + C * pos.XDirection().X(), pos.Location().Y() + C * pos.XDirection().Y()); } inline gp_Pnt2d gp_Hypr2d::Focus2() const { Standard_Real C = sqrt (majorRadius * majorRadius + minorRadius * minorRadius); return gp_Pnt2d (pos.Location().X() - C * pos.XDirection().X(), pos.Location().Y() - C * pos.XDirection().Y()); } inline const gp_Pnt2d& gp_Hypr2d::Location () const { return pos.Location(); } inline Standard_Real gp_Hypr2d::MajorRadius() const { return majorRadius; } inline Standard_Real gp_Hypr2d::MinorRadius() const { return minorRadius; } inline gp_Hypr2d gp_Hypr2d::OtherBranch() const { Standard_Boolean sign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; return gp_Hypr2d (gp_Ax2d (pos.Location(),pos.XDirection().Reversed()), majorRadius,minorRadius,sign); } inline Standard_Real gp_Hypr2d::Parameter() const { Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "gp_Hypr2d::Parameter() - major radius is zero"); return (minorRadius * minorRadius) / majorRadius; } inline const gp_Ax22d& gp_Hypr2d::Axis () const { return pos; } inline gp_Ax2d gp_Hypr2d::XAxis () const { return pos.XAxis(); } inline gp_Ax2d gp_Hypr2d::YAxis () const { return pos.YAxis(); } inline void gp_Hypr2d::Reverse() { gp_Dir2d Temp = pos.YDirection (); Temp.Reverse (); pos.SetAxis(gp_Ax22d(pos.Location(),pos.XDirection(),Temp)); } inline gp_Hypr2d gp_Hypr2d::Reversed() const { gp_Hypr2d H = *this; gp_Dir2d Temp = pos.YDirection (); Temp.Reverse (); H.pos.SetAxis(gp_Ax22d(pos.Location(),pos.XDirection(),Temp)); return H; } inline Standard_Boolean gp_Hypr2d::IsDirect() const { return (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; } inline void gp_Hypr2d::Rotate (const gp_Pnt2d& P, const Standard_Real Ang) {pos.Rotate (P,Ang);} inline gp_Hypr2d gp_Hypr2d::Rotated (const gp_Pnt2d& P, const Standard_Real Ang) const { gp_Hypr2d H = *this; H.pos.Rotate (P, Ang); return H; } inline void gp_Hypr2d::Scale (const gp_Pnt2d& P, const Standard_Real S) { majorRadius *= S; if (majorRadius < 0) majorRadius = - majorRadius; minorRadius *= S; if (minorRadius < 0) minorRadius = - minorRadius; pos.Scale(P, S); } inline gp_Hypr2d gp_Hypr2d::Scaled (const gp_Pnt2d& P, const Standard_Real S) const { gp_Hypr2d H = *this; H.majorRadius *= S; if (H.majorRadius < 0) H.majorRadius = - H.majorRadius; H.minorRadius *= S; if (H.minorRadius < 0) H.minorRadius = - H.minorRadius; H.pos.Scale(P, S); return H; } inline void gp_Hypr2d::Transform (const gp_Trsf2d& T) { majorRadius *= T.ScaleFactor(); if (majorRadius < 0) majorRadius = - majorRadius; minorRadius *= T.ScaleFactor(); if (minorRadius < 0) minorRadius = - minorRadius; pos.Transform(T); } inline gp_Hypr2d gp_Hypr2d::Transformed (const gp_Trsf2d& T) const { gp_Hypr2d H = *this; H.majorRadius *= T.ScaleFactor(); if (H.majorRadius < 0) H.majorRadius = - H.majorRadius; H.minorRadius *= T.ScaleFactor(); if (H.minorRadius < 0) H.minorRadius = - H.minorRadius; H.pos.Transform(T); return H; } inline void gp_Hypr2d::Translate (const gp_Vec2d& V) { pos.Translate(V); } inline gp_Hypr2d gp_Hypr2d::Translated (const gp_Vec2d& V) const { gp_Hypr2d H = *this; H.pos.Translate(V); return H; } inline void gp_Hypr2d::Translate (const gp_Pnt2d& P1, const gp_Pnt2d& P2) { pos.Translate(P1, P2); } inline gp_Hypr2d gp_Hypr2d::Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const { gp_Hypr2d H = *this; H.pos.Translate(P1, P2); return H; }