d224e954a685094a6307e3a29b26bada0048ea5b
[occt.git] / src / Geom / Geom_OffsetSurface.hxx
1 // Created on: 1993-03-10
2 // Created by: JCV
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 _Geom_OffsetSurface_HeaderFile
18 #define _Geom_OffsetSurface_HeaderFile
19
20 #include <Standard.hxx>
21 #include <Standard_Type.hxx>
22
23 #include <Standard_Real.hxx>
24 #include <Geom_OsculatingSurface.hxx>
25 #include <GeomAbs_Shape.hxx>
26 #include <Geom_Surface.hxx>
27 #include <Standard_Boolean.hxx>
28 #include <Standard_Integer.hxx>
29 class Geom_Surface;
30 class Standard_ConstructionError;
31 class Standard_RangeError;
32 class Standard_NoSuchObject;
33 class Geom_UndefinedDerivative;
34 class Geom_UndefinedValue;
35 class Geom_Curve;
36 class gp_Pnt;
37 class gp_Vec;
38 class Geom_BSplineSurface;
39 class gp_Trsf;
40 class gp_GTrsf2d;
41 class Geom_Geometry;
42
43
44 class Geom_OffsetSurface;
45 DEFINE_STANDARD_HANDLE(Geom_OffsetSurface, Geom_Surface)
46
47 //! Describes an offset surface in 3D space.
48 //! An offset surface is defined by:
49 //! - the basis surface to which it is parallel, and
50 //! - the distance between the offset surface and its basis surface.
51 //! A point on the offset surface is built by measuring the
52 //! offset value along the normal vector at a point on the
53 //! basis surface. This normal vector is given by the cross
54 //! product D1u^D1v, where D1u and D1v are the
55 //! vectors tangential to the basis surface in the u and v
56 //! parametric directions at this point. The side of the
57 //! basis surface on which the offset is measured
58 //! depends on the sign of the offset value.
59 //! A Geom_OffsetSurface surface can be
60 //! self-intersecting, even if the basis surface does not
61 //! self-intersect. The self-intersecting portions are not
62 //! deleted at the time of construction.
63 //! Warning
64 //! There must be only one normal vector defined at any
65 //! point on the basis surface. This must be verified by the
66 //! user as no check is made at the time of construction
67 //! to detect points with multiple possible normal
68 //! directions (for example, the top of a conical surface).
69 class Geom_OffsetSurface : public Geom_Surface
70 {
71
72 public:
73
74   
75   //! Constructs a surface offset from the basis surface
76   //! S, where Offset is the distance between the offset
77   //! surface and the basis surface at any point.
78   //! A point on the offset surface is built by measuring
79   //! the offset value along a normal vector at a point on
80   //! S. This normal vector is given by the cross product
81   //! D1u^D1v, where D1u and D1v are the vectors
82   //! tangential to the basis surface in the u and v
83   //! parametric directions at this point. The side of S on
84   //! which the offset value is measured is indicated by
85   //! this normal vector if Offset is positive, or is the
86   //! inverse sense if Offset is negative.
87   //! If isNotCheckC0 = TRUE checking if basis surface has C0-continuity
88   //! is not made.
89   //! Warnings :
90   //! - The offset surface is built with a copy of the
91   //! surface S. Therefore, when S is modified the
92   //! offset surface is not modified.
93   //! - No check is made at the time of construction to
94   //! detect points on S with multiple possible normal directions.
95   //! Raised if S is not at least C1.
96   //! Warnings :
97   //! No check is done to verify that a unique normal direction is
98   //! defined at any point of the basis surface S.
99   Standard_EXPORT Geom_OffsetSurface(const Handle(Geom_Surface)& S, const Standard_Real Offset, const Standard_Boolean isNotCheckC0 = Standard_False);
100   
101   //! Raised if S is not at least C1.
102   //! Warnings :
103   //! No check is done to verify that a unique normal direction is
104   //! defined at any point of the basis surface S.
105   //! If isNotCheckC0 = TRUE checking if basis surface has C0-continuity
106   //! is not made.
107   //! Exceptions
108   //! Standard_ConstructionError if the surface S is not
109   //! at least "C1" continuous.
110   Standard_EXPORT void SetBasisSurface (const Handle(Geom_Surface)& S, const Standard_Boolean isNotCheckC0 = Standard_False);
111   
112   //! Changes this offset surface by assigning D as the offset value.
113   Standard_EXPORT void SetOffsetValue (const Standard_Real D);
114   
115   //! Returns the offset value of this offset surface.
116   inline Standard_Real Offset() const
117   { return offsetValue; }
118   
119   //! Returns the basis surface of this offset surface.
120   //! Note: The basis surface can be an offset surface.
121   inline const Handle(Geom_Surface) & BasisSurface() const
122   { return basisSurf; }
123   
124   //! Changes the orientation of this offset surface in the u
125   //! parametric direction. The bounds of the surface
126   //! are not changed but the given parametric direction is reversed.
127   Standard_EXPORT void UReverse();
128   
129   //! Computes the u  parameter on the modified
130   //! surface, produced by reversing the u
131   //! parametric direction of this offset surface, for any
132   //! point of u parameter U  on this offset surface.
133   Standard_EXPORT Standard_Real UReversedParameter (const Standard_Real U) const;
134   
135   //! Changes the orientation of this offset surface in the v parametric direction. The bounds of the surface
136   //! are not changed but the given parametric direction is reversed.
137   Standard_EXPORT void VReverse();
138   
139   //! Computes the  v parameter on the modified
140   //! surface, produced by reversing the or v
141   //! parametric direction of this offset surface, for any
142   //! point of  v parameter V on this offset surface.
143   Standard_EXPORT Standard_Real VReversedParameter (const Standard_Real V) const;
144   
145   //! Returns the parametric bounds U1, U2, V1 and V2 of
146   //! this offset surface.
147   //! If the surface is infinite, this function can return:
148   //! - Standard_Real::RealFirst(), or
149   //! - Standard_Real::RealLast().
150   Standard_EXPORT void Bounds (Standard_Real& U1, Standard_Real& U2, Standard_Real& V1, Standard_Real& V2) const;
151   
152
153   //! This method returns the continuity of the basis surface - 1.
154   //! Continuity of the Offset surface :
155   //! C0 : only geometric continuity,
156   //! C1 : continuity of the first derivative all along the Surface,
157   //! C2 : continuity of the second derivative all along the Surface,
158   //! C3 : continuity of the third derivative all along the Surface,
159   //! CN : the order of continuity is infinite.
160   //! Example :
161   //! If the basis surface is C2 in the V direction and C3 in the U
162   //! direction Shape = C1.
163   //! Warnings :
164   //! If the basis surface has a unique normal direction defined at
165   //! any point this method gives the continuity of the offset
166   //! surface otherwise the effective continuity can be lower than
167   //! the continuity of the basis surface - 1.
168   Standard_EXPORT GeomAbs_Shape Continuity() const;
169   
170
171   //! This method answer True if the continuity of the basis surface
172   //! is N + 1 in the U parametric direction. We suppose in this
173   //! class that a unique normal is defined at any point on the basis
174   //! surface.
175   //! Raised if N <0.
176   Standard_EXPORT Standard_Boolean IsCNu (const Standard_Integer N) const;
177   
178
179   //! This method answer True if the continuity of the basis surface
180   //! is N + 1 in the V parametric direction. We suppose in this
181   //! class that a unique normal is defined at any point on the basis
182   //! surface.
183   //! Raised if N <0.
184   Standard_EXPORT Standard_Boolean IsCNv (const Standard_Integer N) const;
185   
186   //! Checks whether this offset surface is closed in the u
187   //! parametric direction.
188   //! Returns true if, taking uFirst and uLast as
189   //! the parametric bounds in the u parametric direction,
190   //! the distance between the points P(uFirst,v)
191   //! and P(uLast,v) is less than or equal to
192   //! gp::Resolution() for each value of the   parameter v.
193   Standard_EXPORT Standard_Boolean IsUClosed() const;
194   
195   //! Checks whether this offset surface is closed in the u
196   //! or v parametric direction. Returns true if taking vFirst and vLast as the
197   //! parametric bounds in the v parametric direction, the
198   //! distance between the points P(u,vFirst) and
199   //! P(u,vLast) is less than or equal to
200   //! gp::Resolution() for each value of the parameter u.
201   Standard_EXPORT Standard_Boolean IsVClosed() const;
202   
203
204   //! Returns true if this offset surface is periodic in the u
205   //! parametric direction, i.e. if the basis
206   //! surface of this offset surface is periodic in this direction.
207   Standard_EXPORT Standard_Boolean IsUPeriodic() const;
208   
209   //! Returns the period of this offset surface in the u
210   //! parametric direction respectively, i.e. the period of the
211   //! basis surface of this offset surface in this parametric direction.
212   //! raises if the surface is not uperiodic.
213   Standard_EXPORT virtual Standard_Real UPeriod() const Standard_OVERRIDE;
214   
215
216   //! Returns true if this offset surface is periodic in the v
217   //! parametric direction, i.e. if the basis
218   //! surface of this offset surface is periodic in this direction.
219   Standard_EXPORT Standard_Boolean IsVPeriodic() const;
220   
221   //! Returns the period of this offset surface in the v
222   //! parametric direction respectively, i.e. the period of the
223   //! basis surface of this offset surface in this parametric direction.
224   //! raises if the surface is not vperiodic.
225   Standard_EXPORT virtual Standard_Real VPeriod() const Standard_OVERRIDE;
226   
227   //! Computes the U isoparametric curve.
228   Standard_EXPORT Handle(Geom_Curve) UIso (const Standard_Real U) const;
229   
230   //! Computes the V isoparametric curve.
231   //!
232   //! Te followings methods compute value and derivatives.
233   //!
234   //! Warnings
235   //! An exception is raised if a unique normal vector is
236   //! not defined on the basis surface for the parametric
237   //! value (U,V).
238   //! No check is done at the creation time and we suppose
239   //! in this package that the offset surface can be defined
240   //! at any point.
241   Standard_EXPORT Handle(Geom_Curve) VIso (const Standard_Real V) const;
242   
243
244   //! P (U, V) = Pbasis + Offset * Ndir   where
245   //! Ndir = D1Ubasis ^ D1Vbasis / ||D1Ubasis ^ D1Vbasis|| is the
246   //! normal direction of the basis surface. Pbasis, D1Ubasis,
247   //! D1Vbasis are the point and the first derivatives on the basis
248   //! surface.
249   //! If Ndir is undefined this method computes an approched normal
250   //! direction using the following limited development :
251   //! Ndir = N0 + DNdir/DU + DNdir/DV + Eps with Eps->0 which
252   //! requires to compute the second derivatives on the basis surface.
253   //! If the normal direction cannot be approximate for this order
254   //! of derivation the exception UndefinedValue is raised.
255   //!
256   //! Raised if the continuity of the basis surface is not C1.
257   //! Raised if the order of derivation required to compute the
258   //! normal direction is greater than the second order.
259   Standard_EXPORT void D0 (const Standard_Real U, const Standard_Real V, gp_Pnt& P) const;
260   
261
262   //! Raised if the continuity of the basis surface is not C2.
263   Standard_EXPORT void D1 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V) const;
264   
265   //! ---Purpose ;
266   //! Raised if the continuity of the basis surface is not C3.
267   Standard_EXPORT void D2 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV) const;
268   
269
270   //! Raised if the continuity of the basis surface is not C4.
271   Standard_EXPORT void D3 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV, gp_Vec& D3U, gp_Vec& D3V, gp_Vec& D3UUV, gp_Vec& D3UVV) const;
272   
273
274   //! Computes the derivative of order Nu in the direction u and Nv
275   //! in the direction v.
276   //! ---Purpose ;
277   //! Raised if the continuity of the basis surface is not CNu + 1
278   //! in the U direction and CNv + 1 in the V direction.
279   //! Raised if Nu + Nv < 1 or Nu < 0 or Nv < 0.
280   //!
281   //! The following methods compute the value and derivatives
282   //! on the offset surface and returns the derivatives on the
283   //! basis surface too.
284   //! The computation of the value and derivatives on the basis
285   //! surface are used to evaluate the offset surface.
286   //!
287   //! Warnings :
288   //! The exception UndefinedValue or UndefinedDerivative is
289   //! raised if it is not possible to compute a unique offset
290   //! direction.
291   Standard_EXPORT gp_Vec DN (const Standard_Real U, const Standard_Real V, const Standard_Integer Nu, const Standard_Integer Nv) const;
292   
293
294   //! P (U, V) = Pbasis + Offset * Ndir   where
295   //! Ndir = D1Ubasis ^ D1Vbasis / ||D1Ubasis ^ D1Vbasis|| is
296   //! the normal direction of the surface.
297   //! If Ndir is undefined this method computes an approched normal
298   //! direction using the following limited development :
299   //! Ndir = N0 + DNdir/DU + DNdir/DV + Eps with Eps->0 which
300   //! requires to compute the second derivatives on the basis surface.
301   //! If the normal direction cannot be approximate for this order
302   //! of derivation the exception UndefinedValue is raised.
303   //!
304   //! Raised if the continuity of the basis surface is not C1.
305   //! Raised if the order of derivation required to compute the normal
306   //! direction is greater than the second order.
307   Standard_EXPORT void Value (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Pnt& Pbasis, gp_Vec& D1Ubasis, gp_Vec& D1Vbasis) const;
308   
309
310   //! Raised if the continuity of the basis surface is not C2.
311   Standard_EXPORT void D1 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Pnt& Pbasis, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D1Ubasis, gp_Vec& D1Vbasis, gp_Vec& D2Ubasis, gp_Vec& D2Vbasis, gp_Vec& D2UVbasis) const;
312   
313
314   //! Raised if the continuity of the basis surface is not C3.
315   //! The  following  private  methods
316   //! includes common part of local  and  global methods
317   //! of  derivative  evaluations.
318   Standard_EXPORT void D2 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Pnt& Pbasis, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV, gp_Vec& D1Ubasis, gp_Vec& D1Vbasis, gp_Vec& D2Ubasis, gp_Vec& D2Vbasis, gp_Vec& D2UVbasis, gp_Vec& D3Ubasis, gp_Vec& D3Vbasis, gp_Vec& D3UUVbasis, gp_Vec& D3UVVbasis) const;
319   
320   Standard_EXPORT void LocalD0 (const Standard_Real U, const Standard_Real V, const Standard_Integer USide, const Standard_Integer VSide, gp_Pnt& P) const;
321   
322   Standard_EXPORT void LocalD1 (const Standard_Real U, const Standard_Real V, const Standard_Integer USide, const Standard_Integer VSide, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V) const;
323   
324   Standard_EXPORT void LocalD2 (const Standard_Real U, const Standard_Real V, const Standard_Integer USide, const Standard_Integer VSide, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV) const;
325   
326   Standard_EXPORT void LocalD3 (const Standard_Real U, const Standard_Real V, const Standard_Integer USide, const Standard_Integer VSide, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV, gp_Vec& D3U, gp_Vec& D3V, gp_Vec& D3UUV, gp_Vec& D3UVV) const;
327   
328   Standard_EXPORT gp_Vec LocalDN (const Standard_Real U, const Standard_Real V, const Standard_Integer USide, const Standard_Integer VSide, const Standard_Integer Nu, const Standard_Integer Nv) const;
329   
330
331   //! Applies the transformation T to this offset surface.
332   //! Note: the basis surface is also modified.
333   Standard_EXPORT void Transform (const gp_Trsf& T);
334   
335   //! Computes the  parameters on the  transformed  surface for
336   //! the transform of the point of parameters U,V on <me>.
337   //!
338   //! me->Transformed(T)->Value(U',V')
339   //!
340   //! is the same point as
341   //!
342   //! me->Value(U,V).Transformed(T)
343   //!
344   //! Where U',V' are the new values of U,V after calling
345   //!
346   //! me->TranformParameters(U,V,T)
347   //! This methods calls the basis surface method.
348   Standard_EXPORT virtual void TransformParameters (Standard_Real& U, Standard_Real& V, const gp_Trsf& T) const Standard_OVERRIDE;
349   
350   //! Returns a 2d transformation  used to find the  new
351   //! parameters of a point on the transformed surface.
352   //!
353   //! me->Transformed(T)->Value(U',V')
354   //!
355   //! is the same point as
356   //!
357   //! me->Value(U,V).Transformed(T)
358   //!
359   //! Where U',V' are  obtained by transforming U,V with
360   //! th 2d transformation returned by
361   //!
362   //! me->ParametricTransformation(T)
363   //!
364   //! This methods calls the basis surface method.
365   Standard_EXPORT virtual gp_GTrsf2d ParametricTransformation (const gp_Trsf& T) const Standard_OVERRIDE;
366   
367   //! Creates a new object which is a copy of this offset surface.
368   Standard_EXPORT Handle(Geom_Geometry) Copy() const;
369   
370   //! returns an  equivalent surface of the offset surface
371   //! when  the basis surface   is a canonic  surface or a
372   //! rectangular  limited surface on canonic surface or if
373   //! the offset is null.
374   Standard_EXPORT Handle(Geom_Surface) Surface() const;
375   
376   //! if Standard_True, L is  the local osculating surface
377   //! along U at  the point U,V.   It means that  DL/DU is
378   //! collinear to DS/DU .  If IsOpposite == Standard_True
379   //! these vectors have opposite direction.
380   Standard_EXPORT Standard_Boolean UOsculatingSurface (const Standard_Real U, const Standard_Real V, Standard_Boolean& IsOpposite, Handle(Geom_BSplineSurface)& UOsculSurf) const;
381   
382   //! if Standard_True, L is the local osculating surface
383   //! along V at the point U,V.
384   //! It means that  DL/DV is
385   //! collinear to DS/DV .  If IsOpposite == Standard_True
386   //! these vectors have opposite direction.
387   Standard_EXPORT Standard_Boolean VOsculatingSurface (const Standard_Real U, const Standard_Real V, Standard_Boolean& IsOpposite, Handle(Geom_BSplineSurface)& VOsculSurf) const;
388   
389   //! Returns continuity of the basis surface.
390   inline GeomAbs_Shape GetBasisSurfContinuity() const
391   { return myBasisSurfContinuity; }
392
393   DEFINE_STANDARD_RTTI(Geom_OffsetSurface,Geom_Surface)
394
395 private:
396
397   
398   Standard_EXPORT void SetD0 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, const gp_Vec& D1U, const gp_Vec& D1V) const;
399   
400   Standard_EXPORT void SetD1 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, const gp_Vec& d2u, const gp_Vec& d2v, const gp_Vec& d2uv) const;
401   
402   Standard_EXPORT void SetD2 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV, const gp_Vec& d3u, const gp_Vec& d3v, const gp_Vec& d3uuv, const gp_Vec& d3uvv) const;
403   
404   Standard_EXPORT void SetD3 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV, gp_Vec& D3U, gp_Vec& D3V, gp_Vec& D3UUV, gp_Vec& D3UVV) const;
405   
406   //! The following  functions  evaluates the  local
407   //! derivatives on surface. Useful to manage discontinuities
408   //! on the surface.
409   //! if    Side  =  1  ->  P  =  S( U+,V )
410   //! if    Side  = -1  ->  P  =  S( U-,V )
411   //! else  P  is betveen discontinuities
412   //! can be evaluated using methods  of
413   //! global evaluations    P  =  S( U ,V )
414   Standard_EXPORT gp_Vec SetDN (const Standard_Real U, const Standard_Real V, const Standard_Integer Nu, const Standard_Integer Nv, const gp_Vec& D1U, const gp_Vec& D1V) const;
415   
416   //! This  method locates U,V parameters on basis BSpline surface
417   //! and calls LocalDi or Di methods corresponding an order
418   //! of derivative and  position
419   //! of UV-point relatively the surface discontinuities.
420   Standard_EXPORT void LocateSides (const Standard_Real U, const Standard_Real V, const Standard_Integer USide, const Standard_Integer VSide, const Handle(Geom_BSplineSurface)& BSplS, const Standard_Integer NDir, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V, gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV, gp_Vec& D3U, gp_Vec& D3V, gp_Vec& D3UUV, gp_Vec& D3UVV) const;
421
422   Handle(Geom_Surface) basisSurf;
423   Handle(Geom_Surface) equivSurf;
424   Standard_Real offsetValue;
425   Geom_OsculatingSurface myOscSurf;
426   GeomAbs_Shape myBasisSurfContinuity;
427 };
428
429 #endif // _Geom_OffsetSurface_HeaderFile