mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-21 10:13:43 +03:00
250 lines
7.2 KiB
Plaintext
250 lines
7.2 KiB
Plaintext
// 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 <gp_Trsf2d.hxx>
|
|
#include <gp.hxx>
|
|
#include <Standard_ConstructionError.hxx>
|
|
|
|
inline gp_Elips2d::gp_Elips2d() :
|
|
majorRadius(RealLast()),
|
|
minorRadius(RealSmall())
|
|
{ }
|
|
|
|
inline gp_Elips2d::gp_Elips2d (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 < MinorRadius,
|
|
"gp_Elips2d() - invalid construction parameters");
|
|
}
|
|
|
|
inline gp_Elips2d::gp_Elips2d (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 < MinorRadius,
|
|
"gp_Elips2d() - invalid construction parameters");
|
|
}
|
|
|
|
inline void gp_Elips2d::SetLocation (const gp_Pnt2d& P)
|
|
{ pos.SetLocation(P);}
|
|
|
|
inline void gp_Elips2d::SetMajorRadius (const Standard_Real MajorRadius)
|
|
{
|
|
Standard_ConstructionError_Raise_if (MajorRadius < minorRadius,
|
|
"gp_Elips2d::SetMajorRadius() - major radius should be greater or equal to minor radius");
|
|
majorRadius = MajorRadius;
|
|
}
|
|
|
|
inline void gp_Elips2d::SetMinorRadius (const Standard_Real MinorRadius)
|
|
{
|
|
Standard_ConstructionError_Raise_if (MinorRadius < 0.0 || majorRadius < MinorRadius,
|
|
"gp_Elips2d::SetMinorRadius() - minor radius should be a positive number lesser or equal to major radius");
|
|
minorRadius = MinorRadius;
|
|
}
|
|
|
|
inline void gp_Elips2d::SetXAxis (const gp_Ax2d& A)
|
|
{ pos.SetXAxis(A); }
|
|
|
|
inline void gp_Elips2d::SetAxis (const gp_Ax22d& A)
|
|
{ pos.SetAxis(A); }
|
|
|
|
inline void gp_Elips2d::SetYAxis (const gp_Ax2d& A)
|
|
{ pos.SetYAxis(A); }
|
|
|
|
inline Standard_Real gp_Elips2d::Area() const
|
|
{ return M_PI * majorRadius * minorRadius; }
|
|
|
|
inline gp_Ax2d gp_Elips2d::Directrix1() const
|
|
{
|
|
Standard_Real E = Eccentricity();
|
|
Standard_ConstructionError_Raise_if (E <= gp::Resolution(), "gp_Elips2d::Directrix1() - zero 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_Elips2d::Directrix2() const
|
|
{
|
|
Standard_Real E = Eccentricity();
|
|
Standard_ConstructionError_Raise_if (E <= gp::Resolution(), "gp_Elips2d::Directrix2() - zero 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 Standard_Real gp_Elips2d::Eccentricity() const
|
|
{
|
|
if (majorRadius == 0.0) { return 0.0; }
|
|
else {
|
|
return sqrt(majorRadius * majorRadius -
|
|
minorRadius * minorRadius) / majorRadius;
|
|
}
|
|
}
|
|
|
|
inline Standard_Real gp_Elips2d::Focal() const
|
|
{
|
|
return 2.0 * sqrt(majorRadius * majorRadius -
|
|
minorRadius * minorRadius);
|
|
}
|
|
|
|
inline gp_Pnt2d gp_Elips2d::Focus1() const
|
|
{
|
|
Standard_Real C = sqrt(majorRadius * majorRadius -
|
|
minorRadius * minorRadius);
|
|
const gp_Pnt2d& PP = pos.Location ();
|
|
const gp_Dir2d& DD = pos.XDirection();
|
|
return gp_Pnt2d (PP.X() + C * DD.X(),
|
|
PP.Y() + C * DD.Y());
|
|
}
|
|
|
|
inline gp_Pnt2d gp_Elips2d::Focus2() const
|
|
{
|
|
Standard_Real C = sqrt (majorRadius * majorRadius -
|
|
minorRadius * minorRadius);
|
|
const gp_Pnt2d& PP = pos.Location ();
|
|
const gp_Dir2d& DD = pos.XDirection();
|
|
return gp_Pnt2d (PP.X() - C * DD.X(),
|
|
PP.Y() - C * DD.Y());
|
|
}
|
|
|
|
inline const gp_Pnt2d& gp_Elips2d::Location () const
|
|
{ return pos.Location(); }
|
|
|
|
inline Standard_Real gp_Elips2d::MajorRadius() const
|
|
{ return majorRadius; }
|
|
|
|
inline Standard_Real gp_Elips2d::MinorRadius() const
|
|
{ return minorRadius; }
|
|
|
|
inline Standard_Real gp_Elips2d::Parameter () const
|
|
{
|
|
if (majorRadius == 0.0) return 0.0;
|
|
else return (minorRadius * minorRadius) / majorRadius;
|
|
}
|
|
|
|
inline const gp_Ax22d& gp_Elips2d::Axis () const
|
|
{ return pos; }
|
|
|
|
inline gp_Ax2d gp_Elips2d::YAxis () const
|
|
{ return pos.YAxis(); }
|
|
|
|
inline gp_Ax2d gp_Elips2d::XAxis () const
|
|
{ return pos.XAxis(); }
|
|
|
|
inline void gp_Elips2d::Reverse()
|
|
{
|
|
gp_Dir2d Temp = pos.YDirection ();
|
|
Temp.Reverse ();
|
|
pos.SetAxis(gp_Ax22d(pos.Location(),pos.XDirection(),Temp));
|
|
}
|
|
|
|
inline gp_Elips2d gp_Elips2d::Reversed() const
|
|
{
|
|
gp_Elips2d E = *this;
|
|
gp_Dir2d Temp = pos.YDirection ();
|
|
Temp.Reverse ();
|
|
E.pos.SetAxis(gp_Ax22d(pos.Location(),pos.XDirection(),Temp));
|
|
return E;
|
|
}
|
|
|
|
inline Standard_Boolean gp_Elips2d::IsDirect() const
|
|
{ return (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; }
|
|
|
|
inline void gp_Elips2d::Rotate (const gp_Pnt2d& P,
|
|
const Standard_Real Ang)
|
|
{ pos.Rotate (P, Ang); }
|
|
|
|
inline gp_Elips2d gp_Elips2d::Rotated (const gp_Pnt2d& P,
|
|
const Standard_Real Ang) const
|
|
{
|
|
gp_Elips2d E = *this;
|
|
E.pos.Rotate (P, Ang);
|
|
return E;
|
|
}
|
|
|
|
inline void gp_Elips2d::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_Elips2d gp_Elips2d::Scaled (const gp_Pnt2d& P,
|
|
const Standard_Real S) const
|
|
{
|
|
gp_Elips2d 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_Elips2d::Transform(const gp_Trsf2d& T)
|
|
{
|
|
Standard_Real TSca = T.ScaleFactor();
|
|
if(TSca<0.0) TSca=-TSca;
|
|
majorRadius *= TSca;
|
|
minorRadius *= TSca;
|
|
pos.Transform(T);
|
|
}
|
|
|
|
inline gp_Elips2d gp_Elips2d::Transformed (const gp_Trsf2d& T) const
|
|
{
|
|
gp_Elips2d 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_Elips2d::Translate (const gp_Vec2d& V)
|
|
{ pos.Translate(V); }
|
|
|
|
inline gp_Elips2d gp_Elips2d::Translated (const gp_Vec2d& V) const
|
|
{
|
|
gp_Elips2d E = *this;
|
|
E.pos.Translate(V);
|
|
return E;
|
|
}
|
|
|
|
inline void gp_Elips2d::Translate (const gp_Pnt2d& P1,
|
|
const gp_Pnt2d& P2)
|
|
{ pos.Translate(P1, P2); }
|
|
|
|
inline gp_Elips2d gp_Elips2d::Translated (const gp_Pnt2d& P1,
|
|
const gp_Pnt2d& P2) const
|
|
{
|
|
gp_Elips2d E = *this;
|
|
E.pos.Translate(P1, P2);
|
|
return E;
|
|
}
|
|
|