// 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 inline gp_Cone::gp_Cone () : radius (RealLast()), semiAngle (M_PI * 0.25) { } inline gp_Cone::gp_Cone (const gp_Ax3& A3, const Standard_Real Ang, const Standard_Real Radius) : pos(A3), radius (Radius), semiAngle (Ang) { Standard_Real val = Ang; if (val < 0) val = - val; Standard_ConstructionError_Raise_if (radius < 0. || val <= gp::Resolution() || M_PI * 0.5 - val <= gp::Resolution(), "gp_Cone() - invalid construction parameters"); } inline void gp_Cone::SetAxis (const gp_Ax1& A1) { pos.SetAxis (A1); } inline void gp_Cone::SetLocation (const gp_Pnt& Loc) { pos.SetLocation (Loc); } inline void gp_Cone::SetPosition (const gp_Ax3& A3) { pos = A3; } inline void gp_Cone::SetRadius (const Standard_Real R) { Standard_ConstructionError_Raise_if (R < 0.0, "gp_Cone::SetRadius() - radius should be positive number"); radius = R; } inline void gp_Cone::SetSemiAngle (const Standard_Real Ang) { Standard_Real val = Ang; if (val < 0) val = - val; Standard_ConstructionError_Raise_if (val <= gp::Resolution() || M_PI * 0.5 - val <= gp::Resolution(), "gp_Cone::SetSemiAngle() - invalid angle range"); semiAngle = Ang; } inline gp_Pnt gp_Cone::Apex () const { gp_XYZ Coord = pos.Direction ().XYZ (); Coord.Multiply (-radius / Tan (semiAngle)); Coord.Add (pos.Location ().XYZ()); return gp_Pnt (Coord); } inline void gp_Cone::UReverse() { pos.YReverse(); } inline void gp_Cone::VReverse() { pos.ZReverse(); semiAngle = -semiAngle; } inline Standard_Boolean gp_Cone::Direct() const { return pos.Direct(); } inline const gp_Ax1& gp_Cone::Axis () const { return pos.Axis(); } inline const gp_Pnt& gp_Cone::Location () const { return pos.Location(); } inline const gp_Ax3& gp_Cone::Position () const { return pos; } inline Standard_Real gp_Cone::RefRadius () const { return radius; } inline Standard_Real gp_Cone::SemiAngle () const { return semiAngle; } inline gp_Ax1 gp_Cone::XAxis () const { return gp_Ax1 (pos.Location(), pos.XDirection()); } inline gp_Ax1 gp_Cone::YAxis () const { return gp_Ax1 (pos.Location(), pos.YDirection()); } inline void gp_Cone::Rotate (const gp_Ax1& A1, const Standard_Real Ang) {pos.Rotate (A1, Ang);} inline gp_Cone gp_Cone::Rotated (const gp_Ax1& A1, const Standard_Real Ang) const { gp_Cone C = *this; C.pos.Rotate (A1, Ang); return C; } inline void gp_Cone::Scale (const gp_Pnt& P, const Standard_Real S) { pos.Scale (P, S); radius *= S; if (radius < 0) radius = - radius; } inline gp_Cone gp_Cone::Scaled (const gp_Pnt& P, const Standard_Real S) const { gp_Cone C = *this; C.pos.Scale (P, S); C.radius *= S; if (C.radius < 0) C.radius = - C.radius; return C; } inline void gp_Cone::Transform (const gp_Trsf& T) { pos.Transform (T); radius *= T.ScaleFactor(); if (radius < 0) radius = - radius; } inline gp_Cone gp_Cone::Transformed (const gp_Trsf& T) const { gp_Cone C = *this; C.pos.Transform (T); C.radius *= T.ScaleFactor(); if (C.radius < 0) C.radius = - C.radius; return C; } inline void gp_Cone::Translate (const gp_Vec& V) { pos.Translate (V); } inline gp_Cone gp_Cone::Translated (const gp_Vec& V) const { gp_Cone C = *this; C.pos.Translate (V); return C; } inline void gp_Cone::Translate (const gp_Pnt& P1, const gp_Pnt& P2) { pos.Translate (P1, P2); } inline gp_Cone gp_Cone::Translated (const gp_Pnt& P1, const gp_Pnt& P2) const { gp_Cone C = *this; C.pos.Translate (P1, P2); return C; }