42cf5bc1 |
1 | // Created on: 1995-11-02 |
2 | // Created by: Jacques GOUSSARD |
3 | // Copyright (c) 1995-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 _GCPnts_QuasiUniformDeflection_HeaderFile |
18 | #define _GCPnts_QuasiUniformDeflection_HeaderFile |
19 | |
9bf3ef83 |
20 | #include <StdFail_NotDone.hxx> |
42cf5bc1 |
21 | #include <TColStd_SequenceOfReal.hxx> |
22 | #include <TColgp_SequenceOfPnt.hxx> |
23 | #include <GeomAbs_Shape.hxx> |
9bf3ef83 |
24 | |
42cf5bc1 |
25 | class Standard_DomainError; |
26 | class Standard_ConstructionError; |
27 | class Standard_OutOfRange; |
28 | class StdFail_NotDone; |
29 | class Adaptor3d_Curve; |
30 | class Adaptor2d_Curve2d; |
31 | class gp_Pnt; |
32 | |
42cf5bc1 |
33 | //! This class computes a distribution of points on a |
34 | //! curve. The points may respect the deflection. The algorithm |
35 | //! is not based on the classical prediction (with second |
36 | //! derivative of curve), but either on the evaluation of |
37 | //! the distance between the mid point and the point of |
38 | //! mid parameter of the two points, or the distance |
39 | //! between the mid point and the point at parameter 0.5 |
40 | //! on the cubic interpolation of the two points and their |
41 | //! tangents. |
42 | //! Note: this algorithm is faster than a |
43 | //! GCPnts_UniformDeflection algorithm, and is |
44 | //! able to work with non-"C2" continuous curves. |
45 | //! However, it generates more points in the distribution. |
46 | class GCPnts_QuasiUniformDeflection |
47 | { |
48 | public: |
49 | |
50 | DEFINE_STANDARD_ALLOC |
51 | |
52 | |
53 | //! Constructs an empty algorithm. To define the problem |
54 | //! to be solved, use the function Initialize. |
55 | Standard_EXPORT GCPnts_QuasiUniformDeflection(); |
56 | |
57 | //! Computes a QuasiUniform Deflection distribution |
58 | //! of points on the Curve <C>. |
37782ec2 |
59 | Standard_EXPORT GCPnts_QuasiUniformDeflection(const Adaptor3d_Curve& C, const Standard_Real Deflection, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
60 | |
61 | //! Computes a QuasiUniform Deflection distribution |
62 | //! of points on the Curve <C>. |
37782ec2 |
63 | Standard_EXPORT GCPnts_QuasiUniformDeflection(const Adaptor2d_Curve2d& C, const Standard_Real Deflection, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
64 | |
65 | //! Computes a QuasiUniform Deflection distribution |
66 | //! of points on a part of the Curve <C>. |
37782ec2 |
67 | Standard_EXPORT GCPnts_QuasiUniformDeflection(const Adaptor3d_Curve& C, const Standard_Real Deflection, const Standard_Real U1, const Standard_Real U2, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
68 | |
69 | //! Computes a QuasiUniform Deflection distribution |
70 | //! of points on a part of the Curve <C>. |
71 | //! This and the above algorithms compute a distribution of points: |
72 | //! - on the curve C, or |
73 | //! - on the part of curve C limited by the two |
74 | //! parameter values U1 and U2, |
75 | //! where the deflection resulting from the distributed |
76 | //! points is not greater than Deflection. |
77 | //! The first point of the distribution is either the origin of |
78 | //! curve C or the point of parameter U1. The last point |
79 | //! of the distribution is either the end point of curve C or |
80 | //! the point of parameter U2. |
81 | //! Intermediate points of the distribution are built such |
82 | //! that the deflection is not greater than Deflection. |
83 | //! Using the following evaluation of the deflection: |
84 | //! if Pi and Pj are two consecutive points of the |
85 | //! distribution, respectively of parameter ui and uj on |
86 | //! the curve, the deflection is the distance between: |
87 | //! - the mid-point of Pi and Pj (the center of the |
88 | //! chord joining these two points) |
89 | //! - and the point of mid-parameter of these two |
90 | //! points (the point of parameter [(ui+uj) / 2 ] on curve C). |
91 | //! Continuity, defaulted to GeomAbs_C1, gives the |
92 | //! degree of continuity of the curve C. (Note that C is an |
93 | //! Adaptor3d_Curve or an Adaptor2d_Curve2d |
94 | //! object, and does not know the degree of continuity of |
95 | //! the underlying curve). |
96 | //! Use the function IsDone to verify that the |
97 | //! computation was successful, the function NbPoints |
98 | //! to obtain the number of points of the computed |
99 | //! distribution, and the function Parameter to read the |
100 | //! parameter of each point. |
101 | //! Warning |
102 | //! - The roles of U1 and U2 are inverted if U1 > U2. |
103 | //! - Derivative functions on the curve are called |
104 | //! according to Continuity. An error may occur if |
105 | //! Continuity is greater than the real degree of |
106 | //! continuity of the curve. |
107 | //! Warning |
108 | //! C is an adapted curve, i.e. an object which is an |
109 | //! interface between: |
110 | //! - the services provided by either a 2D curve from |
111 | //! the package Geom2d (in the case of an |
112 | //! Adaptor2d_Curve2d curve) or a 3D curve from |
113 | //! the package Geom (in the case of an |
114 | //! Adaptor3d_Curve curve), |
115 | //! - and those required on the curve by the |
116 | //! computation algorithm. |
37782ec2 |
117 | Standard_EXPORT GCPnts_QuasiUniformDeflection(const Adaptor2d_Curve2d& C, const Standard_Real Deflection, const Standard_Real U1, const Standard_Real U2, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
118 | |
21c7c457 |
119 | //! Initialize the algorithms with <C>, <Deflection> |
37782ec2 |
120 | Standard_EXPORT void Initialize (const Adaptor3d_Curve& C, const Standard_Real Deflection, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
121 | |
21c7c457 |
122 | //! Initialize the algorithms with <C>, <Deflection> |
37782ec2 |
123 | Standard_EXPORT void Initialize (const Adaptor2d_Curve2d& C, const Standard_Real Deflection, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
124 | |
21c7c457 |
125 | //! Initialize the algorithms with <C>, <Deflection>, |
42cf5bc1 |
126 | //! <U1>,<U2> |
37782ec2 |
127 | Standard_EXPORT void Initialize (const Adaptor3d_Curve& C, const Standard_Real Deflection, const Standard_Real U1, const Standard_Real U2, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
128 | |
21c7c457 |
129 | //! Initialize the algorithms with <C>, <Deflection>, |
42cf5bc1 |
130 | //! -- <U1>,<U2> |
131 | //! This and the above algorithms initialize (or reinitialize) |
132 | //! this algorithm and compute a distribution of points: |
133 | //! - on the curve C, or |
134 | //! - on the part of curve C limited by the two |
135 | //! parameter values U1 and U2, |
136 | //! where the deflection resulting from the distributed |
137 | //! points is not greater than Deflection. |
138 | //! The first point of the distribution is either the origin |
139 | //! of curve C or the point of parameter U1. The last |
140 | //! point of the distribution is either the end point of |
141 | //! curve C or the point of parameter U2. |
142 | //! Intermediate points of the distribution are built in |
143 | //! such a way that the deflection is not greater than |
144 | //! Deflection. Using the following evaluation of the deflection: |
145 | //! if Pi and Pj are two consecutive points of the |
146 | //! distribution, respectively of parameter ui and uj |
147 | //! on the curve, the deflection is the distance between: |
148 | //! - the mid-point of Pi and Pj (the center of the |
149 | //! chord joining these two points) |
150 | //! - and the point of mid-parameter of these two |
151 | //! points (the point of parameter [(ui+uj) / 2 ] on curve C). |
152 | //! Continuity, defaulted to GeomAbs_C1, gives the |
153 | //! degree of continuity of the curve C. (Note that C is |
154 | //! an Adaptor3d_Curve or an |
155 | //! Adaptor2d_Curve2d object, and does not know |
156 | //! the degree of continuity of the underlying curve). |
157 | //! Use the function IsDone to verify that the |
158 | //! computation was successful, the function NbPoints |
159 | //! to obtain the number of points of the computed |
160 | //! distribution, and the function Parameter to read |
161 | //! the parameter of each point. |
162 | //! Warning |
163 | //! - The roles of U1 and U2 are inverted if U1 > U2. |
164 | //! - Derivative functions on the curve are called |
165 | //! according to Continuity. An error may occur if |
166 | //! Continuity is greater than the real degree of |
167 | //! continuity of the curve. |
168 | //! Warning |
169 | //! C is an adapted curve, i.e. an object which is an |
170 | //! interface between: |
171 | //! - the services provided by either a 2D curve from |
172 | //! the package Geom2d (in the case of an |
173 | //! Adaptor2d_Curve2d curve) or a 3D curve from |
174 | //! the package Geom (in the case of an Adaptor3d_Curve curve), |
175 | //! and those required on the curve by the computation algorithm. |
37782ec2 |
176 | Standard_EXPORT void Initialize (const Adaptor2d_Curve2d& C, const Standard_Real Deflection, const Standard_Real U1, const Standard_Real U2, const GeomAbs_Shape Continuity = GeomAbs_C1); |
42cf5bc1 |
177 | |
178 | |
179 | //! Returns true if the computation was successful. |
180 | //! IsDone is a protection against: |
181 | //! - non-convergence of the algorithm |
182 | //! - querying the results before computation. |
9bf3ef83 |
183 | Standard_Boolean IsDone () const |
184 | { |
185 | return myDone; |
186 | } |
42cf5bc1 |
187 | |
188 | //! Returns the number of points of the distribution |
189 | //! computed by this algorithm. |
190 | //! Exceptions |
191 | //! StdFail_NotDone if this algorithm has not been |
192 | //! initialized, or if the computation was not successful. |
9bf3ef83 |
193 | Standard_Integer NbPoints () const |
194 | { |
195 | StdFail_NotDone_Raise_if (!myDone, "GCPnts_QuasiUniformDeflection::NbPoints()"); |
196 | return myParams.Length (); |
197 | } |
42cf5bc1 |
198 | |
199 | //! Returns the parameter of the point of index Index in |
200 | //! the distribution computed by this algorithm. |
201 | //! Warning |
202 | //! Index must be greater than or equal to 1, and less |
203 | //! than or equal to the number of points of the |
204 | //! distribution. However, pay particular attention as this |
205 | //! condition is not checked by this function. |
206 | //! Exceptions |
207 | //! StdFail_NotDone if this algorithm has not been |
208 | //! initialized, or if the computation was not successful. |
9bf3ef83 |
209 | Standard_Real Parameter (const Standard_Integer Index) const |
210 | { |
211 | StdFail_NotDone_Raise_if (!myDone, "GCPnts_QuasiUniformDeflection::Parameter()"); |
212 | return myParams (Index); |
213 | } |
42cf5bc1 |
214 | |
215 | //! Returns the point of index Index in the distribution |
216 | //! computed by this algorithm. |
217 | //! Warning |
218 | //! Index must be greater than or equal to 1, and less |
219 | //! than or equal to the number of points of the |
220 | //! distribution. However, pay particular attention as this |
221 | //! condition is not checked by this function. |
222 | //! Exceptions |
223 | //! StdFail_NotDone if this algorithm has not been |
224 | //! initialized, or if the computation was not successful. |
225 | Standard_EXPORT gp_Pnt Value (const Standard_Integer Index) const; |
226 | |
227 | //! Returns the deflection between the curve and the |
228 | //! polygon resulting from the points of the distribution |
229 | //! computed by this algorithm. |
230 | //! This is the value given to the algorithm at the time |
231 | //! of construction (or initialization). |
232 | //! Exceptions |
233 | //! StdFail_NotDone if this algorithm has not been |
234 | //! initialized, or if the computation was not successful. |
9bf3ef83 |
235 | Standard_Real Deflection () const |
236 | { |
237 | StdFail_NotDone_Raise_if (!myDone, "GCPnts_QuasiUniformDeflection::Deflection()"); |
238 | return myDeflection; |
239 | } |
42cf5bc1 |
240 | |
241 | private: |
42cf5bc1 |
242 | Standard_Boolean myDone; |
243 | Standard_Real myDeflection; |
244 | TColStd_SequenceOfReal myParams; |
245 | TColgp_SequenceOfPnt myPoints; |
246 | GeomAbs_Shape myCont; |
42cf5bc1 |
247 | }; |
248 | |
42cf5bc1 |
249 | #endif // _GCPnts_QuasiUniformDeflection_HeaderFile |