0022792: Globally defined symbol PI conflicts with VTK definition (Intel compiler)
[occt.git] / src / LocalAnalysis / LocalAnalysis_SurfaceContinuity.cxx
1 // File:        LocalAnalysis_SurfaceContinuity.cxx
2 // Created:     Mon Sep  9 15:01:49 1996
3 // Author:      Herve LOUESSARD
4 //              <hl1@sgi38>
5
6
7 #include <LocalAnalysis_SurfaceContinuity.ixx>
8 #include <GeomLProp_SLProps.hxx>
9 #include <gp.hxx>
10 #include <gp_Pnt.hxx>
11 #include <gp_Vec.hxx>
12 #include <gp_Dir.hxx>
13 #include <gp_Pnt2d.hxx>
14 #include <Geom_Surface.hxx>
15 #include <Geom2d_Curve.hxx>
16
17
18 /*********************************************************************************/
19 /*********************************************************************************/
20
21 void LocalAnalysis_SurfaceContinuity::SurfC0 (const GeomLProp_SLProps& Surf1, 
22                                                const GeomLProp_SLProps& Surf2
23                                                )  
24 {  myContC0=(Surf1.Value()).Distance(Surf2.Value());
25 }
26
27 /*********************************************************************************/
28
29 void LocalAnalysis_SurfaceContinuity::SurfC1(  GeomLProp_SLProps& Surf1, 
30                                        GeomLProp_SLProps & Surf2) 
31 { gp_Vec V1u, V2u, V1v, V2v;
32   Standard_Real norm1u, norm2u, norm1v, norm2v,angu,angv; 
33   
34   V1u = Surf1.D1U();
35   V2u = Surf2.D1U();
36
37   V1v = Surf1.D1V();
38   V2v = Surf2.D1V();
39
40   norm1u = V1u.Magnitude();
41   norm2u = V2u.Magnitude();
42   norm1v = V1v.Magnitude();
43   norm2v = V2v.Magnitude();
44
45   if ((norm1u>myepsnul )&&(norm2u>myepsnul )&&(norm1v>myepsnul)
46        &&(norm2v>myepsnul))
47     { if (norm1u >= norm2u ) 
48          myLambda1U= norm2u / norm1u;
49       else myLambda1U = norm2u / norm1u;
50       if (norm1v >= norm2v ) 
51          myLambda1V= norm2v / norm1v;
52       else myLambda1V = norm2v / norm1v;
53       angu= V1u.Angle(V2u);
54       if (angu>M_PI/2) myContC1U=M_PI-angu;
55       else myContC1U=angu;
56       angv= V1v.Angle(V2v);
57       if (angv>M_PI/2) myContC1V=M_PI-angv;
58        else myContC1V=angv;   }
59   else {myIsDone = Standard_False;  
60         myErrorStatus=LocalAnalysis_NullFirstDerivative;}
61 }
62
63 /*********************************************************************************/
64
65 void LocalAnalysis_SurfaceContinuity::SurfC2(  GeomLProp_SLProps& Surf1, 
66                                                GeomLProp_SLProps& Surf2)
67
68 { gp_Vec V11u, V12u, V21u, V22u, V11v, V12v, V21v, V22v;
69   Standard_Real norm11u, norm12u, norm21u, norm22u, norm11v, norm12v, norm21v, norm22v;
70   Standard_Real ang;
71   V11u = Surf1.D1U();
72   V12u = Surf2.D1U();
73   V21u = Surf1.D2U();
74   V22u = Surf2.D2U();
75   norm11u = V11u.Magnitude();
76   norm12u = V12u.Magnitude();
77   norm21u = V21u.Magnitude();
78   norm22u = V22u.Magnitude();
79
80   if ((norm11u>myepsnul)&&(norm12u>myepsnul))
81      { if( (norm21u>myepsnul)&&(norm22u>myepsnul))
82           { if (norm11u >= norm12u ) 
83                 {myLambda1U= norm12u / norm11u;
84                  myLambda2U = norm22u /norm21u;}
85             else {myLambda1U = norm11u / norm12u;
86                   myLambda2U = norm21u / norm22u;}
87             ang=V21u.Angle(V22u);
88             if(ang>M_PI/2) myContC2U=M_PI-ang;
89             else myContC2U=ang; }
90        else
91           {  myIsDone=Standard_False;
92             myErrorStatus=LocalAnalysis_NullSecondDerivative;}
93      }
94    
95    else { myIsDone=Standard_False; 
96           myErrorStatus=LocalAnalysis_NullFirstDerivative;}
97
98   V11v = Surf1.D1V();
99   V12v = Surf2.D1V();
100   V21v = Surf1.D2V();
101   V22v = Surf2.D2V();
102   norm11v = V11v.Magnitude();
103   norm12v = V12v.Magnitude();
104   norm21v = V21v.Magnitude();
105   norm22v = V22v.Magnitude();
106
107   if ((norm11v>myepsnul)&&(norm12v>myepsnul))
108      {if ((norm21v>myepsnul)&&(norm22v>myepsnul))
109          {if ( norm11v >= norm12v ) 
110              {myLambda1V= norm12v / norm11v;
111               myLambda2V= norm22v / norm21v;}       
112           else{ myLambda1V = norm11v / norm12v;
113                 myLambda2V = norm21v / norm22v;}
114           ang= V21v.Angle(V22v);
115           if (ang>M_PI/2)  myContC2V=M_PI-ang;
116           else myContC2V=ang;
117          }
118       else{ myIsDone= Standard_False;
119             myErrorStatus=LocalAnalysis_NullSecondDerivative; }
120     }
121    else{ myIsDone=Standard_False;
122          myErrorStatus=LocalAnalysis_NullFirstDerivative;}
123 }
124
125 /*********************************************************************************/
126 void LocalAnalysis_SurfaceContinuity::SurfG1(  GeomLProp_SLProps& Surf1, 
127                                                 GeomLProp_SLProps& Surf2) 
128 { if (Surf1.IsNormalDefined()&&Surf2.IsNormalDefined()) 
129   { gp_Dir D1 = Surf1.Normal();
130     gp_Dir D2 = Surf2.Normal();
131     Standard_Real ang=D1.Angle(D2);
132     if (ang>M_PI/2)  myContG1= M_PI-ang;
133     else  myContG1=ang; 
134   }
135   else{ myIsDone=Standard_False;
136         myErrorStatus=LocalAnalysis_NormalNotDefined;} 
137 }
138
139 /*********************************************************************************/
140
141 void   LocalAnalysis_SurfaceContinuity::SurfG2 ( GeomLProp_SLProps& Surf1, 
142                                           GeomLProp_SLProps & Surf2)
143 { gp_Dir DMIN1, DMIN2, DMAX1, DMAX2;
144   Standard_Real RMIN1,RMIN2,RMAX1,RMAX2;
145   Standard_Real  x1, x2, y1, y2, z1, z2;
146  
147   if ( Surf1.IsCurvatureDefined() && Surf2.IsCurvatureDefined())
148     { 
149       Surf1.CurvatureDirections(DMIN1, DMAX1);
150       Surf2.CurvatureDirections(DMIN2, DMAX2);
151       DMIN1.Coord(x1, y1, z1);
152       DMAX1.Coord(x2, y2, z2);
153       gp_Dir MCD1( (Abs(x1)+Abs(x2))/2, (Abs(y1)+Abs(y2))/2, (Abs(z1)+Abs(z2))/2 );
154       DMIN2.Coord(x1, y1, z1);
155       DMAX2.Coord(x2, y2, z2);
156       gp_Dir MCD2( (Abs(x1)+Abs(x2))/2, (Abs(y1)+Abs(y2))/2, (Abs(z1)+Abs(z2))/2 );
157   
158       myAlpha = MCD1.Angle( MCD2 );
159       RMIN1 = Surf1.MinCurvature();  
160       RMAX1 = Surf1.MaxCurvature();  
161       RMIN2 = Surf2.MinCurvature();  
162       RMAX2 = Surf2.MaxCurvature();
163       myETA1 = (RMIN1+RMAX1)/2;
164       myETA2 = (RMIN2+RMAX2)/2;
165       myETA  = (myETA1+myETA2)/2;
166       myZETA1 = (RMAX1-RMIN1)/2;
167       myZETA2 = (RMAX2-RMIN2)/2;
168       myZETA = (myZETA1+myZETA2)/2;
169       Standard_Real DETA,DZETA; 
170       DETA = ( myETA1- myETA2)/2;
171       DZETA =( myZETA1- myZETA2)/2;
172        myGap= Abs(DETA) + sqrt( DZETA*DZETA*Cos(myAlpha)*Cos(myAlpha)
173                      + myZETA*myZETA*Sin(myAlpha)*Sin(myAlpha));
174        }   
175    else {myIsDone = Standard_False;
176          myErrorStatus=LocalAnalysis_CurvatureNotDefined;}
177           
178 }
179 LocalAnalysis_SurfaceContinuity::LocalAnalysis_SurfaceContinuity(const Standard_Real EpsNul,
180                                                                  const Standard_Real EpsC0,
181                                                                  const Standard_Real EpsC1,
182                                                                  const Standard_Real EpsC2,
183                                                                  const Standard_Real EpsG1,
184                                                                  const Standard_Real Percent,
185                                                                  const Standard_Real Maxlen)
186 { myepsnul=EpsNul;
187   myepsC0= EpsC0;
188   myepsC1= EpsC1;
189   myepsC2= EpsC2;
190   myepsG1= EpsG1;
191   myperce= Percent;
192   mymaxlen= Maxlen;
193   myIsDone = Standard_True;
194 }
195  void LocalAnalysis_SurfaceContinuity::ComputeAnalysis(GeomLProp_SLProps& Surf1,
196                                                        GeomLProp_SLProps& Surf2,
197                                                        const GeomAbs_Shape Order)
198 {  myTypeCont = Order;
199    switch ( Order )
200         { case GeomAbs_C0 : {
201                                 SurfC0(Surf1, Surf2);
202                             }
203                             break;
204           case GeomAbs_C1 : {
205                                SurfC0(Surf1, Surf2);
206                                SurfC1(Surf1, Surf2);}
207                             break;
208           case GeomAbs_C2 : {
209                               SurfC0(Surf1, Surf2);
210                               SurfC1(Surf1, Surf2);
211                               SurfC2(Surf1, Surf2);}
212                             break;
213           case GeomAbs_G1 : {
214                               SurfC0(Surf1, Surf2);
215                               SurfG1(Surf1, Surf2);}
216                             break;
217           case GeomAbs_G2 : {
218                               SurfC0(Surf1, Surf2);
219                               SurfG1(Surf1, Surf2);
220                               SurfG2(Surf1, Surf2);}
221                             break;
222           default         : {}
223         }
224
225 }
226
227 /*********************************************************************************/
228
229 LocalAnalysis_SurfaceContinuity::LocalAnalysis_SurfaceContinuity( const Handle(Geom_Surface)& Surf1, 
230                          const Standard_Real u1, const Standard_Real v1, 
231                          const Handle(Geom_Surface)& Surf2, const Standard_Real u2, 
232                          const Standard_Real v2, const GeomAbs_Shape Ordre, 
233                          const Standard_Real EpsNul,
234                          const Standard_Real EpsC0 ,
235                          const Standard_Real EpsC1 ,
236                          const Standard_Real EpsC2,
237                          const Standard_Real EpsG1,
238                          const Standard_Real Percent,               
239                          const Standard_Real  Maxlen )
240 { myTypeCont = Ordre;
241   myepsnul=EpsNul;
242   myepsC0= EpsC0;
243   myepsC1= EpsC1;
244   myepsC2= EpsC2;
245   myepsG1= EpsG1;
246   myperce= Percent;
247   mymaxlen= Maxlen;
248   myIsDone = Standard_True;
249   switch ( Ordre )
250         { case GeomAbs_C0 : {
251                                GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 0, myepsnul);
252                                GeomLProp_SLProps Surfa2 ( Surf2, u2, v2, 0, myepsnul);
253                                 SurfC0(Surfa1, Surfa2);
254                             }
255                             break;
256           case GeomAbs_C1 : {
257                                GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 1, myepsnul); 
258                                GeomLProp_SLProps   Surfa2 ( Surf2, u2, v2, 1, myepsnul);
259                                SurfC0(Surfa1, Surfa2);
260                                SurfC1(Surfa1, Surfa2);}
261                             break;
262           case GeomAbs_C2 : {
263                                GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 2, myepsnul); 
264                                 GeomLProp_SLProps Surfa2 ( Surf2, u2, v2, 2, myepsnul);
265                               SurfC0(Surfa1, Surfa2);
266                               SurfC1(Surfa1, Surfa2);
267                               SurfC2(Surfa1, Surfa2);}
268                             break;
269           case GeomAbs_G1 : {
270                                GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 1, myepsnul); 
271                                 GeomLProp_SLProps  Surfa2 ( Surf2, u2, v2, 1, myepsnul);
272                               SurfC0(Surfa1, Surfa2);
273                               SurfG1(Surfa1, Surfa2);}
274                             break;
275           case GeomAbs_G2 : {
276                               GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 2, myepsnul); 
277                               GeomLProp_SLProps Surfa2 ( Surf2, u2, v2, 2, myepsnul);
278                               SurfC0(Surfa1, Surfa2);
279                               SurfG1(Surfa1, Surfa2);
280                               SurfG2(Surfa1, Surfa2);}
281                             break;
282           default         : {}
283         }
284 }
285
286 /*********************************************************************************/
287
288 LocalAnalysis_SurfaceContinuity::LocalAnalysis_SurfaceContinuity(const Handle(Geom2d_Curve)& curv1, 
289                          const Handle(Geom2d_Curve)& curv2, const Standard_Real U, 
290                          const Handle(Geom_Surface)& Surf1 , 
291                          const Handle(Geom_Surface)& Surf2, 
292                          const GeomAbs_Shape Ordre,
293                          const Standard_Real EpsNul,
294                          const Standard_Real EpsC0 ,
295                          const Standard_Real EpsC1 ,
296                          const Standard_Real EpsC2,
297                          const Standard_Real EpsG1,
298                          const Standard_Real Percent,               
299                          const Standard_Real  Maxlen )
300 { Standard_Real pard1, parf1, pard2, parf2, u1, v1, u2, v2;
301   
302   myTypeCont = Ordre;
303   myepsnul=EpsNul;
304   myepsC0= EpsC0;
305   myepsC1= EpsC1;
306   myepsC2= EpsC2;
307   myepsG1= EpsG1;
308   myperce= Percent;
309   mymaxlen= Maxlen;
310   myIsDone = Standard_True;
311
312   pard1 = curv1->FirstParameter();
313   pard2 = curv2->FirstParameter();
314   parf1 = curv1->LastParameter();
315   parf2 = curv2->LastParameter();
316
317
318   if (!(((U <= parf1) && (U >= pard1)) &&((U <= parf2) && (U >= pard2))) )    myIsDone = Standard_False; 
319     else 
320     { gp_Pnt2d pt1 = curv1->Value(U);
321       gp_Pnt2d pt2 = curv2->Value(U);
322        
323       pt1.Coord(u1, v1);
324       pt2.Coord(u2, v2);
325       switch ( Ordre )
326           { case GeomAbs_C0 : {
327                                  GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 0, myepsnul);
328                                  GeomLProp_SLProps Surfa2 ( Surf2, u2, v2, 0, myepsnul);
329                                  SurfC0(Surfa1, Surfa2);
330                               }
331                               break;
332             case GeomAbs_C1 : {
333                                  GeomLProp_SLProps Surfa1 ( Surf1, u1, v1, 1, myepsnul);
334                                   GeomLProp_SLProps Surfa2 ( Surf2, u2, v2, 1, myepsnul);
335                                 SurfC0(Surfa1, Surfa2);
336                                 SurfC1(Surfa1, Surfa2);}
337                               break;
338             case GeomAbs_C2 : {
339                                  GeomLProp_SLProps  Surfa1 ( Surf1, u1, v1, 2, myepsnul); 
340                                  GeomLProp_SLProps   Surfa2 ( Surf2, u2, v2, 2, myepsnul);
341                                 SurfC0(Surfa1, Surfa2);
342                                 SurfC1(Surfa1, Surfa2);
343                                 SurfC2(Surfa1, Surfa2);}
344                               break;
345             case GeomAbs_G1 : {
346                                  GeomLProp_SLProps  Surfa1 ( Surf1, u1, v1, 1, myepsnul); 
347                                  GeomLProp_SLProps Surfa2 ( Surf2, u2, v2, 1, myepsnul);
348                                  SurfC0(Surfa1, Surfa2);
349                                  SurfG1(Surfa1, Surfa2);}
350                               break;
351             case GeomAbs_G2 : {
352                                 GeomLProp_SLProps   Surfa1 ( Surf1, u1, v1, 2, myepsnul); 
353                                  GeomLProp_SLProps  Surfa2 ( Surf2, u2, v2, 2, myepsnul);
354                                 SurfC0(Surfa1, Surfa2);
355                                 SurfG1(Surfa1, Surfa2);
356                                 SurfG2(Surfa1, Surfa2);}
357                               break;
358             default         : {}
359           }
360     }
361 }
362
363 /*********************************************************************************/
364
365 Standard_Boolean LocalAnalysis_SurfaceContinuity::IsC0() const 
366 { if (!myIsDone) { StdFail_NotDone::Raise();}
367   if ( myContC0 <= myepsC0 ) 
368      return Standard_True;
369      else return Standard_False;
370 }
371
372 /*********************************************************************************/
373
374 Standard_Boolean LocalAnalysis_SurfaceContinuity::IsC1() const 
375 { if (!myIsDone) { StdFail_NotDone::Raise();}
376   if ( IsC0 () && (myContC1U <= myepsC1) && (myContC1V <= myepsC1))
377    return Standard_True;
378   else return Standard_False;
379 }
380
381 /*********************************************************************************/
382
383 Standard_Boolean LocalAnalysis_SurfaceContinuity::IsC2() const 
384 { Standard_Real eps1u, eps1v, eps2u, eps2v;
385
386   if (!myIsDone) { StdFail_NotDone::Raise();}
387   if ( IsC1())
388      { eps1u = 0.5*myepsC1*myepsC1*myLambda1U;
389        eps1v = 0.5*myepsC1*myepsC1*myLambda1V;
390        eps2u = 0.5*myepsC2*myepsC2*myLambda2U;
391        eps2v = 0.5*myepsC2*myepsC2*myLambda2V;
392        if ((myContC2U < myepsC2) && (myContC2V < myepsC2))
393           { if (Abs(myLambda1U*myLambda1U-myLambda2U) <= (eps1u*eps1u+eps2u))
394                if (Abs(myLambda1V*myLambda1V-myLambda2V) <= (eps1v*eps1v+eps2v))
395                   return Standard_True;
396                else return  Standard_False;
397             else return  Standard_False;
398           }
399           else return  Standard_False;        
400      }
401      else return Standard_False;
402     
403 }
404
405 /*********************************************************************************/
406
407 Standard_Boolean LocalAnalysis_SurfaceContinuity::IsG1() const 
408 {
409   if (!myIsDone) { StdFail_NotDone::Raise();} 
410   if ( IsC0 () &&( myContG1 <= myepsG1))
411        return Standard_True;
412       else return Standard_False;
413 }
414
415 /*********************************************************************************/
416
417 Standard_Boolean LocalAnalysis_SurfaceContinuity::IsG2()const 
418 { Standard_Real EPSNL;
419   Standard_Integer itype;
420  
421   if (!myIsDone) { StdFail_NotDone::Raise();} 
422   itype =0;
423   EPSNL= 8*myepsC0/(mymaxlen*mymaxlen);
424   if ( IsG1())
425      { if ( ( Abs(myETA)< EPSNL) && ( Abs(myZETA)< EPSNL))
426           return Standard_True;
427         if ( ( Abs(myZETA1)< EPSNL) && ( Abs(myZETA2)< EPSNL))
428            itype =1;
429            else if ( ( Abs(myETA1)< EPSNL) && ( Abs(myETA2)< EPSNL))
430                    itype =1;
431                    else if ((Abs(Abs(myZETA)-Abs(myETA))) < EPSNL)
432                            itype =1;
433                            else if ((myETA1<myZETA1)&&(myETA2<myZETA2))
434                                    itype =1; 
435                                    else if ((myETA1>myZETA1)&&(myETA2>myZETA2))
436                                            itype =1; 
437        if (itype == 1)
438           { 
439
440             if (( myETA >= (2*myZETA))&&(myGap<=(myperce*(myETA-myZETA)))) return Standard_True;
441             if (( myZETA>= myETA) && ( myGap<= (myperce*myZETA))) return Standard_True;
442             if (( myZETA<= myETA) && ( myETA <= (2*myZETA)) && (myGap <= (myperce * myETA))) 
443                return Standard_True;
444                else  return Standard_False;
445                     
446           }
447           else  return Standard_False;
448      }
449      else return Standard_False;
450
451 }
452
453   
454 /*********************************************************************************/
455
456 GeomAbs_Shape  LocalAnalysis_SurfaceContinuity::ContinuityStatus() const 
457 {
458  if (!myIsDone) { StdFail_NotDone::Raise();}
459  return (myTypeCont);
460 }
461
462 /*********************************************************************************/
463
464 Standard_Real LocalAnalysis_SurfaceContinuity::C0Value() const 
465
466   if (!myIsDone) { StdFail_NotDone::Raise();}
467   return ( myContC0    );
468 }
469
470 /*********************************************************************************/
471
472 Standard_Real LocalAnalysis_SurfaceContinuity::C1UAngle() const 
473 {
474   if (!myIsDone) { StdFail_NotDone::Raise();}
475   return ( myContC1U    );
476 }
477
478 /*********************************************************************************/
479
480 Standard_Real LocalAnalysis_SurfaceContinuity::C1VAngle() const 
481 {
482   if (!myIsDone) { StdFail_NotDone::Raise();}
483   return ( myContC1V    );
484 }
485
486 /*********************************************************************************/
487
488 Standard_Real LocalAnalysis_SurfaceContinuity::C2UAngle() const 
489 {
490   if (!myIsDone) { StdFail_NotDone::Raise();}
491   return ( myContC2U    );
492 }
493
494 /*********************************************************************************/
495
496 Standard_Real LocalAnalysis_SurfaceContinuity::C2VAngle() const 
497 {
498   if (!myIsDone) { StdFail_NotDone::Raise();}
499   return ( myContC2V    );
500 }
501
502 /*********************************************************************************/
503
504 Standard_Real LocalAnalysis_SurfaceContinuity::G1Angle() const 
505 {
506   if (!myIsDone) { StdFail_NotDone::Raise();}
507   return ( myContG1    );
508 }
509
510 /*********************************************************************************/
511
512 Standard_Real LocalAnalysis_SurfaceContinuity::C1URatio() const 
513 {
514   if (!myIsDone) { StdFail_NotDone::Raise();}
515   return ( myLambda1U    );
516 }
517
518 /*********************************************************************************/
519
520 Standard_Real LocalAnalysis_SurfaceContinuity::C2URatio() const 
521 {
522   if (!myIsDone) { StdFail_NotDone::Raise();}
523   return ( myLambda2U    );
524 }
525
526 /*********************************************************************************/
527
528 Standard_Real LocalAnalysis_SurfaceContinuity::C1VRatio() const 
529 {
530   if (!myIsDone) { StdFail_NotDone::Raise();}
531   return ( myLambda1V    );
532 }
533
534 /*********************************************************************************/
535
536 Standard_Real LocalAnalysis_SurfaceContinuity::C2VRatio() const 
537
538   if (!myIsDone) { StdFail_NotDone::Raise();}
539  return ( myLambda2V    );
540 }
541
542 /*********************************************************************************/
543
544 Standard_Real LocalAnalysis_SurfaceContinuity::G2CurvatureGap() const 
545 {
546   if (!myIsDone) { StdFail_NotDone::Raise();}
547   return ( myGap    );
548 }
549
550 /*********************************************************************************/
551
552 Standard_Boolean LocalAnalysis_SurfaceContinuity::IsDone() const
553 { return ( myIsDone );
554 }
555
556 /*********************************************************************************/
557 LocalAnalysis_StatusErrorType  LocalAnalysis_SurfaceContinuity::StatusError() const
558 {
559 return  myErrorStatus;
560 }