1 // Created on: 1996-07-02
2 // Created by: Joelle CHAUVET
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
18 #include <AdvApp2Var_ApproxF2var.hxx>
19 #include <AdvApp2Var_Context.hxx>
20 #include <AdvApp2Var_Iso.hxx>
21 #include <AdvApp2Var_Node.hxx>
23 #include <TColStd_HArray1OfInteger.hxx>
24 #include <TColStd_HArray1OfReal.hxx>
25 #include <TColStd_HArray2OfReal.hxx>
27 //=======================================================================
28 //function : AdvApp2Var_Iso
30 //=======================================================================
31 AdvApp2Var_Iso::AdvApp2Var_Iso() :
42 myApprIsDone(Standard_False),
43 myHasResult(Standard_False)
47 //=======================================================================
48 //function : AdvApp2Var_Iso
50 //=======================================================================
52 AdvApp2Var_Iso::AdvApp2Var_Iso(const GeomAbs_IsoType type,
53 const Standard_Real cte,
54 const Standard_Real Ufirst,
55 const Standard_Real Ulast,
56 const Standard_Real Vfirst,
57 const Standard_Real Vlast,
58 const Standard_Integer pos,
59 const Standard_Integer iu,
60 const Standard_Integer iv) :
69 myApprIsDone(Standard_False),
70 myHasResult(Standard_False)
72 if (myType==GeomAbs_IsoU) {
82 //=======================================================================
83 //function : IsApproximated
85 //=======================================================================
87 Standard_Boolean AdvApp2Var_Iso::IsApproximated() const
92 //=======================================================================
93 //function : HasResult
95 //=======================================================================
97 Standard_Boolean AdvApp2Var_Iso::HasResult() const
102 //=======================================================================
103 //function : MakeApprox
105 //=======================================================================
107 void AdvApp2Var_Iso::MakeApprox(const AdvApp2Var_Context& Conditions,
108 const Standard_Real U0,
109 const Standard_Real U1,
110 const Standard_Real V0,
111 const Standard_Real V1,
112 const AdvApp2Var_EvaluatorFunc2Var& Func,
113 AdvApp2Var_Node& NodeBegin,
114 AdvApp2Var_Node& NodeEnd)
117 Standard_Integer NBCRMX=1, NBCRBE;
118 // data stored in the Context
119 Standard_Integer NDIMEN, NBSESP, NDIMSE;
120 NDIMEN = Conditions.TotalDimension();
121 NBSESP = Conditions.TotalNumberSSP();
122 // Attention : works only in 3D
124 // the domain of the grid
125 Standard_Real UVFONC[4];
131 // data related to the processed iso
132 Standard_Integer IORDRE = myExtremOrder, IDERIV = myDerivOrder;
133 Standard_Real TCONST = myConstPar;
135 // data related to the type of the iso
136 Standard_Integer ISOFAV = 0,NBROOT = 0,NDGJAC = 0,NCFLIM = 1;
137 Standard_Real TABDEC[2];
138 Handle (TColStd_HArray1OfReal) HUROOT = Conditions.URoots();
139 Handle (TColStd_HArray1OfReal) HVROOT = Conditions.VRoots();
140 Standard_Real * ROOTLG=NULL;
148 NBROOT = (Conditions.URoots())->Length();
149 if (myExtremOrder>-1) NBROOT -= 2;
150 ROOTLG = (Standard_Real *) &HUROOT ->ChangeArray1()(HUROOT ->Lower());
151 NDGJAC = Conditions.UJacDeg();
152 NCFLIM = Conditions.ULimit();
160 NBROOT = (Conditions.VRoots())->Length();
161 if (myExtremOrder>-1) NBROOT -= 2;
162 ROOTLG = (Standard_Real *) &HVROOT ->ChangeArray1()(HVROOT ->Lower());
163 NDGJAC = Conditions.VJacDeg();
164 NCFLIM = Conditions.VLimit();
168 case GeomAbs_NoneIso:
175 // data relative to the position of iso (front or cut line)
176 Handle (TColStd_HArray1OfReal) HEPSAPR = new TColStd_HArray1OfReal(1,NBSESP);
177 Standard_Integer iesp;
180 for (iesp=1;iesp<=NBSESP;iesp++) {
181 HEPSAPR->SetValue(iesp,(Conditions.CToler())->Value(iesp,1));
185 for (iesp=1;iesp<=NBSESP;iesp++) {
186 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,1));
190 for (iesp=1;iesp<=NBSESP;iesp++) {
191 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,2));
195 for (iesp=1;iesp<=NBSESP;iesp++) {
196 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,3));
200 for (iesp=1;iesp<=NBSESP;iesp++) {
201 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,4));
205 Standard_Real *EPSAPR
206 = (Standard_Real *) &HEPSAPR ->ChangeArray1()(HEPSAPR ->Lower());
208 // the tables of approximations
209 Standard_Integer SZCRB = NDIMEN*NCFLIM;
210 Handle (TColStd_HArray1OfReal) HCOURBE =
211 new TColStd_HArray1OfReal(1,SZCRB*(IDERIV+1));
212 Standard_Real *COURBE =
213 (Standard_Real *) &HCOURBE ->ChangeArray1()(HCOURBE ->Lower());
214 Standard_Real *CRBAPP = COURBE;
215 Standard_Integer SZTAB = (1+NBROOT/2)*NDIMEN;
216 Handle (TColStd_HArray1OfReal) HSOMTAB =
217 new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
218 Standard_Real *SOMTAB =
219 (Standard_Real *) &HSOMTAB ->ChangeArray1()(HSOMTAB ->Lower());
220 Standard_Real *SOMAPP = SOMTAB;
221 Handle (TColStd_HArray1OfReal) HDIFTAB =
222 new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
223 Standard_Real *DIFTAB =
224 (Standard_Real *) &HDIFTAB ->ChangeArray1()(HDIFTAB ->Lower());
225 Standard_Real *DIFAPP = DIFTAB;
226 Handle (TColStd_HArray1OfReal) HCONTR1 =
227 new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
228 Standard_Real *CONTR1 =
229 (Standard_Real *) &HCONTR1->ChangeArray1()(HCONTR1->Lower());
230 Handle (TColStd_HArray1OfReal) HCONTR2 =
231 new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
232 Standard_Real *CONTR2 =
233 (Standard_Real *) &HCONTR2->ChangeArray1()(HCONTR2->Lower());
234 Handle (TColStd_HArray2OfReal) HERRMAX =
235 new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
236 Standard_Real *EMXAPP = new Standard_Real[NBSESP];
237 Handle (TColStd_HArray2OfReal) HERRMOY =
238 new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
240 //Standard_Real *ERRMOY =
242 // (Standard_Real *) &HERRMOY->ChangeArray2()(HERRMOY ->LowerRow(),HERRMOY ->LowerCol());
243 Standard_Real *EMYAPP = new Standard_Real[NBSESP];
245 // the approximations
247 Standard_Integer IERCOD=0, NCOEFF=0;
248 Standard_Integer iapp,ncfapp,ierapp;
249 // Standard_Integer id,ic,ideb;
250 for (iapp=0;iapp<=IDERIV;iapp++) {
251 // approximation of the derivative of order iapp
254 // GCC 3.0 would not accept this line without the void
255 // pointer cast. Perhaps the real problem is a definition
256 // somewhere that has a void * in it.
257 AdvApp2Var_ApproxF2var::mma2fnc_(&NDIMEN,
283 // error and coefficient management.
285 myApprIsDone = Standard_False;
286 myHasResult = Standard_False;
289 if (NCOEFF<=ncfapp) NCOEFF=ncfapp;
290 if (ierapp==-1) IERCOD = -1;
291 // return constraints of order 0 to IORDRE of extremities
292 Standard_Integer ider, jpos=HCONTR1->Lower();
293 for (ider=0; ider<=IORDRE;ider++) {
294 gp_Pnt pt(HCONTR1->Value(jpos),
295 HCONTR1->Value(jpos+1),
296 HCONTR1->Value(jpos+2));
298 NodeBegin.SetPoint(ider,iapp, pt);
301 NodeBegin.SetPoint(iapp,ider, pt);
305 jpos=HCONTR2->Lower();
306 for (ider=0; ider<=IORDRE;ider++) {
307 gp_Pnt pt(HCONTR2->Value(jpos),
308 HCONTR2->Value(jpos+1),
309 HCONTR2->Value(jpos+2));
311 NodeEnd.SetPoint(ider,iapp, pt);
314 NodeEnd.SetPoint(iapp,ider, pt);
319 for (iesp=1; iesp<=NBSESP;iesp++) {
320 HERRMAX->SetValue(iesp,iapp+1,EMXAPP[iesp-1]);
321 HERRMOY->SetValue(iesp,iapp+1,EMYAPP[iesp-1]);
323 // passage to the approximation of higher order
329 // management of results
331 // all approximations are correct
332 myApprIsDone = Standard_True;
333 myHasResult = Standard_True;
335 else if (IERCOD == -1) {
336 // at least one approximation is not correct
337 myApprIsDone = Standard_False;
338 myHasResult = Standard_True;
341 myApprIsDone = Standard_False;
342 myHasResult = Standard_False;
345 myEquation = HCOURBE;
347 myMaxErrors = HERRMAX;
348 myMoyErrors = HERRMOY;
357 //=======================================================================
358 //function : ChangeDomain
360 //=======================================================================
362 void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a, const Standard_Real b)
364 if (myType==GeomAbs_IsoU) {
374 //=======================================================================
375 //function : ChangeDomain
377 //=======================================================================
379 void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a,
380 const Standard_Real b,
381 const Standard_Real c,
382 const Standard_Real d)
390 //=======================================================================
391 //function : SetConstante
393 //=======================================================================
395 void AdvApp2Var_Iso::SetConstante(const Standard_Real newcte)
400 //=======================================================================
401 //function : SetPosition
403 //=======================================================================
405 void AdvApp2Var_Iso::SetPosition(const Standard_Integer newpos)
410 //=======================================================================
411 //function : ResetApprox
413 //=======================================================================
415 void AdvApp2Var_Iso::ResetApprox()
417 myApprIsDone = Standard_False;
418 myHasResult = Standard_False;
421 //=======================================================================
422 //function : OverwriteApprox
424 //=======================================================================
426 void AdvApp2Var_Iso::OverwriteApprox()
428 if (myHasResult) myApprIsDone = Standard_True;
431 //=======================================================================
434 //=======================================================================
436 GeomAbs_IsoType AdvApp2Var_Iso::Type() const
441 //=======================================================================
442 //function : Constante
444 //=======================================================================
446 Standard_Real AdvApp2Var_Iso::Constante() const
451 //=======================================================================
454 //=======================================================================
456 Standard_Real AdvApp2Var_Iso::T0() const
458 if (myType==GeomAbs_IsoU) {
466 //=======================================================================
469 //=======================================================================
471 Standard_Real AdvApp2Var_Iso::T1() const
473 if (myType==GeomAbs_IsoU) {
481 //=======================================================================
484 //=======================================================================
486 Standard_Real AdvApp2Var_Iso::U0() const
491 //=======================================================================
494 //=======================================================================
496 Standard_Real AdvApp2Var_Iso::U1() const
501 //=======================================================================
504 //=======================================================================
506 Standard_Real AdvApp2Var_Iso::V0() const
511 //=======================================================================
514 //=======================================================================
516 Standard_Real AdvApp2Var_Iso::V1() const
521 //=======================================================================
524 //=======================================================================
526 Standard_Integer AdvApp2Var_Iso::UOrder() const
528 if (Type()==GeomAbs_IsoU) return myDerivOrder;
529 else return myExtremOrder;
533 //=======================================================================
536 //=======================================================================
538 Standard_Integer AdvApp2Var_Iso::VOrder() const
540 if (Type()==GeomAbs_IsoV) return myDerivOrder;
541 else return myExtremOrder;
544 //=======================================================================
545 //function : Position
547 //=======================================================================
549 Standard_Integer AdvApp2Var_Iso::Position() const
554 //=======================================================================
557 //=======================================================================
560 Standard_Integer AdvApp2Var_Iso::NbCoeff() const
565 //=======================================================================
568 //=======================================================================
570 const Handle(TColStd_HArray1OfReal)& AdvApp2Var_Iso::Polynom() const
575 Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::SomTab() const
580 Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::DifTab() const
585 Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MaxErrors() const
590 Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MoyErrors() const