0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
[occt.git] / src / Geom / Geom_BezierSurface.hxx
CommitLineData
42cf5bc1 1// Created on: 1993-03-09
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_BezierSurface_HeaderFile
18#define _Geom_BezierSurface_HeaderFile
19
20#include <Standard.hxx>
21#include <Standard_Type.hxx>
22
23#include <Standard_Boolean.hxx>
24#include <TColgp_HArray2OfPnt.hxx>
25#include <TColStd_HArray2OfReal.hxx>
26#include <Standard_Real.hxx>
27#include <Standard_Integer.hxx>
28#include <Geom_BoundedSurface.hxx>
29#include <TColgp_Array2OfPnt.hxx>
30#include <TColStd_Array2OfReal.hxx>
31#include <TColgp_Array1OfPnt.hxx>
32#include <TColStd_Array1OfReal.hxx>
33#include <GeomAbs_Shape.hxx>
c8b5b3d8 34#include <BSplSLib.hxx>
35
42cf5bc1 36class Standard_ConstructionError;
37class Standard_DimensionError;
38class Standard_RangeError;
39class Standard_OutOfRange;
40class gp_Pnt;
41class gp_Vec;
42class Geom_Curve;
43class gp_Trsf;
44class Geom_Geometry;
45
46
47class Geom_BezierSurface;
48DEFINE_STANDARD_HANDLE(Geom_BezierSurface, Geom_BoundedSurface)
49
50//! Describes a rational or non-rational Bezier surface.
51//! - A non-rational Bezier surface is defined by a table
52//! of poles (also known as control points).
53//! - A rational Bezier surface is defined by a table of
54//! poles with varying associated weights.
55//! This data is manipulated using two associative 2D arrays:
56//! - the poles table, which is a 2D array of gp_Pnt, and
57//! - the weights table, which is a 2D array of reals.
58//! The bounds of these arrays are:
59//! - 1 and NbUPoles for the row bounds, where
60//! NbUPoles is the number of poles of the surface
61//! in the u parametric direction, and
62//! - 1 and NbVPoles for the column bounds, where
63//! NbVPoles is the number of poles of the surface
64//! in the v parametric direction.
65//! The poles of the surface, the "control points", are the
66//! points used to shape and reshape the surface. They
67//! comprise a rectangular network of points:
68//! - The points (1, 1), (NbUPoles, 1), (1,
69//! NbVPoles) and (NbUPoles, NbVPoles)
70//! are the four parametric "corners" of the surface.
71//! - The first column of poles and the last column of
72//! poles define two Bezier curves which delimit the
73//! surface in the v parametric direction. These are
74//! the v isoparametric curves corresponding to
75//! values 0 and 1 of the v parameter.
76//! - The first row of poles and the last row of poles
77//! define two Bezier curves which delimit the surface
78//! in the u parametric direction. These are the u
79//! isoparametric curves corresponding to values 0
80//! and 1 of the u parameter.
81//! It is more difficult to define a geometrical significance
82//! for the weights. However they are useful for
83//! representing a quadric surface precisely. Moreover, if
84//! the weights of all the poles are equal, the surface has
85//! a polynomial equation, and hence is a "non-rational surface".
86//! The non-rational surface is a special, but frequently
87//! used, case, where all poles have identical weights.
88//! The weights are defined and used only in the case of
89//! a rational surface. This rational characteristic is
90//! defined in each parametric direction. Hence, a
91//! surface can be rational in the u parametric direction,
92//! and non-rational in the v parametric direction.
93//! Likewise, the degree of a surface is defined in each
94//! parametric direction. The degree of a Bezier surface
95//! in a given parametric direction is equal to the number
96//! of poles of the surface in that parametric direction,
97//! minus 1. This must be greater than or equal to 1.
98//! However, the degree for a Geom_BezierSurface is
99//! limited to a value of (25) which is defined and
100//! controlled by the system. This value is returned by the
101//! function MaxDegree.
102//! The parameter range for a Bezier surface is [ 0, 1 ]
103//! in the two parametric directions.
104//! A Bezier surface can also be closed, or open, in each
105//! parametric direction. If the first row of poles is
106//! identical to the last row of poles, the surface is closed
107//! in the u parametric direction. If the first column of
108//! poles is identical to the last column of poles, the
109//! surface is closed in the v parametric direction.
110//! The continuity of a Bezier surface is infinite in the u
111//! parametric direction and the in v parametric direction.
112//! Note: It is not possible to build a Bezier surface with
113//! negative weights. Any weight value that is less than,
114//! or equal to, gp::Resolution() is considered
115//! to be zero. Two weight values, W1 and W2, are
116//! considered equal if: |W2-W1| <= gp::Resolution()
117class Geom_BezierSurface : public Geom_BoundedSurface
118{
119
120public:
121
122
123
124 //! Creates a non-rational Bezier surface with a set of poles.
125 //! Control points representation :
126 //! SPoles(Uorigin,Vorigin) ...................SPoles(Uorigin,Vend)
127 //! . .
128 //! . .
129 //! SPoles(Uend, Vorigin) .....................SPoles(Uend, Vend)
130 //! For the double array the row indice corresponds to the parametric
131 //! U direction and the columns indice corresponds to the parametric
132 //! V direction.
133 //! The weights are defaulted to all being 1.
134 //!
135 //! Raised if the number of poles of the surface is lower than 2
136 //! or greater than MaxDegree + 1 in one of the two directions
137 //! U or V.
138 Standard_EXPORT Geom_BezierSurface(const TColgp_Array2OfPnt& SurfacePoles);
139
140 //! ---Purpose
141 //! Creates a rational Bezier surface with a set of poles and a
142 //! set of weights.
143 //! For the double array the row indice corresponds to the parametric
144 //! U direction and the columns indice corresponds to the parametric
145 //! V direction.
146 //! If all the weights are identical the surface is considered as
147 //! non-rational (the tolerance criterion is Resolution from package
148 //! gp).
149 //!
150 //! Raised if SurfacePoles and PoleWeights have not the same
151 //! Rowlength or have not the same ColLength.
152 //! Raised if PoleWeights (i, j) <= Resolution from gp;
153 //! Raised if the number of poles of the surface is lower than 2
154 //! or greater than MaxDegree + 1 in one of the two directions U or V.
155 Standard_EXPORT Geom_BezierSurface(const TColgp_Array2OfPnt& SurfacePoles, const TColStd_Array2OfReal& PoleWeights);
156
157 //! Exchanges the direction U and V on a Bezier surface
158 //! As a consequence:
159 //! - the poles and weights tables are transposed,
160 //! - degrees, rational characteristics and so on are
161 //! exchanged between the two parametric directions, and
162 //! - the orientation of the surface is reversed.
163 Standard_EXPORT void ExchangeUV();
164
165 //! Increases the degree of this Bezier surface in the two parametric directions.
166 //!
167 //! Raised if UDegree < UDegree <me> or VDegree < VDegree <me>
168 //! Raised if the degree of the surface is greater than MaxDegree
169 //! in one of the two directions U or V.
170 Standard_EXPORT void Increase (const Standard_Integer UDeg, const Standard_Integer VDeg);
171
172
173 //! Inserts a column of poles. If the surface is rational the weights
174 //! values associated with CPoles are equal defaulted to 1.
175 //!
176 //! Raised if Vindex < 1 or VIndex > NbVPoles.
177 //!
178 //! raises if VDegree is greater than MaxDegree.
179 //! raises if the Length of CPoles is not equal to NbUPoles
180 Standard_EXPORT void InsertPoleColAfter (const Standard_Integer VIndex, const TColgp_Array1OfPnt& CPoles);
181
182
183 //! Inserts a column of poles and weights.
184 //! If the surface was non-rational it can become rational.
185 //!
186 //! Raised if Vindex < 1 or VIndex > NbVPoles.
187 //! Raised if
188 //! . VDegree is greater than MaxDegree.
189 //! . the Length of CPoles is not equal to NbUPoles
190 //! . a weight value is lower or equal to Resolution from
191 //! package gp
192 Standard_EXPORT void InsertPoleColAfter (const Standard_Integer VIndex, const TColgp_Array1OfPnt& CPoles, const TColStd_Array1OfReal& CPoleWeights);
193
194
195 //! Inserts a column of poles. If the surface is rational the weights
196 //! values associated with CPoles are equal defaulted to 1.
197 //!
198 //! Raised if Vindex < 1 or VIndex > NbVPoles.
199 //!
200 //! Raised if VDegree is greater than MaxDegree.
201 //! Raised if the Length of CPoles is not equal to NbUPoles
202 Standard_EXPORT void InsertPoleColBefore (const Standard_Integer VIndex, const TColgp_Array1OfPnt& CPoles);
203
204
205 //! Inserts a column of poles and weights.
206 //! If the surface was non-rational it can become rational.
207 //!
208 //! Raised if Vindex < 1 or VIndex > NbVPoles.
209 //! Raised if :
210 //! . VDegree is greater than MaxDegree.
211 //! . the Length of CPoles is not equal to NbUPoles
212 //! . a weight value is lower or equal to Resolution from
213 //! package gp
214 Standard_EXPORT void InsertPoleColBefore (const Standard_Integer VIndex, const TColgp_Array1OfPnt& CPoles, const TColStd_Array1OfReal& CPoleWeights);
215
216
217 //! Inserts a row of poles. If the surface is rational the weights
218 //! values associated with CPoles are equal defaulted to 1.
219 //!
220 //! Raised if Uindex < 1 or UIndex > NbUPoles.
221 //!
222 //! Raised if UDegree is greater than MaxDegree.
223 //! Raised if the Length of CPoles is not equal to NbVPoles
224 Standard_EXPORT void InsertPoleRowAfter (const Standard_Integer UIndex, const TColgp_Array1OfPnt& CPoles);
225
226
227 //! Inserts a row of poles and weights.
228 //! If the surface was non-rational it can become rational.
229 //!
230 //! Raised if Uindex < 1 or UIndex > NbUPoles.
231 //! Raised if :
232 //! . UDegree is greater than MaxDegree.
233 //! . the Length of CPoles is not equal to NbVPoles
234 //! . a weight value is lower or equal to Resolution from
235 //! package gp
236 Standard_EXPORT void InsertPoleRowAfter (const Standard_Integer UIndex, const TColgp_Array1OfPnt& CPoles, const TColStd_Array1OfReal& CPoleWeights);
237
238
239 //! Inserts a row of poles. If the surface is rational the weights
240 //! values associated with CPoles are equal defaulted to 1.
241 //!
242 //! Raised if Uindex < 1 or UIndex > NbUPoles.
243 //!
244 //! Raised if UDegree is greater than MaxDegree.
245 //! Raised if the Length of CPoles is not equal to NbVPoles
246 Standard_EXPORT void InsertPoleRowBefore (const Standard_Integer UIndex, const TColgp_Array1OfPnt& CPoles);
247
248
249 //! Inserts a row of poles and weights.
250 //! If the surface was non-rational it can become rational.
251 //!
252 //! Raised if Uindex < 1 or UIndex > NbUPoles.
253 //! Raised if :
254 //! . UDegree is greater than MaxDegree.
255 //! . the Length of CPoles is not equal to NbVPoles
256 //! . a weight value is lower or equal to Resolution from
257 //! pacakage gp
258 Standard_EXPORT void InsertPoleRowBefore (const Standard_Integer UIndex, const TColgp_Array1OfPnt& CPoles, const TColStd_Array1OfReal& CPoleWeights);
259
260 //! Removes a column of poles.
261 //! If the surface was rational it can become non-rational.
262 //!
263 //! Raised if NbVPoles <= 2 after removing, a Bezier surface
264 //! must have at least two columns of poles.
265 //! Raised if Vindex < 1 or VIndex > NbVPoles
266 Standard_EXPORT void RemovePoleCol (const Standard_Integer VIndex);
267
268 //! Removes a row of poles.
269 //! If the surface was rational it can become non-rational.
270 //!
271 //! Raised if NbUPoles <= 2 after removing, a Bezier surface
272 //! must have at least two rows of poles.
273 //! Raised if Uindex < 1 or UIndex > NbUPoles
274 Standard_EXPORT void RemovePoleRow (const Standard_Integer UIndex);
275
276 //! Modifies this Bezier surface by segmenting it
277 //! between U1 and U2 in the u parametric direction,
278 //! and between V1 and V2 in the v parametric
279 //! direction. U1, U2, V1, and V2 can be outside the
280 //! bounds of this surface.
281 //! - U1 and U2 isoparametric Bezier curves,
282 //! segmented between V1 and V2, become the two
283 //! bounds of the surface in the v parametric
284 //! direction (0. and 1. u isoparametric curves).
285 //! - V1 and V2 isoparametric Bezier curves,
286 //! segmented between U1 and U2, become the two
287 //! bounds of the surface in the u parametric
288 //! direction (0. and 1. v isoparametric curves).
289 //! The poles and weights tables are modified, but the
290 //! degree of this surface in the u and v parametric
291 //! directions does not change.
292 //! U1 can be greater than U2, and V1 can be greater
293 //! than V2. In these cases, the corresponding
294 //! parametric direction is inverted. The orientation of
295 //! the surface is inverted if one (and only one)
296 //! parametric direction is inverted.
297 Standard_EXPORT void Segment (const Standard_Real U1, const Standard_Real U2, const Standard_Real V1, const Standard_Real V2);
298
299 //! Modifies a pole value.
300 //! If the surface is rational the weight of range (UIndex, VIndex)
301 //! is not modified.
302 //!
303 //! Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1
304 //! or VIndex > NbVPoles.
305 Standard_EXPORT void SetPole (const Standard_Integer UIndex, const Standard_Integer VIndex, const gp_Pnt& P);
306
307
308 //! Substitutes the pole and the weight of range UIndex, VIndex.
309 //! If the surface <me> is not rational it can become rational.
310 //! if the surface was rational it can become non-rational.
311 //!
312 //! raises if UIndex < 1 or UIndex > NbUPoles or VIndex < 1
313 //! or VIndex > NbVPoles.
314 //! Raised if Weight <= Resolution from package gp.
315 Standard_EXPORT void SetPole (const Standard_Integer UIndex, const Standard_Integer VIndex, const gp_Pnt& P, const Standard_Real Weight);
316
317 //! Modifies a column of poles.
318 //! The length of CPoles can be lower but not greater than NbUPoles
319 //! so you can modify just a part of the column.
320 //! Raised if VIndex < 1 or VIndex > NbVPoles
321 //!
322 //! Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbUPoles
323 Standard_EXPORT void SetPoleCol (const Standard_Integer VIndex, const TColgp_Array1OfPnt& CPoles);
324
325 //! Modifies a column of poles.
326 //! If the surface was rational it can become non-rational
327 //! If the surface was non-rational it can become rational.
328 //! The length of CPoles can be lower but not greater than NbUPoles
329 //! so you can modify just a part of the column.
330 //! Raised if VIndex < 1 or VIndex > NbVPoles
331 //!
332 //! Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbUPoles
333 //! Raised if CPoleWeights and CPoles have not the same bounds.
334 //! Raised if one of the weight value CPoleWeights (i) is lower
335 //! or equal to Resolution from package gp.
336 Standard_EXPORT void SetPoleCol (const Standard_Integer VIndex, const TColgp_Array1OfPnt& CPoles, const TColStd_Array1OfReal& CPoleWeights);
337
338 //! Modifies a row of poles.
339 //! The length of CPoles can be lower but not greater than NbVPoles
340 //! so you can modify just a part of the row.
341 //! Raised if UIndex < 1 or UIndex > NbUPoles
342 //!
343 //! Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbVPoles
344 Standard_EXPORT void SetPoleRow (const Standard_Integer UIndex, const TColgp_Array1OfPnt& CPoles);
345
346 //! Modifies a row of poles and weights.
347 //! If the surface was rational it can become non-rational.
348 //! If the surface was non-rational it can become rational.
349 //! The length of CPoles can be lower but not greater than NbVPoles
350 //! so you can modify just a part of the row.
351 //! Raised if UIndex < 1 or UIndex > NbUPoles
352 //!
353 //! Raised if CPoles.Lower() < 1 or CPoles.Upper() > NbVPoles
354 //! Raised if CPoleWeights and CPoles have not the same bounds.
355 //! Raised if one of the weight value CPoleWeights (i) is lower
356 //! or equal to Resolution from gp.
357 Standard_EXPORT void SetPoleRow (const Standard_Integer UIndex, const TColgp_Array1OfPnt& CPoles, const TColStd_Array1OfReal& CPoleWeights);
358
359
360 //! Modifies the weight of the pole of range UIndex, VIndex.
361 //! If the surface was non-rational it can become rational.
362 //! If the surface was rational it can become non-rational.
363 //!
364 //! Raised if UIndex < 1 or UIndex > NbUPoles or VIndex < 1 or
365 //! VIndex > NbVPoles.
366 //! Raised if Weight <= Resolution from package gp.
367 Standard_EXPORT void SetWeight (const Standard_Integer UIndex, const Standard_Integer VIndex, const Standard_Real Weight);
368
369 //! Modifies a column of weights.
370 //! If the surface was rational it can become non-rational.
371 //! If the surface was non-rational it can become rational.
372 //! The length of CPoleWeights can be lower but not greater than
373 //! NbUPoles.
374 //! Raised if VIndex < 1 or VIndex > NbVPoles
375 //!
376 //! Raised if CPoleWeights.Lower() < 1 or CPoleWeights.Upper() >
377 //! NbUPoles
378 //! Raised if one of the weight value CPoleWeights (i) is lower
379 //! or equal to Resolution from package gp.
380 Standard_EXPORT void SetWeightCol (const Standard_Integer VIndex, const TColStd_Array1OfReal& CPoleWeights);
381
382 //! Modifies a row of weights.
383 //! If the surface was rational it can become non-rational.
384 //! If the surface was non-rational it can become rational.
385 //! The length of CPoleWeights can be lower but not greater than
386 //! NbVPoles.
387 //! Raised if UIndex < 1 or UIndex > NbUPoles
388 //!
389 //! Raised if CPoleWeights.Lower() < 1 or CPoleWeights.Upper() >
390 //! NbVPoles
391 //! Raised if one of the weight value CPoleWeights (i) is lower
392 //! or equal to Resolution from package gp.
393 Standard_EXPORT void SetWeightRow (const Standard_Integer UIndex, const TColStd_Array1OfReal& CPoleWeights);
394
395 //! Changes the orientation of this Bezier surface in the
396 //! u parametric direction. The bounds of the
397 //! surface are not changed, but the given parametric
398 //! direction is reversed. Hence, the orientation of the surface is reversed.
79104795 399 Standard_EXPORT void UReverse() Standard_OVERRIDE;
42cf5bc1 400
401 //! Computes the u (or v) parameter on the modified
402 //! surface, produced by reversing its u (or v) parametric
403 //! direction, for any point of u parameter U (or of v
404 //! parameter V) on this Bezier surface.
405 //! In the case of a Bezier surface, these functions return respectively:
406 //! - 1.-U, or 1.-V.
79104795 407 Standard_EXPORT Standard_Real UReversedParameter (const Standard_Real U) const Standard_OVERRIDE;
42cf5bc1 408
409 //! Changes the orientation of this Bezier surface in the
410 //! v parametric direction. The bounds of the
411 //! surface are not changed, but the given parametric
412 //! direction is reversed. Hence, the orientation of the
413 //! surface is reversed.
79104795 414 Standard_EXPORT void VReverse() Standard_OVERRIDE;
42cf5bc1 415
416 //! Computes the u (or v) parameter on the modified
417 //! surface, produced by reversing its u (or v) parametric
418 //! direction, for any point of u parameter U (or of v
419 //! parameter V) on this Bezier surface.
420 //! In the case of a Bezier surface, these functions return respectively:
421 //! - 1.-U, or 1.-V.
79104795 422 Standard_EXPORT Standard_Real VReversedParameter (const Standard_Real V) const Standard_OVERRIDE;
42cf5bc1 423
424 //! Returns the parametric bounds U1, U2, V1 and V2 of
425 //! this Bezier surface.
426 //! In the case of a Bezier surface, this function returns
427 //! U1 = 0, V1 = 0, U2 = 1, V2 = 1.
79104795 428 Standard_EXPORT void Bounds (Standard_Real& U1, Standard_Real& U2, Standard_Real& V1, Standard_Real& V2) const Standard_OVERRIDE;
42cf5bc1 429
430
431 //! Returns the continuity of the surface CN : the order of
432 //! continuity is infinite.
79104795 433 Standard_EXPORT GeomAbs_Shape Continuity() const Standard_OVERRIDE;
42cf5bc1 434
79104795 435 Standard_EXPORT void D0 (const Standard_Real U, const Standard_Real V, gp_Pnt& P) const Standard_OVERRIDE;
42cf5bc1 436
79104795 437 Standard_EXPORT void D1 (const Standard_Real U, const Standard_Real V, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V) const Standard_OVERRIDE;
42cf5bc1 438
79104795 439 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 Standard_OVERRIDE;
42cf5bc1 440
441 //! Computes P, the point of parameters (U, V) of this Bezier surface, and
442 //! - one or more of the following sets of vectors:
443 //! - D1U and D1V, the first derivative vectors at this point,
444 //! - D2U, D2V and D2UV, the second derivative
445 //! vectors at this point,
446 //! - D3U, D3V, D3UUV and D3UVV, the third
447 //! derivative vectors at this point.
448 //! Note: The parameters U and V can be outside the bounds of the surface.
79104795 449 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 Standard_OVERRIDE;
42cf5bc1 450
451 //! Computes the derivative of order Nu in the u
452 //! parametric direction, and Nv in the v parametric
453 //! direction, at the point of parameters (U, V) of this Bezier surface.
454 //! Note: The parameters U and V can be outside the bounds of the surface.
455 //! Exceptions
456 //! Standard_RangeError if:
457 //! - Nu + Nv is less than 1, or Nu or Nv is negative.
79104795 458 Standard_EXPORT gp_Vec DN (const Standard_Real U, const Standard_Real V, const Standard_Integer Nu, const Standard_Integer Nv) const Standard_OVERRIDE;
42cf5bc1 459
460 //! Returns the number of poles in the U direction.
461 Standard_EXPORT Standard_Integer NbUPoles() const;
462
463 //! Returns the number of poles in the V direction.
464 Standard_EXPORT Standard_Integer NbVPoles() const;
465
466 //! Returns the pole of range UIndex, VIndex
467 //! Raised if UIndex < 1 or UIndex > NbUPoles, or
468 //! VIndex < 1 or VIndex > NbVPoles.
469 Standard_EXPORT gp_Pnt Pole (const Standard_Integer UIndex, const Standard_Integer VIndex) const;
470
471 //! Returns the poles of the Bezier surface.
472 //!
473 //! Raised if the length of P in the U an V direction is not equal to
474 //! NbUPoles and NbVPoles.
475 Standard_EXPORT void Poles (TColgp_Array2OfPnt& P) const;
c8b5b3d8 476
477 //! Returns the poles of the Bezier surface.
478 const TColgp_Array2OfPnt& Poles() const
479 {
480 return poles->Array2();
481 }
42cf5bc1 482
483 //! Returns the degree of the surface in the U direction it is
484 //! NbUPoles - 1
485 Standard_EXPORT Standard_Integer UDegree() const;
486
487
488 //! Computes the U isoparametric curve. For a Bezier surface the
489 //! UIso curve is a Bezier curve.
79104795 490 Standard_EXPORT Handle(Geom_Curve) UIso (const Standard_Real U) const Standard_OVERRIDE;
42cf5bc1 491
492
493 //! Returns the degree of the surface in the V direction it is
494 //! NbVPoles - 1
495 Standard_EXPORT Standard_Integer VDegree() const;
496
497
498 //! Computes the V isoparametric curve. For a Bezier surface the
499 //! VIso curve is a Bezier curve.
79104795 500 Standard_EXPORT Handle(Geom_Curve) VIso (const Standard_Real V) const Standard_OVERRIDE;
42cf5bc1 501
502 //! Returns the weight of range UIndex, VIndex
503 //!
504 //! Raised if UIndex < 1 or UIndex > NbUPoles, or
505 //! VIndex < 1 or VIndex > NbVPoles.
506 Standard_EXPORT Standard_Real Weight (const Standard_Integer UIndex, const Standard_Integer VIndex) const;
507
508 //! Returns the weights of the Bezier surface.
509 //!
510 //! Raised if the length of W in the U an V direction is not
511 //! equal to NbUPoles and NbVPoles.
512 Standard_EXPORT void Weights (TColStd_Array2OfReal& W) const;
513
c8b5b3d8 514 //! Returns the weights of the Bezier surface.
515 const TColStd_Array2OfReal* Weights() const
516 {
517 if (!weights.IsNull())
518 return &weights->Array2();
519 return BSplSLib::NoWeights();
520 }
42cf5bc1 521
522 //! Returns True if the first control points row and the
523 //! last control points row are identical. The tolerance
524 //! criterion is Resolution from package gp.
79104795 525 Standard_EXPORT Standard_Boolean IsUClosed() const Standard_OVERRIDE;
42cf5bc1 526
527
528 //! Returns True if the first control points column
529 //! and the last control points column are identical.
530 //! The tolerance criterion is Resolution from package gp.
79104795 531 Standard_EXPORT Standard_Boolean IsVClosed() const Standard_OVERRIDE;
42cf5bc1 532
533 //! Returns True, a Bezier surface is always CN
79104795 534 Standard_EXPORT Standard_Boolean IsCNu (const Standard_Integer N) const Standard_OVERRIDE;
42cf5bc1 535
536 //! Returns True, a BezierSurface is always CN
79104795 537 Standard_EXPORT Standard_Boolean IsCNv (const Standard_Integer N) const Standard_OVERRIDE;
42cf5bc1 538
539 //! Returns False.
79104795 540 Standard_EXPORT Standard_Boolean IsUPeriodic() const Standard_OVERRIDE;
42cf5bc1 541
542 //! Returns False.
79104795 543 Standard_EXPORT Standard_Boolean IsVPeriodic() const Standard_OVERRIDE;
42cf5bc1 544
545
546 //! Returns False if the weights are identical in the U direction,
547 //! The tolerance criterion is Resolution from package gp.
548 //! Example :
549 //! |1.0, 1.0, 1.0|
550 //! if Weights = |0.5, 0.5, 0.5| returns False
551 //! |2.0, 2.0, 2.0|
552 Standard_EXPORT Standard_Boolean IsURational() const;
553
554
555 //! Returns False if the weights are identical in the V direction,
556 //! The tolerance criterion is Resolution from package gp.
557 //! Example :
558 //! |1.0, 2.0, 0.5|
559 //! if Weights = |1.0, 2.0, 0.5| returns False
560 //! |1.0, 2.0, 0.5|
561 Standard_EXPORT Standard_Boolean IsVRational() const;
562
563 //! Applies the transformation T to this Bezier surface.
79104795 564 Standard_EXPORT void Transform (const gp_Trsf& T) Standard_OVERRIDE;
42cf5bc1 565
566
567 //! Returns the value of the maximum polynomial degree of a
568 //! Bezier surface. This value is 25.
569 Standard_EXPORT static Standard_Integer MaxDegree();
570
571 //! Computes two tolerance values for this Bezier
572 //! surface, based on the given tolerance in 3D space
573 //! Tolerance3D. The tolerances computed are:
574 //! - UTolerance in the u parametric direction, and
575 //! - VTolerance in the v parametric direction.
576 //! If f(u,v) is the equation of this Bezier surface,
577 //! UTolerance and VTolerance guarantee that:
578 //! | u1 - u0 | < UTolerance and
579 //! | v1 - v0 | < VTolerance
580 //! ====> |f (u1,v1) - f (u0,v0)| < Tolerance3D
581 Standard_EXPORT void Resolution (const Standard_Real Tolerance3D, Standard_Real& UTolerance, Standard_Real& VTolerance);
582
583 //! Creates a new object which is a copy of this Bezier surface.
79104795 584 Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE;
42cf5bc1 585
586
587
588
92efcf78 589 DEFINE_STANDARD_RTTIEXT(Geom_BezierSurface,Geom_BoundedSurface)
42cf5bc1 590
591protected:
592
593
594
595
596private:
597
598
c8b5b3d8 599 Geom_BezierSurface(const Handle(TColgp_HArray2OfPnt)& SurfacePoles, const Handle(TColStd_HArray2OfReal)& PoleWeights, const Standard_Boolean IsURational, const Standard_Boolean IsVRational);
42cf5bc1 600
601 //! Set poles to Poles, weights to Weights (not
602 //! copied).
603 //! Create the arrays of coefficients. Poles
604 //! and Weights are assumed to have the first
605 //! coefficient 1.
606 //!
607 //! if nbpoles < 2 or nbpoles > MaDegree
c8b5b3d8 608 void Init (const Handle(TColgp_HArray2OfPnt)& Poles, const Handle(TColStd_HArray2OfReal)& Weights);
42cf5bc1 609
42cf5bc1 610
611 Standard_Boolean urational;
612 Standard_Boolean vrational;
613 Handle(TColgp_HArray2OfPnt) poles;
614 Handle(TColStd_HArray2OfReal) weights;
42cf5bc1 615 Standard_Real umaxderivinv;
616 Standard_Real vmaxderivinv;
617 Standard_Boolean maxderivinvok;
618
619
620};
621
622
623
624
625
626
627
628#endif // _Geom_BezierSurface_HeaderFile