1 // Created on: 1993-07-07 2 // Created by: Jean Claude VAUTHIER 3 // Copyright (c) 1993-1999 Matra Datavision 4 // Copyright (c) 1999-2014 OPEN CASCADE SAS 5 // 6 // This file is part of Open CASCADE Technology software library. 7 // 8 // This library is free software; you can redistribute it and/or modify it under 9 // the terms of the GNU Lesser General Public License version 2.1 as published 10 // by the Free Software Foundation, with special exception defined in the file 11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT 12 // distribution for complete text of the license and disclaimer of any warranty. 13 // 14 // Alternatively, this file may be used under the terms of Open CASCADE 15 // commercial license or contractual agreement. 16 17 #ifndef _GeomLib_HeaderFile 18 #define _GeomLib_HeaderFile 19 20 #include <Adaptor3d_Surface.hxx> 21 #include <GeomAbs_Shape.hxx> 22 #include <TColgp_Array1OfPnt.hxx> 23 #include <TColStd_Array1OfReal.hxx> 24 #include <TColStd_HArray1OfReal.hxx> 25 #include <TColStd_SequenceOfReal.hxx> 26 27 class Geom_Curve; 28 class gp_Ax2; 29 class Geom2d_Curve; 30 class gp_GTrsf2d; 31 class Adaptor3d_CurveOnSurface; 32 class Geom_BoundedCurve; 33 class gp_Pnt; 34 class gp_Vec; 35 class Geom_BoundedSurface; 36 class gp_Dir; 37 class Adaptor3d_Curve; 38 class Geom_BSplineSurface; 39 class Geom_BezierSurface; 40 class Geom_Surface; 41 42 typedef class Adaptor2d_Curve2d Adaptor2d_Curve2d; 43 44 //! Geom Library. This package provides an 45 //! implementation of functions for basic computation 46 //! on geometric entity from packages Geom and Geom2d. 47 class GeomLib 48 { 49 public: 50 51 DEFINE_STANDARD_ALLOC 52 53 54 //! Computes the curve 3d from package Geom 55 //! corresponding to curve 2d from package Geom2d, on 56 //! the plan defined with the local coordinate system 57 //! Position. 58 Standard_EXPORT static Handle(Geom_Curve) To3d (const gp_Ax2& Position, const Handle(Geom2d_Curve)& Curve2d); 59 60 //! Computes the curve 3d from package Geom 61 //! corresponding to the curve 3d from package Geom, 62 //! transformed with the transformation <GTrsf> 63 //! WARNING : this method may return a null Handle if 64 //! it's impossible to compute the transformation of 65 //! a curve. It's not implemented when : 66 //! 1) the curve is an infinite parabola or hyperbola 67 //! 2) the curve is an offsetcurve 68 Standard_EXPORT static Handle(Geom2d_Curve) GTransform (const Handle(Geom2d_Curve)& Curve, const gp_GTrsf2d& GTrsf); 69 70 //! Make the curve Curve2dPtr have the imposed 71 //! range First to List the most economic way, 72 //! that is if it can change the range without 73 //! changing the nature of the curve it will try 74 //! to do that. Otherwise it will produce a Bspline 75 //! curve that has the required range 76 Standard_EXPORT static void SameRange (const Standard_Real Tolerance, const Handle(Geom2d_Curve)& Curve2dPtr, const Standard_Real First, const Standard_Real Last, const Standard_Real RequestedFirst, const Standard_Real RequestedLast, Handle(Geom2d_Curve)& NewCurve2dPtr); 77 78 Standard_EXPORT static void BuildCurve3d (const Standard_Real Tolerance, Adaptor3d_CurveOnSurface& CurvePtr, const Standard_Real FirstParameter, const Standard_Real LastParameter, Handle(Geom_Curve)& NewCurvePtr, Standard_Real& MaxDeviation, Standard_Real& AverageDeviation, const GeomAbs_Shape Continuity = GeomAbs_C1, const Standard_Integer MaxDegree = 14, const Standard_Integer MaxSegment = 30); 79 80 Standard_EXPORT static void AdjustExtremity (Handle(Geom_BoundedCurve)& Curve, const gp_Pnt& P1, const gp_Pnt& P2, const gp_Vec& T1, const gp_Vec& T2); 81 82 //! Extends the bounded curve Curve to the point Point. 83 //! The extension is built: 84 //! - at the end of the curve if After equals true, or 85 //! - at the beginning of the curve if After equals false. 86 //! The extension is performed according to a degree of 87 //! continuity equal to Cont, which in its turn must be equal to 1, 2 or 3. 88 //! This function converts the bounded curve Curve into a BSpline curve. 89 //! Warning 90 //! - Nothing is done, and Curve is not modified if Cont is 91 //! not equal to 1, 2 or 3. 92 //! - It is recommended that the extension should not be 93 //! too large with respect to the size of the bounded 94 //! curve Curve: Point must not be located too far from 95 //! one of the extremities of Curve. 96 Standard_EXPORT static void ExtendCurveToPoint (Handle(Geom_BoundedCurve)& Curve, const gp_Pnt& Point, const Standard_Integer Cont, const Standard_Boolean After); 97 98 99 //! Extends the bounded surface Surf along one of its 100 //! boundaries. The chord length of the extension is equal to Length. 101 //! The direction of the extension is given as: 102 //! - the u parametric direction of Surf, if InU equals true, or 103 //! - the v parametric direction of Surf, if InU equals false. 104 //! In this parametric direction, the extension is built on the side of: 105 //! - the last parameter of Surf, if After equals true, or 106 //! - the first parameter of Surf, if After equals false. 107 //! The extension is performed according to a degree of 108 //! continuity equal to Cont, which in its turn must be equal to 1, 2 or 3. 109 //! This function converts the bounded surface Surf into a BSpline surface. 110 //! Warning 111 //! - Nothing is done, and Surf is not modified if Cont is 112 //! not equal to 1, 2 or 3. 113 //! - It is recommended that Length, the size of the 114 //! extension should not be too large with respect to the 115 //! size of the bounded surface Surf. 116 //! - Surf must not be a periodic BSpline surface in the 117 //! parametric direction corresponding to the direction of extension. 118 Standard_EXPORT static void ExtendSurfByLength (Handle(Geom_BoundedSurface)& Surf, const Standard_Real Length, const Standard_Integer Cont, const Standard_Boolean InU, const Standard_Boolean After); 119 120 //! Compute axes of inertia, of some points -- -- -- 121 //! <Axe>.Location() is the BaryCentre -- -- -- -- -- 122 //! <Axe>.XDirection is the axe of upper inertia -- -- -- 123 //! -- <Axe>.Direction is the Normal to the average plane 124 //! -- -- -- IsSingular is True if points are on line -- 125 //! Tol is used to determine singular cases. 126 Standard_EXPORT static void AxeOfInertia (const TColgp_Array1OfPnt& Points, gp_Ax2& Axe, Standard_Boolean& IsSingular, const Standard_Real Tol = 1.0e-7); 127 128 //! Compute principale axes of inertia, and dispersion 129 //! value of some points. 130 Standard_EXPORT static void Inertia (const TColgp_Array1OfPnt& Points, gp_Pnt& Bary, gp_Dir& XDir, gp_Dir& YDir, Standard_Real& Xgap, Standard_Real& YGap, Standard_Real& ZGap); 131 132 //! Warning! This assume that the InParameter is an increasing sequence 133 //! of real number and it will not check for that : Unpredictable 134 //! result can happen if this is not satisfied. It is the caller 135 //! responsibility to check for that property. 136 //! 137 //! This method makes uniform NumPoints segments S1,...SNumPoints out 138 //! of the segment defined by the first parameter and the 139 //! last parameter of the InParameter ; keeps only one 140 //! point of the InParameters set of parameter in each of 141 //! the uniform segments taking care of the first and the 142 //! last parameters. For the ith segment the element of 143 //! the InParameter is the one that is the first to exceed 144 //! the midpoint of the segment and to fall before the 145 //! midpoint of the next segment 146 //! There will be at the end at most NumPoints + 1 if 147 //! NumPoints > 2 in the OutParameters Array 148 Standard_EXPORT static void RemovePointsFromArray (const Standard_Integer NumPoints, const TColStd_Array1OfReal& InParameters, Handle(TColStd_HArray1OfReal)& OutParameters); 149 150 //! this makes sure that there is at least MinNumPoints 151 //! in OutParameters taking into account the parameters in 152 //! the InParameters array provided those are in order, 153 //! that is the sequence of real in the InParameter is strictly 154 //! non decreasing 155 Standard_EXPORT static void DensifyArray1OfReal (const Standard_Integer MinNumPoints, const TColStd_Array1OfReal& InParameters, Handle(TColStd_HArray1OfReal)& OutParameters); 156 157 //! This method fuse intervals Interval1 and Interval2 with specified Confusion 158 //! @param Interval1 [in] first interval to fuse 159 //! @param Interval2 [in] second interval to fuse 160 //! @param Confision [in] tolerance to compare intervals 161 //! @param IsAdjustToFirstInterval [in] flag to set method of fusion, if intervals are close 162 //! if false, intervals are fusing by half-division methdod 163 //! if true, intervals are fusing by selecting value from Interval1 164 //! @param Fusion [out] output interval 165 Standard_EXPORT static void FuseIntervals (const TColStd_Array1OfReal& Interval1, 166 const TColStd_Array1OfReal& Interval2, 167 TColStd_SequenceOfReal& Fusion, 168 const Standard_Real Confusion = 1.0e-9, 169 const Standard_Boolean IsAdjustToFirstInterval = Standard_False); 170 171 //! this will compute the maximum distance at the 172 //! parameters given in the Parameters array by 173 //! evaluating each parameter the two curves and taking 174 //! the maximum of the evaluated distance 175 Standard_EXPORT static void EvalMaxParametricDistance (const Adaptor3d_Curve& Curve, const Adaptor3d_Curve& AReferenceCurve, const Standard_Real Tolerance, const TColStd_Array1OfReal& Parameters, Standard_Real& MaxDistance); 176 177 //! this will compute the maximum distance at the parameters 178 //! given in the Parameters array by projecting from the Curve 179 //! to the reference curve and taking the minimum distance 180 //! Than the maximum will be taken on those minimas. 181 Standard_EXPORT static void EvalMaxDistanceAlongParameter (const Adaptor3d_Curve& Curve, const Adaptor3d_Curve& AReferenceCurve, const Standard_Real Tolerance, const TColStd_Array1OfReal& Parameters, Standard_Real& MaxDistance); 182 183 //! Cancel,on the boundaries,the denominator first derivative 184 //! in the directions wished by the user and set its value to 1. 185 Standard_EXPORT static void CancelDenominatorDerivative (Handle(Geom_BSplineSurface)& BSurf, const Standard_Boolean UDirection, const Standard_Boolean VDirection); 186 187 Standard_EXPORT static Standard_Integer NormEstim (const Handle(Geom_Surface)& S, const gp_Pnt2d& UV, const Standard_Real Tol, gp_Dir& N); 188 189 //! This method defines if opposite boundaries of surface 190 //! coincide with given tolerance 191 Standard_EXPORT static void IsClosed(const Handle(Geom_Surface)& S, const Standard_Real Tol, 192 Standard_Boolean& isUClosed, Standard_Boolean& isVClosed); 193 194 //! Returns true if the poles of U1 isoline and the poles of 195 //! U2 isoline of surface are identical according to tolerance criterion. 196 //! For rational surfaces Weights(i)*Poles(i) are checked. 197 Standard_EXPORT static Standard_Boolean IsBSplUClosed(const Handle(Geom_BSplineSurface)& S, 198 const Standard_Real U1, 199 const Standard_Real U2, 200 const Standard_Real Tol); 201 202 //! Returns true if the poles of V1 isoline and the poles of 203 //! V2 isoline of surface are identical according to tolerance criterion. 204 //! For rational surfaces Weights(i)*Poles(i) are checked. 205 Standard_EXPORT static Standard_Boolean IsBSplVClosed(const Handle(Geom_BSplineSurface)& S, 206 const Standard_Real V1, 207 const Standard_Real V2, 208 const Standard_Real Tol); 209 210 //! Returns true if the poles of U1 isoline and the poles of 211 //! U2 isoline of surface are identical according to tolerance criterion. 212 Standard_EXPORT static Standard_Boolean IsBzUClosed(const Handle(Geom_BezierSurface)& S, 213 const Standard_Real U1, 214 const Standard_Real U2, 215 const Standard_Real Tol); 216 217 //! Returns true if the poles of V1 isoline and the poles of 218 //! V2 isoline of surface are identical according to tolerance criterion. 219 Standard_EXPORT static Standard_Boolean IsBzVClosed(const Handle(Geom_BezierSurface)& S, 220 const Standard_Real V1, 221 const Standard_Real V2, 222 const Standard_Real Tol); 223 224 //! Checks whether the 2d curve is a isoline. It can be represented by b-spline, bezier, 225 //! or geometric line. This line should have natural parameterization. 226 //! @param theC2D Trimmed curve to be checked. 227 //! @param theIsU Flag indicating that line is u const. 228 //! @param theParam Line parameter. 229 //! @param theIsForward Flag indicating forward parameterization on a isoline. 230 //! @return Standard_True when 2d curve is a line and Standard_False otherwise. 231 Standard_EXPORT static Standard_Boolean isIsoLine (const Handle(Adaptor2d_Curve2d) theC2D, 232 Standard_Boolean& theIsU, 233 Standard_Real& theParam, 234 Standard_Boolean& theIsForward); 235 236 //! Builds 3D curve for a isoline. This method takes corresponding isoline from 237 //! the input surface. 238 //! @param theC2D Trimmed curve to be approximated. 239 //! @param theIsU Flag indicating that line is u const. 240 //! @param theParam Line parameter. 241 //! @param theIsForward Flag indicating forward parameterization on a isoline. 242 //! @return Standard_True when 3d curve is built and Standard_False otherwise. 243 Standard_EXPORT static Handle(Geom_Curve) buildC3dOnIsoLine (const Handle(Adaptor2d_Curve2d) theC2D, 244 const Handle(Adaptor3d_Surface) theSurf, 245 const Standard_Real theFirst, 246 const Standard_Real theLast, 247 const Standard_Real theTolerance, 248 const Standard_Boolean theIsU, 249 const Standard_Real theParam, 250 const Standard_Boolean theIsForward); 251 252 protected: 253 254 255 private: 256 257 258 259 260 friend class GeomLib_MakeCurvefromApprox; 261 friend class GeomLib_Interpolate; 262 friend class GeomLib_DenominatorMultiplier; 263 friend class GeomLib_CheckBSplineCurve; 264 friend class GeomLib_Check2dBSplineCurve; 265 friend class GeomLib_IsPlanarSurface; 266 friend class GeomLib_Tool; 267 friend class GeomLib_PolyFunc; 268 friend class GeomLib_LogSample; 269 270 }; 271 272 273 274 275 276 277 278 #endif // _GeomLib_HeaderFile 279