1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #include <Bnd_Box.hxx>
17 #include <Bnd_Box2d.hxx>
20 #include <gp_Circ.hxx>
21 #include <gp_Circ2d.hxx>
22 #include <gp_Cone.hxx>
23 #include <gp_Cylinder.hxx>
24 #include <gp_Elips.hxx>
25 #include <gp_Elips2d.hxx>
26 #include <gp_Hypr.hxx>
27 #include <gp_Hypr2d.hxx>
29 #include <gp_Lin2d.hxx>
30 #include <gp_Parab.hxx>
31 #include <gp_Parab2d.hxx>
33 #include <gp_Pnt2d.hxx>
34 #include <gp_Sphere.hxx>
35 #include <gp_Torus.hxx>
38 #include <Precision.hxx>
39 #include <Standard_Failure.hxx>
42 Standard_Integer ComputeBox(const gp_Hypr& aHypr,
43 const Standard_Real aT1,
44 const Standard_Real aT2,
51 template<class PointType, class BndBoxType>
52 void Compute (const Standard_Real theP1, const Standard_Real theP2,
53 const Standard_Real theRa ,const Standard_Real theRb,
54 const PointType& theXd, const PointType& theYd, const PointType& theO,
70 Standard_Real aDelta = Abs(aTeta2-aTeta1);
71 if(aDelta > 2. * M_PI)
80 do{ aTeta1 += 2.*M_PI; } while (aTeta1 < 0.);
82 else if (aTeta1 > 2.*M_PI)
84 do { aTeta1 -= 2.*M_PI; } while (aTeta1 > 2.*M_PI);
86 aTeta2 = aTeta1 + aDelta;
89 // One places already both ends
90 Standard_Real aCn1, aSn1 ,aCn2, aSn2;
91 aCn1 = Cos(aTeta1); aSn1 = Sin(aTeta1);
92 aCn2 = Cos(aTeta2); aSn2 = Sin(aTeta2);
93 theB.Add(PointType( theO.Coord() +theRa*aCn1*theXd.Coord() +theRb*aSn1*theYd.Coord()));
94 theB.Add(PointType(theO.Coord() +theRa*aCn2*theXd.Coord() +theRb*aSn2*theYd.Coord()));
96 Standard_Real aRam, aRbm;
99 // Main radiuses to take into account only 8 points (/cos(Pi/8.))
100 aRam = theRa/0.92387953251128674;
101 aRbm = theRb/0.92387953251128674;
105 // Main radiuses to take into account the arrow
106 Standard_Real aTc = cos(aDelta/2);
110 theB.Add(PointType(theO.Coord() + aRam*aCn1*theXd.Coord() + aRbm*aSn1*theYd.Coord()));
111 theB.Add(PointType(theO.Coord() + aRam*aCn2*theXd.Coord() + aRbm*aSn2*theYd.Coord()));
113 // cos or sin M_PI/4.
114 #define PI4 0.70710678118654746
116 // 8 points of the polygon
117 #define addPoint0 theB.Add(PointType(theO.Coord() +aRam*theXd.Coord()))
118 #define addPoint1 theB.Add(PointType(theO.Coord() +aRam*PI4*theXd.Coord() +aRbm*PI4*theYd.Coord()))
119 #define addPoint2 theB.Add(PointType(theO.Coord() +aRbm*theYd.Coord()))
120 #define addPoint3 theB.Add(PointType(theO.Coord() -aRam*PI4*theXd.Coord() +aRbm*PI4*theYd.Coord()))
121 #define addPoint4 theB.Add(PointType(theO.Coord() -aRam*theXd.Coord() ))
122 #define addPoint5 theB.Add(PointType(theO.Coord() -aRam*PI4*theXd.Coord() -aRbm*PI4*theYd.Coord()))
123 #define addPoint6 theB.Add(PointType(theO.Coord() -aRbm*theYd.Coord()))
124 #define addPoint7 theB.Add(PointType(theO.Coord() +aRam*PI4*theXd.Coord() -aRbm*PI4*theYd.Coord()))
126 Standard_Integer aDeb = (Standard_Integer )( aTeta1/(M_PI/4.));
127 Standard_Integer aFin = (Standard_Integer )( aTeta2/(M_PI/4.));
130 if (aDeb > aFin) return;
137 if (aFin <= 1) break;
142 if (aFin <= 2) break;
147 if (aFin <= 3) break;
152 if (aFin <= 4) break;
157 if (aFin <= 5) break;
162 if (aFin <= 6) break;
167 if (aFin <= 7) break;
172 if (aFin <= 8) break;
177 if (aFin <= 9) break;
182 if (aFin <= 10) break;
187 if (aFin <= 11) break;
192 if (aFin <= 12) break;
197 if (aFin <= 13) break;
202 if (aFin <= 14) break;
207 if (aFin <= 15) break;
213 static void OpenMin(const gp_Dir& V,Bnd_Box& B) {
217 if (V.IsParallel(OX,Precision::Angular()))
219 else if (V.IsParallel(OY,Precision::Angular()))
221 else if (V.IsParallel(OZ,Precision::Angular()))
224 B.OpenXmin();B.OpenYmin();B.OpenZmin();
228 static void OpenMax(const gp_Dir& V,Bnd_Box& B) {
232 if (V.IsParallel(OX,Precision::Angular()))
234 else if (V.IsParallel(OY,Precision::Angular()))
236 else if (V.IsParallel(OZ,Precision::Angular()))
239 B.OpenXmax();B.OpenYmax();B.OpenZmax();
243 static void OpenMinMax(const gp_Dir& V,Bnd_Box& B) {
247 if (V.IsParallel(OX,Precision::Angular())) {
248 B.OpenXmax();B.OpenXmin();
250 else if (V.IsParallel(OY,Precision::Angular())) {
251 B.OpenYmax();B.OpenYmin();
253 else if (V.IsParallel(OZ,Precision::Angular())) {
254 B.OpenZmax();B.OpenZmin();
257 B.OpenXmin();B.OpenYmin();B.OpenZmin();
258 B.OpenXmax();B.OpenYmax();B.OpenZmax();
262 static void OpenMin(const gp_Dir2d& V,Bnd_Box2d& B) {
265 if (V.IsParallel(OX,Precision::Angular()))
267 else if (V.IsParallel(OY,Precision::Angular()))
270 B.OpenXmin();B.OpenYmin();
274 static void OpenMax(const gp_Dir2d& V,Bnd_Box2d& B) {
277 if (V.IsParallel(OX,Precision::Angular()))
279 else if (V.IsParallel(OY,Precision::Angular()))
282 B.OpenXmax();B.OpenYmax();
286 static void OpenMinMax(const gp_Dir2d& V,Bnd_Box2d& B) {
289 if (V.IsParallel(OX,Precision::Angular())) {
290 B.OpenXmax();B.OpenXmin();
292 else if (V.IsParallel(OY,Precision::Angular())) {
293 B.OpenYmax();B.OpenYmin();
296 B.OpenXmin();B.OpenYmin();
297 B.OpenXmax();B.OpenYmax();
302 void BndLib::Add( const gp_Lin& L,const Standard_Real P1,
303 const Standard_Real P2,
304 const Standard_Real Tol, Bnd_Box& B) {
306 if (Precision::IsNegativeInfinite(P1)) {
307 if (Precision::IsNegativeInfinite(P2)) {
308 Standard_Failure::Raise("BndLib::bad parameter");
310 else if (Precision::IsPositiveInfinite(P2)) {
311 OpenMinMax(L.Direction(),B);
312 B.Add(ElCLib::Value(0.,L));
315 OpenMin(L.Direction(),B);
316 B.Add(ElCLib::Value(P2,L));
319 else if (Precision::IsPositiveInfinite(P1)) {
320 if (Precision::IsNegativeInfinite(P2)) {
321 OpenMinMax(L.Direction(),B);
322 B.Add(ElCLib::Value(0.,L));
324 else if (Precision::IsPositiveInfinite(P2)) {
325 Standard_Failure::Raise("BndLib::bad parameter");
328 OpenMax(L.Direction(),B);
329 B.Add(ElCLib::Value(P2,L));
333 B.Add(ElCLib::Value(P1,L));
334 if (Precision::IsNegativeInfinite(P2)) {
335 OpenMin(L.Direction(),B);
337 else if (Precision::IsPositiveInfinite(P2)){
338 OpenMax(L.Direction(),B);
341 B.Add(ElCLib::Value(P2,L));
347 void BndLib::Add( const gp_Lin2d& L,const Standard_Real P1,
348 const Standard_Real P2,
349 const Standard_Real Tol, Bnd_Box2d& B) {
351 if (Precision::IsNegativeInfinite(P1)) {
352 if (Precision::IsNegativeInfinite(P2)) {
353 Standard_Failure::Raise("BndLib::bad parameter");
355 else if (Precision::IsPositiveInfinite(P2)) {
356 OpenMinMax(L.Direction(),B);
357 B.Add(ElCLib::Value(0.,L));
360 OpenMin(L.Direction(),B);
361 B.Add(ElCLib::Value(P2,L));
364 else if (Precision::IsPositiveInfinite(P1)) {
365 if (Precision::IsNegativeInfinite(P2)) {
366 OpenMinMax(L.Direction(),B);
367 B.Add(ElCLib::Value(0.,L));
369 else if (Precision::IsPositiveInfinite(P2)) {
370 Standard_Failure::Raise("BndLib::bad parameter");
373 OpenMax(L.Direction(),B);
374 B.Add(ElCLib::Value(P2,L));
378 B.Add(ElCLib::Value(P1,L));
379 if (Precision::IsNegativeInfinite(P2)) {
380 OpenMin(L.Direction(),B);
382 else if (Precision::IsPositiveInfinite(P2)){
383 OpenMax(L.Direction(),B);
386 B.Add(ElCLib::Value(P2,L));
392 void BndLib::Add( const gp_Circ& C,const Standard_Real Tol, Bnd_Box& B) {
394 Standard_Real R = C.Radius();
395 gp_XYZ O = C.Location().XYZ();
396 gp_XYZ Xd = C.XAxis().Direction().XYZ();
397 gp_XYZ Yd = C.YAxis().Direction().XYZ();
398 B.Add(gp_Pnt(O -R*Xd -R*Yd));
399 B.Add(gp_Pnt(O -R*Xd +R*Yd));
400 B.Add(gp_Pnt(O +R*Xd -R*Yd));
401 B.Add(gp_Pnt(O +R*Xd +R*Yd));
405 void BndLib::Add( const gp_Circ& C,const Standard_Real P1,
406 const Standard_Real P2,
407 const Standard_Real Tol, Bnd_Box& B) {
409 Compute(P1,P2,C.Radius(),C.Radius(),gp_Pnt(C.XAxis().Direction().XYZ()),
410 gp_Pnt(C.YAxis().Direction().XYZ()),C.Location(),B);
414 void BndLib::Add( const gp_Circ2d& C,const Standard_Real Tol, Bnd_Box2d& B) {
416 Standard_Real R = C.Radius();
417 gp_XY O = C.Location().XY();
418 gp_XY Xd = C.XAxis().Direction().XY();
419 gp_XY Yd = C.YAxis().Direction().XY();
420 B.Add(gp_Pnt2d(O -R*Xd -R*Yd));
421 B.Add(gp_Pnt2d(O -R*Xd +R*Yd));
422 B.Add(gp_Pnt2d(O +R*Xd -R*Yd));
423 B.Add(gp_Pnt2d(O +R*Xd +R*Yd));
427 void BndLib::Add(const gp_Circ2d& C,const Standard_Real P1,
428 const Standard_Real P2,
429 const Standard_Real Tol, Bnd_Box2d& B) {
431 Compute(P1,P2,C.Radius(),C.Radius(),gp_Pnt2d(C.XAxis().Direction().XY()),
432 gp_Pnt2d(C.YAxis().Direction().XY()),C.Location(),B);
436 void BndLib::Add( const gp_Elips& C,const Standard_Real Tol, Bnd_Box& B) {
438 Standard_Real Ra = C.MajorRadius();
439 Standard_Real Rb = C.MinorRadius();
440 gp_XYZ Xd = C.XAxis().Direction().XYZ();
441 gp_XYZ Yd = C.YAxis().Direction().XYZ();
442 gp_XYZ O = C.Location().XYZ();
443 B.Add(gp_Pnt(O +Ra*Xd +Rb*Yd));
444 B.Add(gp_Pnt(O -Ra*Xd +Rb*Yd));
445 B.Add(gp_Pnt(O -Ra*Xd -Rb*Yd));
446 B.Add(gp_Pnt(O +Ra*Xd -Rb*Yd));
450 void BndLib::Add( const gp_Elips& C,const Standard_Real P1,
451 const Standard_Real P2,
452 const Standard_Real Tol, Bnd_Box& B) {
454 Compute(P1,P2,C.MajorRadius(),C.MinorRadius(),gp_Pnt(C.XAxis().Direction().XYZ()),
455 gp_Pnt(C.YAxis().Direction().XYZ()),C.Location(),B);
459 void BndLib::Add( const gp_Elips2d& C,const Standard_Real Tol, Bnd_Box2d& B) {
461 Standard_Real Ra= C.MajorRadius();
462 Standard_Real Rb= C.MinorRadius();
463 gp_XY Xd = C.XAxis().Direction().XY();
464 gp_XY Yd = C.YAxis().Direction().XY();
465 gp_XY O = C.Location().XY();
466 B.Add(gp_Pnt2d(O +Ra*Xd +Rb*Yd));
467 B.Add(gp_Pnt2d(O -Ra*Xd +Rb*Yd));
468 B.Add(gp_Pnt2d(O -Ra*Xd -Rb*Yd));
469 B.Add(gp_Pnt2d(O +Ra*Xd -Rb*Yd));
473 void BndLib::Add( const gp_Elips2d& C,const Standard_Real P1,
474 const Standard_Real P2,
475 const Standard_Real Tol, Bnd_Box2d& B) {
477 Compute(P1,P2,C.MajorRadius(),C.MinorRadius(),
478 gp_Pnt2d(C.XAxis().Direction().XY()),
479 gp_Pnt2d(C.YAxis().Direction().XY()),C.Location(),B);
483 void BndLib::Add( const gp_Parab& P,const Standard_Real P1,
484 const Standard_Real P2,
485 const Standard_Real Tol, Bnd_Box& B) {
487 if (Precision::IsNegativeInfinite(P1)) {
488 if (Precision::IsNegativeInfinite(P2)) {
489 Standard_Failure::Raise("BndLib::bad parameter");
491 else if (Precision::IsPositiveInfinite(P2)) {
492 B.OpenXmax();B.OpenYmax();B.OpenZmax();
495 B.Add(ElCLib::Value(P2,P));
497 B.OpenXmin();B.OpenYmin();B.OpenZmin();
499 else if (Precision::IsPositiveInfinite(P1)) {
500 if (Precision::IsNegativeInfinite(P2)) {
501 B.OpenXmin();B.OpenYmin();B.OpenZmin();
503 else if (Precision::IsPositiveInfinite(P2)) {
504 Standard_Failure::Raise("BndLib::bad parameter");
507 B.Add(ElCLib::Value(P2,P));
509 B.OpenXmax();B.OpenYmax();B.OpenZmax();
512 B.Add(ElCLib::Value(P1,P));
513 if (Precision::IsNegativeInfinite(P2)) {
514 B.OpenXmin();B.OpenYmin();B.OpenZmin();
516 else if (Precision::IsPositiveInfinite(P2)){
517 B.OpenXmax();B.OpenYmax();B.OpenZmax();
520 B.Add(ElCLib::Value(P2,P));
521 if (P1*P2<0) B.Add(ElCLib::Value(0.,P));
527 void BndLib::Add( const gp_Parab2d& P,const Standard_Real P1,
528 const Standard_Real P2,
529 const Standard_Real Tol, Bnd_Box2d& B) {
531 if (Precision::IsNegativeInfinite(P1)) {
532 if (Precision::IsNegativeInfinite(P2)) {
533 Standard_Failure::Raise("BndLib::bad parameter");
535 else if (Precision::IsPositiveInfinite(P2)) {
536 B.OpenXmax();B.OpenYmax();
539 B.Add(ElCLib::Value(P2,P));
541 B.OpenXmin();B.OpenYmin();
543 else if (Precision::IsPositiveInfinite(P1)) {
544 if (Precision::IsNegativeInfinite(P2)) {
545 B.OpenXmin();B.OpenYmin();
547 else if (Precision::IsPositiveInfinite(P2)) {
548 Standard_Failure::Raise("BndLib::bad parameter");
551 B.Add(ElCLib::Value(P2,P));
553 B.OpenXmax();B.OpenYmax();
556 B.Add(ElCLib::Value(P1,P));
557 if (Precision::IsNegativeInfinite(P2)) {
558 B.OpenXmin();B.OpenYmin();
560 else if (Precision::IsPositiveInfinite(P2)){
561 B.OpenXmax();B.OpenYmax();
564 B.Add(ElCLib::Value(P2,P));
565 if (P1*P2<0) B.Add(ElCLib::Value(0.,P));
571 //=======================================================================
574 //=======================================================================
575 void BndLib::Add(const gp_Hypr& H,
576 const Standard_Real P1,
577 const Standard_Real P2,
578 const Standard_Real Tol,
581 if (Precision::IsNegativeInfinite(P1)) {
582 if (Precision::IsNegativeInfinite(P2)) {
583 Standard_Failure::Raise("BndLib::bad parameter");
585 else if (Precision::IsPositiveInfinite(P2)) {
586 B.OpenXmax();B.OpenYmax();B.OpenZmax();
589 B.Add(ElCLib::Value(P2,H));
591 B.OpenXmin();B.OpenYmin();B.OpenZmin();
593 else if (Precision::IsPositiveInfinite(P1)) {
594 if (Precision::IsNegativeInfinite(P2)) {
595 B.OpenXmin();B.OpenYmin();B.OpenZmin();
597 else if (Precision::IsPositiveInfinite(P2)) {
598 Standard_Failure::Raise("BndLib::bad parameter");
601 B.Add(ElCLib::Value(P2,H));
603 B.OpenXmax();B.OpenYmax();B.OpenZmax();
606 B.Add(ElCLib::Value(P1,H));
607 if (Precision::IsNegativeInfinite(P2)) {
608 B.OpenXmin();B.OpenYmin();B.OpenZmin();
610 else if (Precision::IsPositiveInfinite(P2)){
611 B.OpenXmax();B.OpenYmax();B.OpenZmax();
614 ComputeBox(H, P1, P2, B);
620 void BndLib::Add(const gp_Hypr2d& H,const Standard_Real P1,
621 const Standard_Real P2,
622 const Standard_Real Tol, Bnd_Box2d& B) {
624 if (Precision::IsNegativeInfinite(P1)) {
625 if (Precision::IsNegativeInfinite(P2)) {
626 Standard_Failure::Raise("BndLib::bad parameter");
628 else if (Precision::IsPositiveInfinite(P2)) {
629 B.OpenXmax();B.OpenYmax();
632 B.Add(ElCLib::Value(P2,H));
634 B.OpenXmin();B.OpenYmin();
636 else if (Precision::IsPositiveInfinite(P1)) {
637 if (Precision::IsNegativeInfinite(P2)) {
638 B.OpenXmin();B.OpenYmin();
640 else if (Precision::IsPositiveInfinite(P2)) {
641 Standard_Failure::Raise("BndLib::bad parameter");
644 B.Add(ElCLib::Value(P2,H));
646 B.OpenXmax();B.OpenYmax();
649 B.Add(ElCLib::Value(P1,H));
650 if (Precision::IsNegativeInfinite(P2)) {
651 B.OpenXmin();B.OpenYmin();
653 else if (Precision::IsPositiveInfinite(P2)){
654 B.OpenXmax();B.OpenYmax();
657 B.Add(ElCLib::Value(P2,H));
658 if (P1*P2<0) B.Add(ElCLib::Value(0.,H));
664 void BndLib::Add( const gp_Cylinder& S,const Standard_Real UMin,
665 const Standard_Real UMax,const Standard_Real VMin,
666 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
668 if (Precision::IsNegativeInfinite(VMin)) {
669 if (Precision::IsNegativeInfinite(VMax)) {
670 Standard_Failure::Raise("BndLib::bad parameter");
672 else if (Precision::IsPositiveInfinite(VMax)) {
673 OpenMinMax(S.Axis().Direction(),B);
676 Compute(UMin,UMax,S.Radius(),S.Radius(),
677 gp_Pnt(S.XAxis().Direction().XYZ()),
678 gp_Pnt(S.YAxis().Direction().XYZ()),
679 gp_Pnt(S.Location().XYZ() + VMax*S.Axis().Direction().XYZ()),B);
680 OpenMin(S.Axis().Direction(),B);
683 else if (Precision::IsPositiveInfinite(VMin)) {
684 if (Precision::IsNegativeInfinite(VMax)) {
685 OpenMinMax(S.Axis().Direction(),B);
687 else if (Precision::IsPositiveInfinite(VMax)) {
688 Standard_Failure::Raise("BndLib::bad parameter");
691 Compute(UMin,UMax,S.Radius(),S.Radius(),
692 gp_Pnt(S.XAxis().Direction().XYZ()),
693 gp_Pnt(S.YAxis().Direction().XYZ()),
694 gp_Pnt(S.Location().XYZ() + VMax*S.Axis().Direction().XYZ()),B);
695 OpenMax(S.Axis().Direction(),B);
700 Compute(UMin,UMax,S.Radius(),S.Radius(),
701 gp_Pnt(S.XAxis().Direction().XYZ()),
702 gp_Pnt(S.YAxis().Direction().XYZ()),
703 gp_Pnt(S.Location().XYZ() + VMin*S.Axis().Direction().XYZ()),B);
704 if (Precision::IsNegativeInfinite(VMax)) {
705 OpenMin(S.Axis().Direction(),B);
707 else if (Precision::IsPositiveInfinite(VMax)) {
708 OpenMax(S.Axis().Direction(),B);
711 Compute(UMin,UMax,S.Radius(),S.Radius(),
712 gp_Pnt(S.XAxis().Direction().XYZ()),
713 gp_Pnt(S.YAxis().Direction().XYZ()),
714 gp_Pnt(S.Location().XYZ() + VMax*S.Axis().Direction().XYZ()),B);
722 void BndLib::Add( const gp_Cylinder& S,const Standard_Real VMin,
723 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
725 BndLib::Add(S,0.,2.*M_PI,VMin,VMax,Tol,B);
728 void BndLib::Add(const gp_Cone& S,const Standard_Real UMin,
729 const Standard_Real UMax,const Standard_Real VMin,
730 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
732 Standard_Real R = S.RefRadius();
733 Standard_Real A = S.SemiAngle();
734 if (Precision::IsNegativeInfinite(VMin)) {
735 if (Precision::IsNegativeInfinite(VMax)) {
736 Standard_Failure::Raise("BndLib::bad parameter");
738 else if (Precision::IsPositiveInfinite(VMax)) {
739 gp_Dir D(Cos(A)*S.Axis().Direction());
743 Compute(UMin,UMax,R+VMax*Sin(A),R+VMax*Sin(A),
744 gp_Pnt(S.XAxis().Direction().XYZ()),
745 gp_Pnt(S.YAxis().Direction().XYZ()),
746 gp_Pnt(S.Location().XYZ() +
747 VMax*Cos(A)*S.Axis().Direction().XYZ()),B);
748 gp_Dir D(Cos(A)*S.Axis().Direction());
753 else if (Precision::IsPositiveInfinite(VMin)) {
754 if (Precision::IsNegativeInfinite(VMax)) {
755 gp_Dir D(Cos(A)*S.Axis().Direction());
758 else if (Precision::IsPositiveInfinite(VMax)) {
759 Standard_Failure::Raise("BndLib::bad parameter");
762 Compute(UMin,UMax,R+VMax*Sin(A),R+VMax*Sin(A),
763 gp_Pnt(S.XAxis().Direction().XYZ()),
764 gp_Pnt(S.YAxis().Direction().XYZ()),
765 gp_Pnt(S.Location().XYZ() +
766 VMax*Cos(A)*S.Axis().Direction().XYZ()),B);
767 gp_Dir D(Cos(A)*S.Axis().Direction());
773 Compute(UMin,UMax,R+VMin*Sin(A),R+VMin*Sin(A),
774 gp_Pnt(S.XAxis().Direction().XYZ()),
775 gp_Pnt(S.YAxis().Direction().XYZ()),
776 gp_Pnt(S.Location().XYZ() +
777 VMin*Cos(A)*S.Axis().Direction().XYZ()),B);
778 if (Precision::IsNegativeInfinite(VMax)) {
779 gp_Dir D(Cos(A)*S.Axis().Direction());
782 else if (Precision::IsPositiveInfinite(VMax)) {
783 gp_Dir D(Cos(A)*S.Axis().Direction());
787 Compute(UMin,UMax,R+VMax*Sin(A),R+VMax*Sin(A),
788 gp_Pnt(S.XAxis().Direction().XYZ()),
789 gp_Pnt(S.YAxis().Direction().XYZ()),
790 gp_Pnt(S.Location().XYZ() +
791 VMax*Cos(A)*S.Axis().Direction().XYZ()),B);
799 void BndLib::Add( const gp_Cone& S,const Standard_Real VMin,
800 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
802 BndLib::Add(S,0.,2.*M_PI,VMin,VMax,Tol,B);
805 void BndLib::Add(const gp_Sphere& S,const Standard_Real UMin,
806 const Standard_Real UMax,const Standard_Real VMin,
807 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
821 if (-Fi1>Precision::Angular()) {
822 if (-Fi2>Precision::Angular()) {
823 Compute(UMin,UMax,S.Radius(),S.Radius(),
824 gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),
826 Compute(UMin,UMax,S.Radius(),S.Radius(),
827 gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),
828 gp_Pnt(S.Location().XYZ()- S.Radius()*S.Position().Axis().Direction().XYZ()),B);
831 Compute(UMin,UMax,S.Radius(),S.Radius(),
832 gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),
833 gp_Pnt(S.Location().XYZ()+ S.Radius()*S.Position().Axis().Direction().XYZ()),B);
834 Compute(UMin,UMax,S.Radius(),S.Radius(),
835 gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),
836 gp_Pnt(S.Location().XYZ()- S.Radius()*S.Position().Axis().Direction().XYZ()),B);
840 Compute(UMin,UMax,S.Radius(),S.Radius(),
841 gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),
843 Compute(UMin,UMax,S.Radius(),S.Radius(),
844 gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),
845 gp_Pnt(S.Location().XYZ() +S.Radius()*S.Position().Axis().Direction().XYZ()),B);
849 Standard_Real u,v,du,dv;
850 Standard_Integer iu,iv;
853 Standard_Real COSV[11];
854 Standard_Real SINV[11];
855 for(iv=0,v=VMin;iv<=10;iv++) {
860 for(u=UMin,iu=0; iu<=10 ; iu++) {
861 Standard_Real Radiuscosu=S.Radius()*cos(u);
862 Standard_Real Radiussinu=S.Radius()*sin(u);
863 for(v=VMin,iv=0; iv<=10 ; iv++) {
864 Standard_Real sinv=SINV[iv];
865 Standard_Real cosv=COSV[iv];
867 M.SetLinearForm (cosv*Radiuscosu, S.Position().XDirection().XYZ(),
868 cosv*Radiussinu, S.Position().YDirection().XYZ(),
869 S.Radius()*sinv, S.Position().Direction().XYZ() ,
870 S.Position().Location().XYZ() );
872 //-- cout<<"point p"<<++t<<" "<<M.X()<<" "<<M.Y()<<" "<<M.Z()<<endl;
879 Standard_Real Maxduv = Max(du,dv)*0.5;
880 Standard_Real Fleche = S.Radius() * (1 - cos(Maxduv));
886 void BndLib::Add( const gp_Sphere& S,const Standard_Real Tol, Bnd_Box& B) {
888 Standard_Real R = S.Radius();
889 gp_XYZ O = S.Location().XYZ();
890 gp_XYZ Xd = S.XAxis().Direction().XYZ();
891 gp_XYZ Yd = S.YAxis().Direction().XYZ();
892 gp_XYZ Zd = S.Position().Axis().Direction().XYZ();
893 B.Add(gp_Pnt(O -R*Xd -R*Yd+ R*Zd));
894 B.Add(gp_Pnt(O -R*Xd +R*Yd+ R*Zd));
895 B.Add(gp_Pnt(O +R*Xd -R*Yd+ R*Zd));
896 B.Add(gp_Pnt(O +R*Xd +R*Yd+ R*Zd));
897 B.Add(gp_Pnt(O +R*Xd -R*Yd- R*Zd));
898 B.Add(gp_Pnt(O -R*Xd -R*Yd- R*Zd));
899 B.Add(gp_Pnt(O +R*Xd +R*Yd- R*Zd));
900 B.Add(gp_Pnt(O -R*Xd +R*Yd- R*Zd));
904 void BndLib::Add(const gp_Torus& S,const Standard_Real UMin,
905 const Standard_Real UMax,const Standard_Real VMin,
906 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
908 Standard_Integer Fi1;
909 Standard_Integer Fi2;
911 Fi1 = (Standard_Integer )( VMax/(M_PI/4.));
912 Fi2 = (Standard_Integer )( VMin/(M_PI/4.));
915 Fi1 = (Standard_Integer )( VMin/(M_PI/4.));
916 Fi2 = (Standard_Integer )( VMax/(M_PI/4.));
920 Standard_Real Ra = S.MajorRadius();
921 Standard_Real Ri = S.MinorRadius();
926 #define addP0 (Compute(UMin,UMax,Ra+Ri,Ra+Ri,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),S.Location(),B))
927 #define addP1 (Compute(UMin,UMax,Ra+Ri*SC,Ra+Ri*SC,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),gp_Pnt(S.Location().XYZ()+(Ri*SC)*S.Axis().Direction().XYZ()),B))
928 #define addP2 (Compute(UMin,UMax,Ra,Ra,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),gp_Pnt(S.Location().XYZ()+Ri*S.Axis().Direction().XYZ()),B))
929 #define addP3 (Compute(UMin,UMax,Ra-Ri*SC,Ra-Ri*SC,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),gp_Pnt(S.Location().XYZ()+(Ri*SC)*S.Axis().Direction().XYZ()),B))
930 #define addP4 (Compute(UMin,UMax,Ra-Ri,Ra-Ri,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),S.Location(),B))
931 #define addP5 (Compute(UMin,UMax,Ra-Ri*SC,Ra-Ri*SC,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),gp_Pnt(S.Location().XYZ()-(Ri*SC)*S.Axis().Direction().XYZ()),B))
932 #define addP6 (Compute(UMin,UMax,Ra,Ra,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),gp_Pnt(S.Location().XYZ()-Ri*S.Axis().Direction().XYZ()),B))
933 #define addP7 (Compute(UMin,UMax,Ra+Ri*SC,Ra+Ri*SC,gp_Pnt(S.XAxis().Direction().XYZ()),gp_Pnt(S.YAxis().Direction().XYZ()),gp_Pnt(S.Location().XYZ()-(Ri*SC)*S.Axis().Direction().XYZ()),B))
1004 void BndLib::Add( const gp_Torus& S,const Standard_Real Tol, Bnd_Box& B) {
1006 Standard_Real RMa = S.MajorRadius();
1007 Standard_Real Rmi = S.MinorRadius();
1008 gp_XYZ O = S.Location().XYZ();
1009 gp_XYZ Xd = S.XAxis().Direction().XYZ();
1010 gp_XYZ Yd = S.YAxis().Direction().XYZ();
1011 gp_XYZ Zd = S.Axis().Direction().XYZ();
1012 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd -(RMa+Rmi)*Yd+ Rmi*Zd));
1013 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd -(RMa+Rmi)*Yd- Rmi*Zd));
1014 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd -(RMa+Rmi)*Yd+ Rmi*Zd));
1015 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd -(RMa+Rmi)*Yd- Rmi*Zd));
1016 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd +(RMa+Rmi)*Yd+ Rmi*Zd));
1017 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd +(RMa+Rmi)*Yd- Rmi*Zd));
1018 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd +(RMa+Rmi)*Yd+ Rmi*Zd));
1019 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd +(RMa+Rmi)*Yd- Rmi*Zd));
1022 //=======================================================================
1023 //function : ComputeBox
1025 //=======================================================================
1026 Standard_Integer ComputeBox(const gp_Hypr& aHypr,
1027 const Standard_Real aT1,
1028 const Standard_Real aT2,
1031 Standard_Integer i, iErr;
1032 Standard_Real aRmaj, aRmin, aA, aB, aABP, aBAM, aT3, aCf, aEps;
1033 gp_Pnt aP1, aP2, aP3, aP0;
1036 aP1=ElCLib::Value(aT1, aHypr);
1037 aP2=ElCLib::Value(aT2, aHypr);
1043 aP0=ElCLib::Value(0., aHypr);
1050 const gp_Ax2& aPos=aHypr.Position();
1051 const gp_XYZ& aXDir = aPos.XDirection().XYZ();
1052 const gp_XYZ& aYDir = aPos.YDirection().XYZ();
1053 aRmaj=aHypr.MajorRadius();
1054 aRmin=aHypr.MinorRadius();
1057 for (i=1; i<=3; ++i) {
1058 aA=aRmin*aYDir.Coord(i);
1059 aB=aRmaj*aXDir.Coord(i);
1067 if (aABP<aEps || aBAM<aEps) {
1074 if (aT3<aT1 || aT3>aT2) {
1085 aP3=ElCLib::Value(aT3, aHypr);