// 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. // Modified by skv - Fri Apr 8 10:28:10 2005 OCC8559 #include #include inline gp_Elips::gp_Elips () : majorRadius (RealLast()), minorRadius (RealSmall()) { } inline gp_Elips::gp_Elips (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 < MinorRadius, "gp_Elips() - invalid construction parameters"); } inline Standard_Real gp_Elips::Area() const { return M_PI * majorRadius * minorRadius; } inline Standard_Real gp_Elips::MajorRadius() const { return majorRadius; } inline Standard_Real gp_Elips::MinorRadius() const { return minorRadius; } inline Standard_Real gp_Elips::Parameter() const { if (majorRadius == 0.0) return 0.0; else return (minorRadius * minorRadius) / majorRadius; } inline const gp_Ax2& gp_Elips::Position() const { return pos; } inline const gp_Ax1& gp_Elips::Axis () const { return pos.Axis(); } inline gp_Ax1 gp_Elips::Directrix1() const { Standard_Real E = Eccentricity(); Standard_ConstructionError_Raise_if (E <= gp::Resolution(), "gp_Elips::Directrix1() - zero 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_Elips::Directrix2() const { Standard_Real E = Eccentricity(); Standard_ConstructionError_Raise_if (E <= gp::Resolution(), "gp_Elips::Directrix2() - zero 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_Elips::Eccentricity() const { if (majorRadius == 0.0) { return 0.0; } else { return sqrt(majorRadius * majorRadius - minorRadius * minorRadius) / majorRadius; } } inline Standard_Real gp_Elips::Focal() const { return 2.0 * sqrt(majorRadius * majorRadius - minorRadius * minorRadius); } inline gp_Pnt gp_Elips::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_Elips::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_Elips::Location () const { return pos.Location(); } inline gp_Ax1 gp_Elips::XAxis () const { return gp_Ax1 (pos.Location(), pos.XDirection()); } inline gp_Ax1 gp_Elips::YAxis () const { return gp_Ax1 (pos.Location(), pos.YDirection()); } inline void gp_Elips::SetAxis (const gp_Ax1& A1) { pos.SetAxis(A1); } inline void gp_Elips::SetPosition (const gp_Ax2& A2) { pos = A2; } inline void gp_Elips::SetLocation (const gp_Pnt& P) { pos.SetLocation (P); } inline void gp_Elips::SetMajorRadius (const Standard_Real R) { Standard_ConstructionError_Raise_if (R < minorRadius, "gp_Elips::SetMajorRadius() - major radius should be greater or equal to minor radius"); majorRadius = R; } inline void gp_Elips::SetMinorRadius (const Standard_Real R) { Standard_ConstructionError_Raise_if (R < 0.0 || majorRadius < R, "gp_Elips::SetMinorRadius() - minor radius should be a positive number lesser or equal to major radius"); minorRadius = R; } inline void gp_Elips::Rotate (const gp_Ax1& A1, const Standard_Real Ang) { pos.Rotate(A1, Ang); } inline gp_Elips gp_Elips::Rotated (const gp_Ax1& A1, const Standard_Real Ang) const { gp_Elips E = *this; E.pos.Rotate(A1, Ang); return E; } inline void gp_Elips::Scale (const gp_Pnt& P, const Standard_Real S) // Modified by skv - Fri Apr 8 10:28:10 2005 OCC8559 Begin // { pos.Scale(P, S); } { majorRadius *= S; if (majorRadius < 0) majorRadius = - majorRadius; minorRadius *= S; if (minorRadius < 0) minorRadius = - minorRadius; pos.Scale(P, S); } // Modified by skv - Fri Apr 8 10:28:10 2005 OCC8559 End inline gp_Elips gp_Elips::Scaled (const gp_Pnt& P, const Standard_Real S) const { gp_Elips E = *this; E.majorRadius *= S; if (E.majorRadius < 0) E.majorRadius = - E.majorRadius; E.minorRadius *= S; if (E.minorRadius < 0) E.minorRadius = - E.minorRadius; E.pos.Scale(P, S); return E; } inline void gp_Elips::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_Elips gp_Elips::Transformed (const gp_Trsf& T) const { gp_Elips E = *this; E.majorRadius *= T.ScaleFactor(); if (E.majorRadius < 0) E.majorRadius = - E.majorRadius; E.minorRadius *= T.ScaleFactor(); if (E.minorRadius < 0) E.minorRadius = - E.minorRadius; E.pos.Transform(T); return E; } inline void gp_Elips::Translate (const gp_Vec& V) { pos.Translate(V); } inline gp_Elips gp_Elips::Translated (const gp_Vec& V) const { gp_Elips E = *this; E.pos.Translate(V); return E; } inline void gp_Elips::Translate (const gp_Pnt& P1, const gp_Pnt& P2) { pos.Translate(P1, P2); } inline gp_Elips gp_Elips::Translated (const gp_Pnt& P1, const gp_Pnt& P2) const { gp_Elips E = *this; E.pos.Translate(P1, P2); return E; }