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.
17 #include <AdvApp2Var_Iso.hxx>
19 #include <AdvApp2Var_ApproxF2var.hxx>
20 #include <AdvApp2Var_Context.hxx>
21 #include <AdvApp2Var_Node.hxx>
23 #include <TColStd_HArray1OfInteger.hxx>
24 #include <TColStd_HArray1OfReal.hxx>
25 #include <TColStd_HArray2OfReal.hxx>
27 IMPLEMENT_STANDARD_RTTIEXT(AdvApp2Var_Iso, Standard_Transient)
29 //=======================================================================
30 //function : AdvApp2Var_Iso
32 //=======================================================================
33 AdvApp2Var_Iso::AdvApp2Var_Iso() :
44 myApprIsDone(Standard_False),
45 myHasResult(Standard_False)
49 //=======================================================================
50 //function : AdvApp2Var_Iso
52 //=======================================================================
54 AdvApp2Var_Iso::AdvApp2Var_Iso(const GeomAbs_IsoType type,
55 const Standard_Real cte,
56 const Standard_Real Ufirst,
57 const Standard_Real Ulast,
58 const Standard_Real Vfirst,
59 const Standard_Real Vlast,
60 const Standard_Integer pos,
61 const Standard_Integer iu,
62 const Standard_Integer iv) :
71 myApprIsDone(Standard_False),
72 myHasResult(Standard_False)
74 if (myType==GeomAbs_IsoU) {
84 //=======================================================================
85 //function : IsApproximated
87 //=======================================================================
89 Standard_Boolean AdvApp2Var_Iso::IsApproximated() const
94 //=======================================================================
95 //function : HasResult
97 //=======================================================================
99 Standard_Boolean AdvApp2Var_Iso::HasResult() const
104 //=======================================================================
105 //function : MakeApprox
107 //=======================================================================
109 void AdvApp2Var_Iso::MakeApprox(const AdvApp2Var_Context& Conditions,
110 const Standard_Real U0,
111 const Standard_Real U1,
112 const Standard_Real V0,
113 const Standard_Real V1,
114 const AdvApp2Var_EvaluatorFunc2Var& Func,
115 AdvApp2Var_Node& NodeBegin,
116 AdvApp2Var_Node& NodeEnd)
119 Standard_Integer NBCRMX=1, NBCRBE;
120 // data stored in the Context
121 Standard_Integer NDIMEN, NBSESP, NDIMSE;
122 NDIMEN = Conditions.TotalDimension();
123 NBSESP = Conditions.TotalNumberSSP();
124 // Attention : works only in 3D
126 // the domain of the grid
127 Standard_Real UVFONC[4];
133 // data related to the processed iso
134 Standard_Integer IORDRE = myExtremOrder, IDERIV = myDerivOrder;
135 Standard_Real TCONST = myConstPar;
137 // data related to the type of the iso
138 Standard_Integer ISOFAV = 0,NBROOT = 0,NDGJAC = 0,NCFLIM = 1;
139 Standard_Real TABDEC[2];
140 Handle (TColStd_HArray1OfReal) HUROOT = Conditions.URoots();
141 Handle (TColStd_HArray1OfReal) HVROOT = Conditions.VRoots();
142 Standard_Real * ROOTLG=NULL;
150 NBROOT = (Conditions.URoots())->Length();
151 if (myExtremOrder>-1) NBROOT -= 2;
152 ROOTLG = (Standard_Real *) &HUROOT ->ChangeArray1()(HUROOT ->Lower());
153 NDGJAC = Conditions.UJacDeg();
154 NCFLIM = Conditions.ULimit();
162 NBROOT = (Conditions.VRoots())->Length();
163 if (myExtremOrder>-1) NBROOT -= 2;
164 ROOTLG = (Standard_Real *) &HVROOT ->ChangeArray1()(HVROOT ->Lower());
165 NDGJAC = Conditions.VJacDeg();
166 NCFLIM = Conditions.VLimit();
170 case GeomAbs_NoneIso:
177 // data relative to the position of iso (front or cut line)
178 Handle (TColStd_HArray1OfReal) HEPSAPR = new TColStd_HArray1OfReal(1,NBSESP);
179 Standard_Integer iesp;
182 for (iesp=1;iesp<=NBSESP;iesp++) {
183 HEPSAPR->SetValue(iesp,(Conditions.CToler())->Value(iesp,1));
187 for (iesp=1;iesp<=NBSESP;iesp++) {
188 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,1));
192 for (iesp=1;iesp<=NBSESP;iesp++) {
193 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,2));
197 for (iesp=1;iesp<=NBSESP;iesp++) {
198 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,3));
202 for (iesp=1;iesp<=NBSESP;iesp++) {
203 HEPSAPR->SetValue(iesp,(Conditions.FToler())->Value(iesp,4));
207 Standard_Real *EPSAPR
208 = (Standard_Real *) &HEPSAPR ->ChangeArray1()(HEPSAPR ->Lower());
210 // the tables of approximations
211 Standard_Integer SZCRB = NDIMEN*NCFLIM;
212 Handle (TColStd_HArray1OfReal) HCOURBE =
213 new TColStd_HArray1OfReal(1,SZCRB*(IDERIV+1));
214 Standard_Real *COURBE =
215 (Standard_Real *) &HCOURBE ->ChangeArray1()(HCOURBE ->Lower());
216 Standard_Real *CRBAPP = COURBE;
217 Standard_Integer SZTAB = (1+NBROOT/2)*NDIMEN;
218 Handle (TColStd_HArray1OfReal) HSOMTAB =
219 new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
220 Standard_Real *SOMTAB =
221 (Standard_Real *) &HSOMTAB ->ChangeArray1()(HSOMTAB ->Lower());
222 Standard_Real *SOMAPP = SOMTAB;
223 Handle (TColStd_HArray1OfReal) HDIFTAB =
224 new TColStd_HArray1OfReal(1,SZTAB*(IDERIV+1));
225 Standard_Real *DIFTAB =
226 (Standard_Real *) &HDIFTAB ->ChangeArray1()(HDIFTAB ->Lower());
227 Standard_Real *DIFAPP = DIFTAB;
228 Handle (TColStd_HArray1OfReal) HCONTR1 =
229 new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
230 Standard_Real *CONTR1 =
231 (Standard_Real *) &HCONTR1->ChangeArray1()(HCONTR1->Lower());
232 Handle (TColStd_HArray1OfReal) HCONTR2 =
233 new TColStd_HArray1OfReal(1,(IORDRE+2)*NDIMEN);
234 Standard_Real *CONTR2 =
235 (Standard_Real *) &HCONTR2->ChangeArray1()(HCONTR2->Lower());
236 Handle (TColStd_HArray2OfReal) HERRMAX =
237 new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
238 Standard_Real *EMXAPP = new Standard_Real[NBSESP];
239 Handle (TColStd_HArray2OfReal) HERRMOY =
240 new TColStd_HArray2OfReal(1,NBSESP,1,IDERIV+1);
242 //Standard_Real *ERRMOY =
244 // (Standard_Real *) &HERRMOY->ChangeArray2()(HERRMOY ->LowerRow(),HERRMOY ->LowerCol());
245 Standard_Real *EMYAPP = new Standard_Real[NBSESP];
247 // the approximations
249 Standard_Integer IERCOD=0, NCOEFF=0;
250 Standard_Integer iapp,ncfapp,ierapp;
251 // Standard_Integer id,ic,ideb;
252 for (iapp=0;iapp<=IDERIV;iapp++) {
253 // approximation of the derivative of order iapp
256 // GCC 3.0 would not accept this line without the void
257 // pointer cast. Perhaps the real problem is a definition
258 // somewhere that has a void * in it.
259 AdvApp2Var_ApproxF2var::mma2fnc_(&NDIMEN,
285 // error and coefficient management.
287 myApprIsDone = Standard_False;
288 myHasResult = Standard_False;
291 if (NCOEFF<=ncfapp) NCOEFF=ncfapp;
292 if (ierapp==-1) IERCOD = -1;
293 // return constraints of order 0 to IORDRE of extremities
294 Standard_Integer ider, jpos=HCONTR1->Lower();
295 for (ider=0; ider<=IORDRE;ider++) {
296 gp_Pnt pt(HCONTR1->Value(jpos),
297 HCONTR1->Value(jpos+1),
298 HCONTR1->Value(jpos+2));
300 NodeBegin.SetPoint(ider,iapp, pt);
303 NodeBegin.SetPoint(iapp,ider, pt);
307 jpos=HCONTR2->Lower();
308 for (ider=0; ider<=IORDRE;ider++) {
309 gp_Pnt pt(HCONTR2->Value(jpos),
310 HCONTR2->Value(jpos+1),
311 HCONTR2->Value(jpos+2));
313 NodeEnd.SetPoint(ider,iapp, pt);
316 NodeEnd.SetPoint(iapp,ider, pt);
321 for (iesp=1; iesp<=NBSESP;iesp++) {
322 HERRMAX->SetValue(iesp,iapp+1,EMXAPP[iesp-1]);
323 HERRMOY->SetValue(iesp,iapp+1,EMYAPP[iesp-1]);
325 // passage to the approximation of higher order
331 // management of results
333 // all approximations are correct
334 myApprIsDone = Standard_True;
335 myHasResult = Standard_True;
337 else if (IERCOD == -1) {
338 // at least one approximation is not correct
339 myApprIsDone = Standard_False;
340 myHasResult = Standard_True;
343 myApprIsDone = Standard_False;
344 myHasResult = Standard_False;
347 myEquation = HCOURBE;
349 myMaxErrors = HERRMAX;
350 myMoyErrors = HERRMOY;
359 //=======================================================================
360 //function : ChangeDomain
362 //=======================================================================
364 void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a, const Standard_Real b)
366 if (myType==GeomAbs_IsoU) {
376 //=======================================================================
377 //function : ChangeDomain
379 //=======================================================================
381 void AdvApp2Var_Iso::ChangeDomain(const Standard_Real a,
382 const Standard_Real b,
383 const Standard_Real c,
384 const Standard_Real d)
392 //=======================================================================
393 //function : SetConstante
395 //=======================================================================
397 void AdvApp2Var_Iso::SetConstante(const Standard_Real newcte)
402 //=======================================================================
403 //function : SetPosition
405 //=======================================================================
407 void AdvApp2Var_Iso::SetPosition(const Standard_Integer newpos)
412 //=======================================================================
413 //function : ResetApprox
415 //=======================================================================
417 void AdvApp2Var_Iso::ResetApprox()
419 myApprIsDone = Standard_False;
420 myHasResult = Standard_False;
423 //=======================================================================
424 //function : OverwriteApprox
426 //=======================================================================
428 void AdvApp2Var_Iso::OverwriteApprox()
430 if (myHasResult) myApprIsDone = Standard_True;
433 //=======================================================================
436 //=======================================================================
438 GeomAbs_IsoType AdvApp2Var_Iso::Type() const
443 //=======================================================================
444 //function : Constante
446 //=======================================================================
448 Standard_Real AdvApp2Var_Iso::Constante() const
453 //=======================================================================
456 //=======================================================================
458 Standard_Real AdvApp2Var_Iso::T0() const
460 if (myType==GeomAbs_IsoU) {
468 //=======================================================================
471 //=======================================================================
473 Standard_Real AdvApp2Var_Iso::T1() const
475 if (myType==GeomAbs_IsoU) {
483 //=======================================================================
486 //=======================================================================
488 Standard_Real AdvApp2Var_Iso::U0() const
493 //=======================================================================
496 //=======================================================================
498 Standard_Real AdvApp2Var_Iso::U1() const
503 //=======================================================================
506 //=======================================================================
508 Standard_Real AdvApp2Var_Iso::V0() const
513 //=======================================================================
516 //=======================================================================
518 Standard_Real AdvApp2Var_Iso::V1() const
523 //=======================================================================
526 //=======================================================================
528 Standard_Integer AdvApp2Var_Iso::UOrder() const
530 if (Type()==GeomAbs_IsoU) return myDerivOrder;
531 else return myExtremOrder;
535 //=======================================================================
538 //=======================================================================
540 Standard_Integer AdvApp2Var_Iso::VOrder() const
542 if (Type()==GeomAbs_IsoV) return myDerivOrder;
543 else return myExtremOrder;
546 //=======================================================================
547 //function : Position
549 //=======================================================================
551 Standard_Integer AdvApp2Var_Iso::Position() const
556 //=======================================================================
559 //=======================================================================
562 Standard_Integer AdvApp2Var_Iso::NbCoeff() const
567 //=======================================================================
570 //=======================================================================
572 const Handle(TColStd_HArray1OfReal)& AdvApp2Var_Iso::Polynom() const
577 Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::SomTab() const
582 Handle(TColStd_HArray1OfReal) AdvApp2Var_Iso::DifTab() const
587 Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MaxErrors() const
592 Handle(TColStd_HArray2OfReal) AdvApp2Var_Iso::MoyErrors() const