Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 09:16:15

0001 // Created on: 1994-07-06
0002 // Created by: Laurent PAINNOT
0003 // Copyright (c) 1994-1999 Matra Datavision
0004 // Copyright (c) 1999-2014 OPEN CASCADE SAS
0005 //
0006 // This file is part of Open CASCADE Technology software library.
0007 //
0008 // This library is free software; you can redistribute it and/or modify it under
0009 // the terms of the GNU Lesser General Public License version 2.1 as published
0010 // by the Free Software Foundation, with special exception defined in the file
0011 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0012 // distribution for complete text of the license and disclaimer of any warranty.
0013 //
0014 // Alternatively, this file may be used under the terms of Open CASCADE
0015 // commercial license or contractual agreement.
0016 
0017 #ifndef _Extrema_ExtCC_HeaderFile
0018 #define _Extrema_ExtCC_HeaderFile
0019 
0020 #include <Standard.hxx>
0021 #include <Standard_DefineAlloc.hxx>
0022 
0023 #include <Extrema_ECC.hxx>
0024 #include <Extrema_SequenceOfPOnCurv.hxx>
0025 #include <TColStd_SequenceOfReal.hxx>
0026 #include <gp_Pnt.hxx>
0027 
0028 class Adaptor3d_Curve;
0029 class Extrema_POnCurv;
0030 class Extrema_ExtElC;
0031 
0032 //! It calculates all the distance between two curves.
0033 //! These distances can be maximum or minimum.
0034 class Extrema_ExtCC
0035 {
0036 public:
0037   DEFINE_STANDARD_ALLOC
0038 
0039   Standard_EXPORT Extrema_ExtCC(const Standard_Real TolC1 = 1.0e-10,
0040                                 const Standard_Real TolC2 = 1.0e-10);
0041 
0042   //! It calculates all the distances.
0043   Standard_EXPORT Extrema_ExtCC(const Adaptor3d_Curve& C1,
0044                                 const Adaptor3d_Curve& C2,
0045                                 const Standard_Real    TolC1 = 1.0e-10,
0046                                 const Standard_Real    TolC2 = 1.0e-10);
0047 
0048   //! It calculates all the distances.
0049   Standard_EXPORT Extrema_ExtCC(const Adaptor3d_Curve& C1,
0050                                 const Adaptor3d_Curve& C2,
0051                                 const Standard_Real    U1,
0052                                 const Standard_Real    U2,
0053                                 const Standard_Real    V1,
0054                                 const Standard_Real    V2,
0055                                 const Standard_Real    TolC1 = 1.0e-10,
0056                                 const Standard_Real    TolC2 = 1.0e-10);
0057 
0058   //! Initializes but does not perform algorithm.
0059   Standard_EXPORT void Initialize(const Adaptor3d_Curve& C1,
0060                                   const Adaptor3d_Curve& C2,
0061                                   const Standard_Real    TolC1 = 1.0e-10,
0062                                   const Standard_Real    TolC2 = 1.0e-10);
0063 
0064   //! Initializes but does not perform algorithm.
0065   Standard_EXPORT void Initialize(const Adaptor3d_Curve& C1,
0066                                   const Adaptor3d_Curve& C2,
0067                                   const Standard_Real    U1,
0068                                   const Standard_Real    U2,
0069                                   const Standard_Real    V1,
0070                                   const Standard_Real    V2,
0071                                   const Standard_Real    TolC1 = 1.0e-10,
0072                                   const Standard_Real    TolC2 = 1.0e-10);
0073 
0074   Standard_EXPORT void SetCurve(const Standard_Integer theRank, const Adaptor3d_Curve& C);
0075 
0076   Standard_EXPORT void SetCurve(const Standard_Integer theRank,
0077                                 const Adaptor3d_Curve& C,
0078                                 const Standard_Real    Uinf,
0079                                 const Standard_Real    Usup);
0080 
0081   Standard_EXPORT void SetRange(const Standard_Integer theRank,
0082                                 const Standard_Real    Uinf,
0083                                 const Standard_Real    Usup);
0084 
0085   Standard_EXPORT void SetTolerance(const Standard_Integer theRank, const Standard_Real Tol);
0086 
0087   Standard_EXPORT void Perform();
0088 
0089   //! Returns True if the distances are found.
0090   Standard_EXPORT Standard_Boolean IsDone() const;
0091 
0092   //! Returns the number of extremum distances.
0093   Standard_EXPORT Standard_Integer NbExt() const;
0094 
0095   //! Returns True if the two curves are parallel.
0096   Standard_EXPORT Standard_Boolean IsParallel() const;
0097 
0098   //! Returns the value of the Nth extremum square distance.
0099   Standard_EXPORT Standard_Real SquareDistance(const Standard_Integer N = 1) const;
0100 
0101   //! Returns the points of the Nth extremum distance.
0102   //! P1 is on the first curve, P2 on the second one.
0103   Standard_EXPORT void Points(const Standard_Integer N,
0104                               Extrema_POnCurv&       P1,
0105                               Extrema_POnCurv&       P2) const;
0106 
0107   //! if the curve is a trimmed curve,
0108   //! dist11 is a square distance between the point on C1
0109   //! of parameter FirstParameter and the point of
0110   //! parameter FirstParameter on C2.
0111   Standard_EXPORT void TrimmedSquareDistances(Standard_Real& dist11,
0112                                               Standard_Real& distP12,
0113                                               Standard_Real& distP21,
0114                                               Standard_Real& distP22,
0115                                               gp_Pnt&        P11,
0116                                               gp_Pnt&        P12,
0117                                               gp_Pnt&        P21,
0118                                               gp_Pnt&        P22) const;
0119 
0120   //! Set flag for single extrema computation. Works on parametric solver only.
0121   Standard_EXPORT void SetSingleSolutionFlag(const Standard_Boolean theSingleSolutionFlag);
0122 
0123   //! Get flag for single extrema computation. Works on parametric solver only.
0124   Standard_EXPORT Standard_Boolean GetSingleSolutionFlag() const;
0125 
0126 protected:
0127   //! Prepares the extrema result(s) for analytical cases (line, circle, ellipsis etc.)
0128   Standard_EXPORT void PrepareResults(const Extrema_ExtElC&  AlgExt,
0129                                       const Standard_Boolean theIsInverse,
0130                                       const Standard_Real    Ut11,
0131                                       const Standard_Real    Ut12,
0132                                       const Standard_Real    Ut21,
0133                                       const Standard_Real    Ut22);
0134 
0135   //! Prepares the extrema result(s) for general cases (e.g. with B-spline curves).
0136   Standard_EXPORT void PrepareResults(const Extrema_ECC&  AlgExt,
0137                                       const Standard_Real Ut11,
0138                                       const Standard_Real Ut12,
0139                                       const Standard_Real Ut21,
0140                                       const Standard_Real Ut22);
0141 
0142   //! Prepares the extrema result(s) in case when the given curves are parallel.
0143   Standard_EXPORT void PrepareParallelResult(const Standard_Real theUt11,
0144                                              const Standard_Real theUt12,
0145                                              const Standard_Real theUt21,
0146                                              const Standard_Real theUt22,
0147                                              const Standard_Real theSqDist);
0148 
0149   // Clears all found extremas.
0150   // This method does not change any flags (e.g. Done or IsParallel)
0151   void ClearSolutions()
0152   {
0153     mySqDist.Clear();
0154     mypoints.Clear();
0155   }
0156 
0157 private:
0158   // disallow copies
0159   Extrema_ExtCC(Extrema_ExtCC&) Standard_DELETE;
0160   Extrema_ExtCC& operator=(Extrema_ExtCC&) Standard_DELETE;
0161 
0162 private:
0163   Standard_Boolean          myIsFindSingleSolution; // Default value is false.
0164   Extrema_ECC               myECC;
0165   Standard_Boolean          myDone;
0166   Standard_Boolean          myIsParallel;
0167   Extrema_SequenceOfPOnCurv mypoints;
0168   TColStd_SequenceOfReal    mySqDist;
0169   const Adaptor3d_Curve*    myC[2];
0170   Standard_Real             myInf[2];
0171   Standard_Real             mySup[2];
0172   Standard_Real             myTol[2];
0173   gp_Pnt                    myP1f;
0174   gp_Pnt                    myP1l;
0175   gp_Pnt                    myP2f;
0176   gp_Pnt                    myP2l;
0177   Standard_Real             mydist11;
0178   Standard_Real             mydist12;
0179   Standard_Real             mydist21;
0180   Standard_Real             mydist22;
0181 };
0182 
0183 #endif // _Extrema_ExtCC_HeaderFile