Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-10 09:16:52

0001 // Copyright (c) 1991-1999 Matra Datavision
0002 // Copyright (c) 1999-2014 OPEN CASCADE SAS
0003 //
0004 // This file is part of Open CASCADE Technology software library.
0005 //
0006 // This library is free software; you can redistribute it and/or modify it under
0007 // the terms of the GNU Lesser General Public License version 2.1 as published
0008 // by the Free Software Foundation, with special exception defined in the file
0009 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0010 // distribution for complete text of the license and disclaimer of any warranty.
0011 //
0012 // Alternatively, this file may be used under the terms of Open CASCADE
0013 // commercial license or contractual agreement.
0014 
0015 #ifndef _gp_Hypr2d_HeaderFile
0016 #define _gp_Hypr2d_HeaderFile
0017 
0018 #include <gp.hxx>
0019 #include <gp_Ax22d.hxx>
0020 #include <gp_Ax2d.hxx>
0021 #include <gp_Pnt2d.hxx>
0022 #include <Standard_DomainError.hxx>
0023 #include <Standard_ConstructionError.hxx>
0024 
0025 //! Describes a branch of a hyperbola in the plane (2D space).
0026 //! A hyperbola is defined by its major and minor radii, and
0027 //! positioned in the plane with a coordinate system (a
0028 //! gp_Ax22d object) of which:
0029 //! -   the origin is the center of the hyperbola,
0030 //! -   the "X Direction" defines the major axis of the hyperbola, and
0031 //! -   the "Y Direction" defines the minor axis of the hyperbola.
0032 //! This coordinate system is the "local coordinate system"
0033 //! of the hyperbola. The orientation of this coordinate
0034 //! system (direct or indirect) gives an implicit orientation to
0035 //! the hyperbola. In this coordinate system, the equation of
0036 //! the hyperbola is:
0037 //! X*X/(MajorRadius**2)-Y*Y/(MinorRadius**2) = 1.0
0038 //! The branch of the hyperbola described is the one located
0039 //! on the positive side of the major axis.
0040 //! The following schema shows the plane of the hyperbola,
0041 //! and in it, the respective positions of the three branches of
0042 //! hyperbolas constructed with the functions OtherBranch,
0043 //! ConjugateBranch1, and ConjugateBranch2:
0044 //! @code
0045 //! ^YAxis
0046 //! |
0047 //! FirstConjugateBranch
0048 //! |
0049 //! Other            |                Main
0050 //! --------------------- C ------------------------------>XAxis
0051 //! Branch           |                Branch
0052 //! |
0053 //! |
0054 //! SecondConjugateBranch
0055 //! |
0056 //! @endcode
0057 //! Warning
0058 //! The major radius can be less than the minor radius.
0059 //! See Also
0060 //! gce_MakeHypr2d which provides functions for more
0061 //! complex hyperbola constructions
0062 //! Geom2d_Hyperbola which provides additional functions
0063 //! for constructing hyperbolas and works, in particular, with
0064 //! the parametric equations of hyperbolas
0065 class gp_Hypr2d
0066 {
0067 public:
0068   DEFINE_STANDARD_ALLOC
0069 
0070   //! Creates of an indefinite hyperbola.
0071   gp_Hypr2d()
0072       : majorRadius(RealLast()),
0073         minorRadius(RealLast())
0074   {
0075   }
0076 
0077   //! Creates a hyperbola with radii theMajorRadius and
0078   //! theMinorRadius, centered on the origin of theMajorAxis
0079   //! and where the unit vector of theMajorAxis is the "X
0080   //! Direction" of the local coordinate system of the
0081   //! hyperbola. This coordinate system is direct if theIsSense
0082   //! is true (the default value), and indirect if theIsSense is false.
0083   //! Warnings :
0084   //! It is yet  possible to create an Hyperbola with
0085   //! theMajorRadius <= theMinorRadius.
0086   //! Raises ConstructionError if theMajorRadius < 0.0 or theMinorRadius < 0.0
0087   gp_Hypr2d(const gp_Ax2d&         theMajorAxis,
0088             const Standard_Real    theMajorRadius,
0089             const Standard_Real    theMinorRadius,
0090             const Standard_Boolean theIsSense = Standard_True)
0091       : majorRadius(theMajorRadius),
0092         minorRadius(theMinorRadius)
0093   {
0094     pos = gp_Ax22d(theMajorAxis, theIsSense);
0095     Standard_ConstructionError_Raise_if(theMinorRadius < 0.0 || theMajorRadius < 0.0,
0096                                         "gp_Hypr2d() - invalid construction parameters");
0097   }
0098 
0099   //! a hyperbola with radii theMajorRadius and
0100   //! theMinorRadius, positioned in the plane by coordinate system theA where:
0101   //! -   the origin of theA is the center of the hyperbola,
0102   //! -   the "X Direction" of theA defines the major axis of
0103   //! the hyperbola, that is, the major radius
0104   //! theMajorRadius is measured along this axis, and
0105   //! -   the "Y Direction" of theA defines the minor axis of
0106   //! the hyperbola, that is, the minor radius
0107   //! theMinorRadius is measured along this axis, and
0108   //! -   the orientation (direct or indirect sense) of theA
0109   //! gives the implicit orientation of the hyperbola.
0110   //! Warnings :
0111   //! It is yet  possible to create an Hyperbola with
0112   //! theMajorRadius <= theMinorRadius.
0113   //! Raises ConstructionError if theMajorRadius < 0.0 or theMinorRadius < 0.0
0114   gp_Hypr2d(const gp_Ax22d&     theA,
0115             const Standard_Real theMajorRadius,
0116             const Standard_Real theMinorRadius)
0117       : pos(theA),
0118         majorRadius(theMajorRadius),
0119         minorRadius(theMinorRadius)
0120   {
0121     Standard_ConstructionError_Raise_if(theMinorRadius < 0.0 || theMajorRadius < 0.0,
0122                                         "gp_Hypr2d() - invalid construction parameters");
0123   }
0124 
0125   //! Modifies this hyperbola, by redefining its local
0126   //! coordinate system so that its origin becomes theP.
0127   void SetLocation(const gp_Pnt2d& theP) { pos.SetLocation(theP); }
0128 
0129   //! Modifies the major or minor radius of this hyperbola.
0130   //! Exceptions
0131   //! Standard_ConstructionError if theMajorRadius or
0132   //! MinorRadius is negative.
0133   void SetMajorRadius(const Standard_Real theMajorRadius)
0134   {
0135     Standard_ConstructionError_Raise_if(
0136       theMajorRadius < 0.0,
0137       "gp_Hypr2d::SetMajorRadius() - major radius should be greater or equal zero");
0138     majorRadius = theMajorRadius;
0139   }
0140 
0141   //! Modifies the major or minor radius of this hyperbola.
0142   //! Exceptions
0143   //! Standard_ConstructionError if MajorRadius or
0144   //! theMinorRadius is negative.
0145   void SetMinorRadius(const Standard_Real theMinorRadius)
0146   {
0147     Standard_ConstructionError_Raise_if(
0148       theMinorRadius < 0.0,
0149       "gp_Hypr2d::SetMinorRadius() - minor radius should be greater or equal zero");
0150     minorRadius = theMinorRadius;
0151   }
0152 
0153   //! Modifies this hyperbola, by redefining its local
0154   //! coordinate system so that it becomes theA.
0155   void SetAxis(const gp_Ax22d& theA) { pos.SetAxis(theA); }
0156 
0157   //! Changes the major axis of the hyperbola. The minor axis is
0158   //! recomputed and the location of the hyperbola too.
0159   void SetXAxis(const gp_Ax2d& theA) { pos.SetXAxis(theA); }
0160 
0161   //! Changes the minor axis of the hyperbola.The minor axis is
0162   //! recomputed and the location of the hyperbola too.
0163   void SetYAxis(const gp_Ax2d& theA) { pos.SetYAxis(theA); }
0164 
0165   //! In the local coordinate system of the hyperbola the equation of
0166   //! the hyperbola is (X*X)/(A*A) - (Y*Y)/(B*B) = 1.0 and the
0167   //! equation of the first asymptote is Y = (B/A)*X
0168   //! where A is the major radius of the hyperbola and B the minor
0169   //! radius of the hyperbola.
0170   //! Raises ConstructionError if MajorRadius = 0.0
0171   gp_Ax2d Asymptote1() const;
0172 
0173   //! In the local coordinate system of the hyperbola the equation of
0174   //! the hyperbola is (X*X)/(A*A) - (Y*Y)/(B*B) = 1.0 and the
0175   //! equation of the first asymptote is Y = -(B/A)*X
0176   //! where A is the major radius of the hyperbola and B the minor
0177   //! radius of the hyperbola.
0178   //! Raises ConstructionError if MajorRadius = 0.0
0179   gp_Ax2d Asymptote2() const;
0180 
0181   //! Computes the coefficients of the implicit equation of
0182   //! the hyperbola :
0183   //! theA * (X**2) + theB * (Y**2) + 2*theC*(X*Y) + 2*theD*X + 2*theE*Y + theF = 0.
0184   Standard_EXPORT void Coefficients(Standard_Real& theA,
0185                                     Standard_Real& theB,
0186                                     Standard_Real& theC,
0187                                     Standard_Real& theD,
0188                                     Standard_Real& theE,
0189                                     Standard_Real& theF) const;
0190 
0191   //! Computes the branch of hyperbola which is on the positive side of the
0192   //! "YAxis" of <me>.
0193   gp_Hypr2d ConjugateBranch1() const
0194   {
0195     gp_Dir2d         aV(pos.YDirection());
0196     Standard_Boolean isSign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0;
0197     return gp_Hypr2d(gp_Ax2d(pos.Location(), aV), minorRadius, majorRadius, isSign);
0198   }
0199 
0200   //! Computes the branch of hyperbola which is on the negative side of the
0201   //! "YAxis" of <me>.
0202   gp_Hypr2d ConjugateBranch2() const
0203   {
0204     gp_Dir2d         aV(pos.YDirection().Reversed());
0205     Standard_Boolean isSign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0;
0206     return gp_Hypr2d(gp_Ax2d(pos.Location(), aV), minorRadius, majorRadius, isSign);
0207   }
0208 
0209   //! Computes the directrix which is the line normal to the XAxis of the hyperbola
0210   //! in the local plane (Z = 0) at a distance d = MajorRadius / e
0211   //! from the center of the hyperbola, where e is the eccentricity of
0212   //! the hyperbola.
0213   //! This line is parallel to the "YAxis". The intersection point
0214   //! between the "Directrix1" and the "XAxis" is the "Location" point
0215   //! of the "Directrix1".
0216   //! This point is on the positive side of the "XAxis".
0217   gp_Ax2d Directrix1() const;
0218 
0219   //! This line is obtained by the symmetrical transformation
0220   //! of "Directrix1" with respect to the "YAxis" of the hyperbola.
0221   gp_Ax2d Directrix2() const;
0222 
0223   //! Returns the eccentricity of the hyperbola (e > 1).
0224   //! If f is the distance between the location of the hyperbola
0225   //! and the Focus1 then the eccentricity e = f / MajorRadius. Raises DomainError if MajorRadius =
0226   //! 0.0.
0227   Standard_Real Eccentricity() const
0228   {
0229     Standard_DomainError_Raise_if(majorRadius <= gp::Resolution(),
0230                                   "gp_Hypr2d::Eccentricity() - major radius is zero");
0231     return sqrt(majorRadius * majorRadius + minorRadius * minorRadius) / majorRadius;
0232   }
0233 
0234   //! Computes the focal distance. It is the distance between the
0235   //! "Location" of the hyperbola and "Focus1" or "Focus2".
0236   Standard_Real Focal() const
0237   {
0238     return 2.0 * sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
0239   }
0240 
0241   //! Returns the first focus of the hyperbola. This focus is on the
0242   //! positive side of the "XAxis" of the hyperbola.
0243   gp_Pnt2d Focus1() const
0244   {
0245     Standard_Real aC = sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
0246     return gp_Pnt2d(pos.Location().X() + aC * pos.XDirection().X(),
0247                     pos.Location().Y() + aC * pos.XDirection().Y());
0248   }
0249 
0250   //! Returns the second focus of the hyperbola. This focus is on the
0251   //! negative side of the "XAxis" of the hyperbola.
0252   gp_Pnt2d Focus2() const
0253   {
0254     Standard_Real aC = sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
0255     return gp_Pnt2d(pos.Location().X() - aC * pos.XDirection().X(),
0256                     pos.Location().Y() - aC * pos.XDirection().Y());
0257   }
0258 
0259   //! Returns  the location point of the hyperbola.
0260   //! It is the intersection point between the "XAxis" and
0261   //! the "YAxis".
0262   const gp_Pnt2d& Location() const { return pos.Location(); }
0263 
0264   //! Returns the major radius of the hyperbola (it is the radius
0265   //! corresponding to the "XAxis" of the hyperbola).
0266   Standard_Real MajorRadius() const { return majorRadius; }
0267 
0268   //! Returns the minor radius of the hyperbola (it is the radius
0269   //! corresponding to the "YAxis" of the hyperbola).
0270   Standard_Real MinorRadius() const { return minorRadius; }
0271 
0272   //! Returns the branch of hyperbola obtained by doing the
0273   //! symmetrical transformation of <me> with respect to the
0274   //! "YAxis" of <me>.
0275   gp_Hypr2d OtherBranch() const
0276   {
0277     Standard_Boolean isSign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0;
0278     return gp_Hypr2d(gp_Ax2d(pos.Location(), pos.XDirection().Reversed()),
0279                      majorRadius,
0280                      minorRadius,
0281                      isSign);
0282   }
0283 
0284   //! Returns p = (e * e - 1) * MajorRadius where e is the
0285   //! eccentricity of the hyperbola.
0286   //! Raises DomainError if MajorRadius = 0.0
0287   Standard_Real Parameter() const
0288   {
0289     Standard_DomainError_Raise_if(majorRadius <= gp::Resolution(),
0290                                   "gp_Hypr2d::Parameter() - major radius is zero");
0291     return (minorRadius * minorRadius) / majorRadius;
0292   }
0293 
0294   //! Returns the axisplacement of the hyperbola.
0295   const gp_Ax22d& Axis() const { return pos; }
0296 
0297   //! Computes an axis whose
0298   //! -   the origin is the center of this hyperbola, and
0299   //! -   the unit vector is the "X Direction" or "Y Direction"
0300   //! respectively of the local coordinate system of this hyperbola
0301   //! Returns the major axis of the hyperbola.
0302   gp_Ax2d XAxis() const { return pos.XAxis(); }
0303 
0304   //! Computes an axis whose
0305   //! -   the origin is the center of this hyperbola, and
0306   //! -   the unit vector is the "X Direction" or "Y Direction"
0307   //! respectively of the local coordinate system of this hyperbola
0308   //! Returns the minor axis of the hyperbola.
0309   gp_Ax2d YAxis() const { return pos.YAxis(); }
0310 
0311   void Reverse()
0312   {
0313     gp_Dir2d aTemp = pos.YDirection();
0314     aTemp.Reverse();
0315     pos.SetAxis(gp_Ax22d(pos.Location(), pos.XDirection(), aTemp));
0316   }
0317 
0318   //! Reverses the orientation of the local coordinate system
0319   //! of this hyperbola (the "Y Axis" is reversed). Therefore,
0320   //! the implicit orientation of this hyperbola is reversed.
0321   //! Note:
0322   //! -   Reverse assigns the result to this hyperbola, while
0323   //! -   Reversed creates a new one.
0324   Standard_NODISCARD gp_Hypr2d Reversed() const;
0325 
0326   //! Returns true if the local coordinate system is direct
0327   //! and false in the other case.
0328   Standard_Boolean IsDirect() const { return (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; }
0329 
0330   Standard_EXPORT void Mirror(const gp_Pnt2d& theP);
0331 
0332   //! Performs the symmetrical transformation of an hyperbola with
0333   //! respect  to the point theP which is the center of the symmetry.
0334   Standard_NODISCARD Standard_EXPORT gp_Hypr2d Mirrored(const gp_Pnt2d& theP) const;
0335 
0336   Standard_EXPORT void Mirror(const gp_Ax2d& theA);
0337 
0338   //! Performs the symmetrical transformation of an hyperbola with
0339   //! respect to an axis placement which is the axis of the symmetry.
0340   Standard_NODISCARD Standard_EXPORT gp_Hypr2d Mirrored(const gp_Ax2d& theA) const;
0341 
0342   void Rotate(const gp_Pnt2d& theP, const Standard_Real theAng) { pos.Rotate(theP, theAng); }
0343 
0344   //! Rotates an hyperbola. theP is the center of the rotation.
0345   //! theAng is the angular value of the rotation in radians.
0346   Standard_NODISCARD gp_Hypr2d Rotated(const gp_Pnt2d& theP, const Standard_Real theAng) const
0347   {
0348     gp_Hypr2d aH = *this;
0349     aH.pos.Rotate(theP, theAng);
0350     return aH;
0351   }
0352 
0353   void Scale(const gp_Pnt2d& theP, const Standard_Real theS);
0354 
0355   //! Scales an hyperbola. <theS> is the scaling value.
0356   //! If <theS> is positive only the location point is
0357   //! modified. But if <theS> is negative the "XAxis" is
0358   //! reversed and the "YAxis" too.
0359   Standard_NODISCARD gp_Hypr2d Scaled(const gp_Pnt2d& theP, const Standard_Real theS) const;
0360 
0361   void Transform(const gp_Trsf2d& theT);
0362 
0363   //! Transforms an hyperbola with the transformation theT from
0364   //! class Trsf2d.
0365   Standard_NODISCARD gp_Hypr2d Transformed(const gp_Trsf2d& theT) const;
0366 
0367   void Translate(const gp_Vec2d& theV) { pos.Translate(theV); }
0368 
0369   //! Translates an hyperbola in the direction of the vector theV.
0370   //! The magnitude of the translation is the vector's magnitude.
0371   Standard_NODISCARD gp_Hypr2d Translated(const gp_Vec2d& theV) const
0372   {
0373     gp_Hypr2d aH = *this;
0374     aH.pos.Translate(theV);
0375     return aH;
0376   }
0377 
0378   void Translate(const gp_Pnt2d& theP1, const gp_Pnt2d& theP2) { pos.Translate(theP1, theP2); }
0379 
0380   //! Translates an hyperbola from the point theP1 to the point theP2.
0381   Standard_NODISCARD gp_Hypr2d Translated(const gp_Pnt2d& theP1, const gp_Pnt2d& theP2) const
0382   {
0383     gp_Hypr2d aH = *this;
0384     aH.pos.Translate(theP1, theP2);
0385     return aH;
0386   }
0387 
0388 private:
0389   gp_Ax22d      pos;
0390   Standard_Real majorRadius;
0391   Standard_Real minorRadius;
0392 };
0393 
0394 //=======================================================================
0395 // function : Asymptote1
0396 // purpose :
0397 //=======================================================================
0398 inline gp_Ax2d gp_Hypr2d::Asymptote1() const
0399 {
0400   Standard_ConstructionError_Raise_if(majorRadius <= gp::Resolution(),
0401                                       "gp_Hypr2d::Asymptote1() - major radius is zero");
0402   gp_Dir2d aVdir = pos.XDirection();
0403   gp_XY    aCoord1(pos.YDirection().XY());
0404   gp_XY    aCoord2 = aCoord1.Multiplied(minorRadius / majorRadius);
0405   aCoord1.Add(aCoord2);
0406   aVdir.SetXY(aCoord1);
0407   return gp_Ax2d(pos.Location(), aVdir);
0408 }
0409 
0410 //=======================================================================
0411 // function : Asymptote2
0412 // purpose :
0413 //=======================================================================
0414 inline gp_Ax2d gp_Hypr2d::Asymptote2() const
0415 {
0416   Standard_ConstructionError_Raise_if(majorRadius <= gp::Resolution(),
0417                                       "gp_Hypr2d::Asymptote2() - major radius is zero");
0418   gp_Vec2d aVdir = pos.XDirection();
0419   gp_XY    aCoord1(pos.YDirection().XY());
0420   gp_XY    aCoord2 = aCoord1.Multiplied(-minorRadius / majorRadius);
0421   aCoord1.Add(aCoord2);
0422   aVdir.SetXY(aCoord1);
0423   return gp_Ax2d(pos.Location(), aVdir);
0424 }
0425 
0426 //=======================================================================
0427 // function : Directrix1
0428 // purpose :
0429 //=======================================================================
0430 inline gp_Ax2d gp_Hypr2d::Directrix1() const
0431 {
0432   Standard_Real anE    = Eccentricity();
0433   gp_XY         anOrig = pos.XDirection().XY();
0434   anOrig.Multiply(majorRadius / anE);
0435   anOrig.Add(pos.Location().XY());
0436   return gp_Ax2d(gp_Pnt2d(anOrig), gp_Dir2d(pos.YDirection()));
0437 }
0438 
0439 //=======================================================================
0440 // function : Directrix2
0441 // purpose :
0442 //=======================================================================
0443 inline gp_Ax2d gp_Hypr2d::Directrix2() const
0444 {
0445   Standard_Real anE    = Eccentricity();
0446   gp_XY         anOrig = pos.XDirection().XY();
0447   anOrig.Multiply(Parameter() / anE);
0448   anOrig.Add(Focus1().XY());
0449   return gp_Ax2d(gp_Pnt2d(anOrig), gp_Dir2d(pos.YDirection()));
0450 }
0451 
0452 //=======================================================================
0453 // function : Reversed
0454 // purpose :
0455 //=======================================================================
0456 inline gp_Hypr2d gp_Hypr2d::Reversed() const
0457 {
0458   gp_Hypr2d aH    = *this;
0459   gp_Dir2d  aTemp = pos.YDirection();
0460   aTemp.Reverse();
0461   aH.pos.SetAxis(gp_Ax22d(pos.Location(), pos.XDirection(), aTemp));
0462   return aH;
0463 }
0464 
0465 //=======================================================================
0466 // function : Scale
0467 // purpose :
0468 //=======================================================================
0469 inline void gp_Hypr2d::Scale(const gp_Pnt2d& theP, const Standard_Real theS)
0470 {
0471   majorRadius *= theS;
0472   if (majorRadius < 0)
0473   {
0474     majorRadius = -majorRadius;
0475   }
0476   minorRadius *= theS;
0477   if (minorRadius < 0)
0478   {
0479     minorRadius = -minorRadius;
0480   }
0481   pos.Scale(theP, theS);
0482 }
0483 
0484 //=======================================================================
0485 // function : Scaled
0486 // purpose :
0487 //=======================================================================
0488 inline gp_Hypr2d gp_Hypr2d::Scaled(const gp_Pnt2d& theP, const Standard_Real theS) const
0489 {
0490   gp_Hypr2d aH = *this;
0491   aH.majorRadius *= theS;
0492   if (aH.majorRadius < 0)
0493   {
0494     aH.majorRadius = -aH.majorRadius;
0495   }
0496   aH.minorRadius *= theS;
0497   if (aH.minorRadius < 0)
0498   {
0499     aH.minorRadius = -aH.minorRadius;
0500   }
0501   aH.pos.Scale(theP, theS);
0502   return aH;
0503 }
0504 
0505 //=======================================================================
0506 // function : Transform
0507 // purpose :
0508 //=======================================================================
0509 inline void gp_Hypr2d::Transform(const gp_Trsf2d& theT)
0510 {
0511   majorRadius *= theT.ScaleFactor();
0512   if (majorRadius < 0)
0513   {
0514     majorRadius = -majorRadius;
0515   }
0516   minorRadius *= theT.ScaleFactor();
0517   if (minorRadius < 0)
0518   {
0519     minorRadius = -minorRadius;
0520   }
0521   pos.Transform(theT);
0522 }
0523 
0524 //=======================================================================
0525 // function : Transformed
0526 // purpose :
0527 //=======================================================================
0528 inline gp_Hypr2d gp_Hypr2d::Transformed(const gp_Trsf2d& theT) const
0529 {
0530   gp_Hypr2d aH = *this;
0531   aH.majorRadius *= theT.ScaleFactor();
0532   if (aH.majorRadius < 0)
0533   {
0534     aH.majorRadius = -aH.majorRadius;
0535   }
0536   aH.minorRadius *= theT.ScaleFactor();
0537   if (aH.minorRadius < 0)
0538   {
0539     aH.minorRadius = -aH.minorRadius;
0540   }
0541   aH.pos.Transform(theT);
0542   return aH;
0543 }
0544 
0545 #endif // _gp_Hypr2d_HeaderFile