// 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. #include #include #include inline gp_Hypr::gp_Hypr () : majorRadius(RealLast()), minorRadius(RealFirst()) { } inline gp_Hypr::gp_Hypr (const gp_Ax2& A2, const Standard_Real MajorRadius, const Standard_Real MinorRadius): pos(A2), majorRadius(MajorRadius), minorRadius(MinorRadius) { Standard_ConstructionError_Raise_if (MinorRadius < 0.0 || MajorRadius < 0.0,""); } inline void gp_Hypr::SetAxis (const gp_Ax1& A1) { pos.SetAxis (A1); } inline void gp_Hypr::SetLocation (const gp_Pnt& P) { pos = gp_Ax2 (P, pos.Direction(), pos.XDirection()); } inline void gp_Hypr::SetMajorRadius (const Standard_Real R) { Standard_ConstructionError_Raise_if(R < 0.0,""); majorRadius = R; } inline void gp_Hypr::SetMinorRadius (const Standard_Real R) { Standard_ConstructionError_Raise_if(R < 0.0,""); minorRadius = R; } inline void gp_Hypr::SetPosition (const gp_Ax2& A2) { pos = A2; } inline gp_Ax1 gp_Hypr::Asymptote1 () const { Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), ""); gp_Vec V1 = gp_Vec (pos.YDirection()); V1.Multiply (minorRadius / majorRadius); gp_Vec V = gp_Vec (pos.XDirection()); V.Add (V1); return gp_Ax1(pos.Location(), gp_Dir(V)); } inline gp_Ax1 gp_Hypr::Asymptote2 () const { Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), ""); gp_Vec V1 = gp_Vec (pos.YDirection()); V1.Multiply (-minorRadius / majorRadius); gp_Vec V = gp_Vec (pos.XDirection()); V.Add (V1); return gp_Ax1( pos.Location(), gp_Dir(V)); } inline const gp_Ax1& gp_Hypr::Axis () const { return pos.Axis(); } inline gp_Hypr gp_Hypr::ConjugateBranch1 () const { return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), pos.YDirection()), minorRadius, majorRadius); } inline gp_Hypr gp_Hypr::ConjugateBranch2 () const { gp_Dir D = pos.YDirection(); D.Reverse (); return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), D), minorRadius, majorRadius); } inline gp_Ax1 gp_Hypr::Directrix1 () const { Standard_Real E = Eccentricity(); gp_XYZ Orig = pos.XDirection().XYZ(); Orig.Multiply (majorRadius/E); Orig.Add (pos.Location().XYZ()); return gp_Ax1 (gp_Pnt(Orig), pos.YDirection()); } inline gp_Ax1 gp_Hypr::Directrix2 () const { Standard_Real E = Eccentricity(); gp_XYZ Orig = pos.XDirection().XYZ(); Orig.Multiply (-majorRadius/E); Orig.Add (pos.Location().XYZ()); return gp_Ax1 (gp_Pnt(Orig), pos.YDirection()); } inline Standard_Real gp_Hypr::Eccentricity () const { Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), ""); return sqrt(majorRadius * majorRadius + minorRadius * minorRadius) / majorRadius; } inline Standard_Real gp_Hypr::Focal () const { return 2.0 * sqrt(majorRadius * majorRadius + minorRadius * minorRadius); } inline gp_Pnt gp_Hypr::Focus1 () const { Standard_Real C = sqrt(majorRadius * majorRadius + minorRadius * minorRadius); const gp_Pnt& PP = pos.Location (); const gp_Dir& DD = pos.XDirection(); return gp_Pnt (PP.X() + C * DD.X(), PP.Y() + C * DD.Y(), PP.Z() + C * DD.Z()); } inline gp_Pnt gp_Hypr::Focus2 () const { Standard_Real C = sqrt(majorRadius * majorRadius + minorRadius * minorRadius); const gp_Pnt& PP = pos.Location (); const gp_Dir& DD = pos.XDirection(); return gp_Pnt (PP.X() - C * DD.X(), PP.Y() - C * DD.Y(), PP.Z() - C * DD.Z()); } inline const gp_Pnt& gp_Hypr::Location () const { return pos.Location(); } inline Standard_Real gp_Hypr::MajorRadius() const { return majorRadius; } inline Standard_Real gp_Hypr::MinorRadius() const { return minorRadius; } inline gp_Hypr gp_Hypr::OtherBranch () const { gp_Dir D = pos.XDirection (); D.Reverse (); return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), D), majorRadius, minorRadius); } inline Standard_Real gp_Hypr::Parameter() const { Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), ""); return (minorRadius * minorRadius) / majorRadius; } inline const gp_Ax2& gp_Hypr::Position() const { return pos; } inline gp_Ax1 gp_Hypr::XAxis () const {return gp_Ax1 (pos.Location(), pos.XDirection());} inline gp_Ax1 gp_Hypr::YAxis () const {return gp_Ax1 (pos.Location(), pos.YDirection());} inline void gp_Hypr::Rotate (const gp_Ax1& A1, const Standard_Real Ang) { pos.Rotate(A1, Ang); } inline gp_Hypr gp_Hypr::Rotated (const gp_Ax1& A1, const Standard_Real Ang) const { gp_Hypr H = *this; H.pos.Rotate(A1, Ang); return H; } inline void gp_Hypr::Scale (const gp_Pnt& 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_Hypr gp_Hypr::Scaled (const gp_Pnt& P, const Standard_Real S) const { gp_Hypr 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_Hypr::Transform (const gp_Trsf& T) { majorRadius *= T.ScaleFactor(); if (majorRadius < 0) majorRadius = - majorRadius; minorRadius *= T.ScaleFactor(); if (minorRadius < 0) minorRadius = - minorRadius; pos.Transform(T); } inline gp_Hypr gp_Hypr::Transformed (const gp_Trsf& T) const { gp_Hypr 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_Hypr::Translate (const gp_Vec& V) { pos.Translate(V); } inline gp_Hypr gp_Hypr::Translated (const gp_Vec& V) const { gp_Hypr H = *this; H.pos.Translate(V); return H; } inline void gp_Hypr::Translate (const gp_Pnt& P1, const gp_Pnt& P2) {pos.Translate(P1,P2);} inline gp_Hypr gp_Hypr::Translated (const gp_Pnt& P1, const gp_Pnt& P2) const { gp_Hypr H = *this; H.pos.Translate(P1, P2); return H; }