0026377: Passing Handle objects as arguments to functions as non-const reference...
[occt.git] / src / AppDef / AppDef_Variational.hxx
CommitLineData
42cf5bc1 1// Created on: 1996-05-14
2// Created by: Philippe MANGIN / Jeannine PANCIATICI
3// Copyright (c) 1996-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 _AppDef_Variational_HeaderFile
18#define _AppDef_Variational_HeaderFile
19
20#include <Standard.hxx>
21#include <Standard_DefineAlloc.hxx>
22#include <Standard_Handle.hxx>
23
24#include <AppDef_MultiLine.hxx>
25#include <Standard_Integer.hxx>
26#include <TColStd_HArray1OfReal.hxx>
27#include <AppParCurves_HArray1OfConstraintCouple.hxx>
28#include <TColStd_HArray1OfInteger.hxx>
29#include <Standard_Real.hxx>
30#include <GeomAbs_Shape.hxx>
31#include <Standard_Boolean.hxx>
32#include <AppParCurves_MultiBSpCurve.hxx>
33#include <Standard_OStream.hxx>
34#include <TColStd_Array1OfReal.hxx>
35#include <math_Vector.hxx>
36#include <AppParCurves_Constraint.hxx>
37class AppDef_SmoothCriterion;
38class Standard_OutOfRange;
39class Standard_DimensionError;
40class Standard_DomainError;
41class Standard_ConstructionError;
42class StdFail_NotDone;
43class gp_VectorWithNullMagnitude;
44class AppDef_MultiLine;
45class AppParCurves_MultiBSpCurve;
46class math_Matrix;
47class FEmTool_Curve;
48class FEmTool_Assembly;
49class PLib_Base;
50
51
52//! This class is used to smooth N points with constraints
53//! by minimization of quadratic criterium but also
54//! variational criterium in order to obtain " fair Curve "
55//! Computes the approximation of a Multiline by
56//! Variational optimization.
57class AppDef_Variational
58{
59public:
60
61 DEFINE_STANDARD_ALLOC
62
63
64 //! Constructor.
65 //! Initialization of the fields.
66 //! warning : Nc0 : number of PassagePoint consraints
67 //! Nc2 : number of TangencyPoint constraints
68 //! Nc3 : number of CurvaturePoint constraints
69 //! if
70 //! ((MaxDegree-Continuity)*MaxSegment -Nc0 - 2*Nc1
71 //! -3*Nc2)
72 //! is negative
73 //! The problem is over-constrained.
74 //!
75 //! Limitation : The MultiLine from AppDef has to be composed by
76 //! only one Line ( Dimension 2 or 3).
77 Standard_EXPORT AppDef_Variational(const AppDef_MultiLine& SSP, const Standard_Integer FirstPoint, const Standard_Integer LastPoint, const Handle(AppParCurves_HArray1OfConstraintCouple)& TheConstraints, const Standard_Integer MaxDegree = 14, const Standard_Integer MaxSegment = 100, const GeomAbs_Shape Continuity = GeomAbs_C2, const Standard_Boolean WithMinMax = Standard_False, const Standard_Boolean WithCutting = Standard_True, const Standard_Real Tolerance = 1.0, const Standard_Integer NbIterations = 2);
78
79 //! Makes the approximation with the current fields.
80 Standard_EXPORT void Approximate();
81
82 //! returns True if the creation is done
83 //! and correspond to the current fields.
84 Standard_EXPORT Standard_Boolean IsCreated() const;
85
86 //! returns True if the approximation is ok
87 //! and correspond to the current fields.
88 Standard_EXPORT Standard_Boolean IsDone() const;
89
90 //! returns True if the problem is overconstrained
91 //! in this case, approximation cannot be done.
92 Standard_EXPORT Standard_Boolean IsOverConstrained() const;
93
94 //! returns all the BSpline curves approximating the
95 //! MultiLine from AppDef SSP after minimization of the parameter.
96 Standard_EXPORT AppParCurves_MultiBSpCurve Value() const;
97
98 //! returns the maximum of the distances between
99 //! the points of the multiline and the approximation
100 //! curves.
101 Standard_EXPORT Standard_Real MaxError() const;
102
103 //! returns the index of the MultiPoint of ErrorMax
104 Standard_EXPORT Standard_Integer MaxErrorIndex() const;
105
106 //! returns the quadratic average of the distances between
107 //! the points of the multiline and the approximation
108 //! curves.
109 Standard_EXPORT Standard_Real QuadraticError() const;
110
111 //! returns the distances between the points of the
112 //! multiline and the approximation curves.
113 Standard_EXPORT void Distance (math_Matrix& mat);
114
115 //! returns the average error between
116 //! the MultiLine from AppDef and the approximation.
117 Standard_EXPORT Standard_Real AverageError() const;
118
119 //! returns the parameters uses to the approximations
120 Standard_EXPORT const Handle(TColStd_HArray1OfReal)& Parameters() const;
121
122 //! returns the knots uses to the approximations
123 Standard_EXPORT const Handle(TColStd_HArray1OfReal)& Knots() const;
124
125 //! returns the values of the quality criterium.
126 Standard_EXPORT void Criterium (Standard_Real& VFirstOrder, Standard_Real& VSecondOrder, Standard_Real& VThirdOrder) const;
127
128 //! returns the Weights (as percent) associed to the criterium used in
129 //! the optimization.
130 Standard_EXPORT void CriteriumWeight (Standard_Real& Percent1, Standard_Real& Percent2, Standard_Real& Percent3) const;
131
132 //! returns the Maximum Degree used in the approximation
133 Standard_EXPORT Standard_Integer MaxDegree() const;
134
135 //! returns the Maximum of segment used in the approximation
136 Standard_EXPORT Standard_Integer MaxSegment() const;
137
138 //! returns the Continuity used in the approximation
139 Standard_EXPORT GeomAbs_Shape Continuity() const;
140
141 //! returns if the approximation search to minimize the
142 //! maximum Error or not.
143 Standard_EXPORT Standard_Boolean WithMinMax() const;
144
145 //! returns if the approximation can insert new Knots or not.
146 Standard_EXPORT Standard_Boolean WithCutting() const;
147
148 //! returns the tolerance used in the approximation.
149 Standard_EXPORT Standard_Real Tolerance() const;
150
151 //! returns the number of iterations used in the approximation.
152 Standard_EXPORT Standard_Integer NbIterations() const;
153
154 //! Prints on the stream o information on the current state
155 //! of the object.
156 //! MaxError,MaxErrorIndex,AverageError,QuadraticError,Criterium
157 //! Distances,Degre,Nombre de poles, parametres, noeuds
158 Standard_EXPORT void Dump (Standard_OStream& o) const;
159
160 //! Define the constraints to approximate
161 //! If this value is incompatible with the others fields
162 //! this method modify nothing and returns false
163 Standard_EXPORT Standard_Boolean SetConstraints (const Handle(AppParCurves_HArray1OfConstraintCouple)& aConstrainst);
164
165 //! Defines the parameters used by the approximations.
166 Standard_EXPORT void SetParameters (const Handle(TColStd_HArray1OfReal)& param);
167
168 //! Defines the knots used by the approximations
169 //! If this value is incompatible with the others fields
170 //! this method modify nothing and returns false
171 Standard_EXPORT Standard_Boolean SetKnots (const Handle(TColStd_HArray1OfReal)& knots);
172
173 //! Define the Maximum Degree used in the approximation
174 //! If this value is incompatible with the others fields
175 //! this method modify nothing and returns false
176 Standard_EXPORT Standard_Boolean SetMaxDegree (const Standard_Integer Degree);
177
178 //! Define the maximum number of segments used in the approximation
179 //! If this value is incompatible with the others fields
180 //! this method modify nothing and returns false
181 Standard_EXPORT Standard_Boolean SetMaxSegment (const Standard_Integer NbSegment);
182
183 //! Define the Continuity used in the approximation
184 //! If this value is incompatible with the others fields
185 //! this method modify nothing and returns false
186 Standard_EXPORT Standard_Boolean SetContinuity (const GeomAbs_Shape C);
187
188 //! Define if the approximation search to minimize the
189 //! maximum Error or not.
190 Standard_EXPORT void SetWithMinMax (const Standard_Boolean MinMax);
191
192 //! Define if the approximation can insert new Knots or not.
193 //! If this value is incompatible with the others fields
194 //! this method modify nothing and returns false
195 Standard_EXPORT Standard_Boolean SetWithCutting (const Standard_Boolean Cutting);
196
197 //! define the Weights (as percent) associed to the criterium used in
198 //! the optimization.
199 //!
200 //! if Percent <= 0
201 Standard_EXPORT void SetCriteriumWeight (const Standard_Real Percent1, const Standard_Real Percent2, const Standard_Real Percent3);
202
203 //! define the Weight (as percent) associed to the
204 //! criterium Order used in the optimization : Others
205 //! weights are updated.
206 //! if Percent < 0
207 //! if Order < 1 or Order > 3
208 Standard_EXPORT void SetCriteriumWeight (const Standard_Integer Order, const Standard_Real Percent);
209
210 //! define the tolerance used in the approximation.
211 Standard_EXPORT void SetTolerance (const Standard_Real Tol);
212
213 //! define the number of iterations used in the approximation.
214 //! if Iter < 1
215 Standard_EXPORT void SetNbIterations (const Standard_Integer Iter);
216
217
218
219
220protected:
221
222
223
224
225
226private:
227
228
229 Standard_EXPORT void TheMotor (Handle(AppDef_SmoothCriterion)& J, const Standard_Real WQuadratic, const Standard_Real WQuality, Handle(FEmTool_Curve)& TheCurve, TColStd_Array1OfReal& Ecarts);
230
231 Standard_EXPORT void Adjusting (Handle(AppDef_SmoothCriterion)& J, Standard_Real& WQuadratic, Standard_Real& WQuality, Handle(FEmTool_Curve)& TheCurve, TColStd_Array1OfReal& Ecarts);
232
233 Standard_EXPORT void Optimization (Handle(AppDef_SmoothCriterion)& J, FEmTool_Assembly& A, const Standard_Boolean ToAssemble, const Standard_Real EpsDeg, Handle(FEmTool_Curve)& Curve, const TColStd_Array1OfReal& Parameters) const;
234
235 Standard_EXPORT void Project (const Handle(FEmTool_Curve)& C, const TColStd_Array1OfReal& Ti, TColStd_Array1OfReal& ProjTi, TColStd_Array1OfReal& Distance, Standard_Integer& NumPoints, Standard_Real& MaxErr, Standard_Real& QuaErr, Standard_Real& AveErr, const Standard_Integer NbIterations = 2) const;
236
237 Standard_EXPORT void ACR (Handle(FEmTool_Curve)& Curve, TColStd_Array1OfReal& Ti, const Standard_Integer Decima) const;
238
239 Standard_EXPORT void SplitCurve (const Handle(FEmTool_Curve)& InCurve, const TColStd_Array1OfReal& Ti, const Standard_Real CurveTol, Handle(FEmTool_Curve)& OutCurve, Standard_Boolean& iscut) const;
240
241 Standard_EXPORT void Init();
242
243 Standard_EXPORT void InitSmoothCriterion();
244
245 Standard_EXPORT void InitParameters (Standard_Real& Length);
246
247 Standard_EXPORT void InitCriterionEstimations (const Standard_Real Length, Standard_Real& J1, Standard_Real& J2, Standard_Real& J3) const;
248
249 Standard_EXPORT void EstTangent (const Standard_Integer ipnt, math_Vector& VTang) const;
250
251 Standard_EXPORT void EstSecnd (const Standard_Integer ipnt, const math_Vector& VTang1, const math_Vector& VTang2, const Standard_Real Length, math_Vector& VScnd) const;
252
253 Standard_EXPORT void InitCutting (const Handle(PLib_Base)& aBase, const Standard_Real CurvTol, Handle(FEmTool_Curve)& aCurve) const;
254
255 Standard_EXPORT void AssemblingConstraints (const Handle(FEmTool_Curve)& Curve, const TColStd_Array1OfReal& Parameters, const Standard_Real CBLONG, FEmTool_Assembly& A) const;
256
257 Standard_EXPORT Standard_Boolean InitTthetaF (const Standard_Integer ndimen, const AppParCurves_Constraint typcon, const Standard_Integer begin, const Standard_Integer jndex);
258
259
260 AppDef_MultiLine mySSP;
261 Standard_Integer myNbP3d;
262 Standard_Integer myNbP2d;
263 Standard_Integer myDimension;
264 Standard_Integer myFirstPoint;
265 Standard_Integer myLastPoint;
266 Standard_Integer myNbPoints;
267 Handle(TColStd_HArray1OfReal) myTabPoints;
268 Handle(AppParCurves_HArray1OfConstraintCouple) myConstraints;
269 Standard_Integer myNbConstraints;
270 Handle(TColStd_HArray1OfReal) myTabConstraints;
271 Standard_Integer myNbPassPoints;
272 Standard_Integer myNbTangPoints;
273 Standard_Integer myNbCurvPoints;
274 Handle(TColStd_HArray1OfInteger) myTypConstraints;
275 Handle(TColStd_HArray1OfReal) myTtheta;
276 Handle(TColStd_HArray1OfReal) myTfthet;
277 Standard_Integer myMaxDegree;
278 Standard_Integer myMaxSegment;
279 Standard_Integer myNbIterations;
280 Standard_Real myTolerance;
281 GeomAbs_Shape myContinuity;
282 Standard_Integer myNivCont;
283 Standard_Boolean myWithMinMax;
284 Standard_Boolean myWithCutting;
285 Standard_Real myPercent[3];
286 Standard_Real myCriterium[4];
287 Handle(AppDef_SmoothCriterion) mySmoothCriterion;
288 Handle(TColStd_HArray1OfReal) myParameters;
289 Handle(TColStd_HArray1OfReal) myKnots;
290 AppParCurves_MultiBSpCurve myMBSpCurve;
291 Standard_Real myMaxError;
292 Standard_Integer myMaxErrorIndex;
293 Standard_Real myAverageError;
294 Standard_Boolean myIsCreated;
295 Standard_Boolean myIsDone;
296 Standard_Boolean myIsOverConstr;
297
298
299};
300
301
302
303
304
305
306
307#endif // _AppDef_Variational_HeaderFile