1 // Created on: 1991-03-08
2 // Created by: Christophe MARION
3 // Copyright (c) 1991-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
9 // under the terms of the GNU Lesser General Public 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 <Bnd_Box.ixx>
26 #define WholeMask 0x7e
28 // Standard_True if the flag is one
29 #define VoidFlag() ( Flags & VoidMask )
30 #define XminFlag() ( Flags & XminMask )
31 #define XmaxFlag() ( Flags & XmaxMask )
32 #define YminFlag() ( Flags & YminMask )
33 #define YmaxFlag() ( Flags & YmaxMask )
34 #define ZminFlag() ( Flags & ZminMask )
35 #define ZmaxFlag() ( Flags & ZmaxMask )
36 #define WholeFlag() ( (Flags & WholeMask) == WholeMask )
38 // set the flag to one
39 #define SetVoidFlag() ( Flags = VoidMask )
40 #define SetXminFlag() ( Flags |= XminMask )
41 #define SetXmaxFlag() ( Flags |= XmaxMask )
42 #define SetYminFlag() ( Flags |= YminMask )
43 #define SetYmaxFlag() ( Flags |= YmaxMask )
44 #define SetZminFlag() ( Flags |= ZminMask )
45 #define SetZmaxFlag() ( Flags |= ZmaxMask )
46 #define SetWholeFlag() ( Flags = WholeMask )
48 #define ClearVoidFlag() ( Flags &= ~VoidMask )
50 #include <Standard_Stream.hxx>
52 // #include <Precision.hxx>
53 #define Bnd_Precision_Infinite 1e+100
55 //=======================================================================
58 //=======================================================================
61 : Xmin(0.), Xmax(0.), Ymin(0.), Ymax(0.), Zmin(0.), Zmax(0.), Gap(0.)
66 //=======================================================================
69 //=======================================================================
71 void Bnd_Box::SetWhole ()
76 //=======================================================================
79 //=======================================================================
81 void Bnd_Box::SetVoid ()
87 //=======================================================================
90 //=======================================================================
92 void Bnd_Box::Set(const gp_Pnt& P)
98 //=======================================================================
101 //=======================================================================
103 void Bnd_Box::Set(const gp_Pnt& P, const gp_Dir& D)
110 //=======================================================================
113 //=======================================================================
115 void Bnd_Box::Update (const Standard_Real x,
116 const Standard_Real y,
117 const Standard_Real z,
118 const Standard_Real X,
119 const Standard_Real Y,
120 const Standard_Real Z)
132 if (!XminFlag() && (x < Xmin)) Xmin = x;
133 if (!XmaxFlag() && (X > Xmax)) Xmax = X;
134 if (!YminFlag() && (y < Ymin)) Ymin = y;
135 if (!YmaxFlag() && (Y > Ymax)) Ymax = Y;
136 if (!ZminFlag() && (z < Zmin)) Zmin = z;
137 if (!ZmaxFlag() && (Z > Zmax)) Zmax = Z;
141 //=======================================================================
144 //=======================================================================
146 void Bnd_Box::Update (const Standard_Real X,
147 const Standard_Real Y,
148 const Standard_Real Z)
160 if (!XminFlag() && (X < Xmin)) Xmin = X;
161 else if (!XmaxFlag() && (X > Xmax)) Xmax = X;
162 if (!YminFlag() && (Y < Ymin)) Ymin = Y;
163 else if (!YmaxFlag() && (Y > Ymax)) Ymax = Y;
164 if (!ZminFlag() && (Z < Zmin)) Zmin = Z;
165 else if (!ZmaxFlag() && (Z > Zmax)) Zmax = Z;
169 //=======================================================================
172 //=======================================================================
174 Standard_Real Bnd_Box::GetGap () const
179 //=======================================================================
182 //=======================================================================
184 void Bnd_Box::SetGap (const Standard_Real Tol)
189 //=======================================================================
192 //=======================================================================
194 void Bnd_Box::Enlarge (const Standard_Real Tol)
196 Gap=Max(Gap, Abs(Tol));
199 //=======================================================================
202 //=======================================================================
204 void Bnd_Box::Get (Standard_Real& x,
209 Standard_Real& Z) const
212 Standard_ConstructionError::Raise("Bnd_Box is void");
213 if (XminFlag()) x = -Bnd_Precision_Infinite;
215 if (XmaxFlag()) X = Bnd_Precision_Infinite;
217 if (YminFlag()) y = -Bnd_Precision_Infinite;
219 if (YmaxFlag()) Y = Bnd_Precision_Infinite;
221 if (ZminFlag()) z = -Bnd_Precision_Infinite;
223 if (ZmaxFlag()) Z = Bnd_Precision_Infinite;
227 //=======================================================================
228 //function : OpenXmin
230 //=======================================================================
232 void Bnd_Box::OpenXmin ()
237 //=======================================================================
238 //function : OpenXmax
240 //=======================================================================
242 void Bnd_Box::OpenXmax ()
247 //=======================================================================
248 //function : OpenYmin
250 //=======================================================================
252 void Bnd_Box::OpenYmin ()
257 //=======================================================================
258 //function : OpenYmax
260 //=======================================================================
262 void Bnd_Box::OpenYmax ()
267 //=======================================================================
268 //function : OpenZmin
270 //=======================================================================
272 void Bnd_Box::OpenZmin ()
277 //=======================================================================
278 //function : OpenZmax
280 //=======================================================================
282 void Bnd_Box::OpenZmax ()
287 //=======================================================================
288 //function : IsOpenXmin
290 //=======================================================================
292 Standard_Boolean Bnd_Box::IsOpenXmin () const
297 //=======================================================================
298 //function : IsOpenXmax
300 //=======================================================================
302 Standard_Boolean Bnd_Box::IsOpenXmax () const
307 //=======================================================================
308 //function : IsOpenYmin
310 //=======================================================================
312 Standard_Boolean Bnd_Box::IsOpenYmin () const
317 //=======================================================================
318 //function : IsOpenYmax
320 //=======================================================================
322 Standard_Boolean Bnd_Box::IsOpenYmax () const
327 //=======================================================================
328 //function : IsOpenZmin
330 //=======================================================================
332 Standard_Boolean Bnd_Box::IsOpenZmin () const
337 //=======================================================================
338 //function : IsOpenZmax
340 //=======================================================================
342 Standard_Boolean Bnd_Box::IsOpenZmax () const
347 //=======================================================================
350 //=======================================================================
352 Standard_Boolean Bnd_Box::IsWhole () const
357 //=======================================================================
360 //=======================================================================
362 Standard_Boolean Bnd_Box::IsVoid () const
367 //=======================================================================
370 //=======================================================================
372 Standard_Boolean Bnd_Box::IsXThin (const Standard_Real tol) const
374 if (IsWhole()) return Standard_False;
375 if (IsVoid()) return Standard_True;
376 if (XminFlag()) return Standard_False;
377 if (XmaxFlag()) return Standard_False;
378 if (Xmax-Xmin < tol) return Standard_True;
379 return Standard_False;
382 //=======================================================================
385 //=======================================================================
387 Standard_Boolean Bnd_Box::IsYThin (const Standard_Real tol) const
389 if (IsWhole()) return Standard_False;
390 if (IsVoid()) return Standard_True;
391 if (YminFlag()) return Standard_False;
392 if (YmaxFlag()) return Standard_False;
393 if (Ymax-Ymin < tol) return Standard_True;
394 return Standard_False;
397 //=======================================================================
400 //=======================================================================
402 Standard_Boolean Bnd_Box::IsZThin (const Standard_Real tol) const
404 if (IsWhole()) return Standard_False;
405 if (IsVoid()) return Standard_True;
406 if (ZminFlag()) return Standard_False;
407 if (ZmaxFlag()) return Standard_False;
408 if (Zmax-Zmin < tol) return Standard_True;
409 return Standard_False;
412 //=======================================================================
415 //=======================================================================
417 Standard_Boolean Bnd_Box::IsThin (const Standard_Real tol) const
419 if (!IsXThin(tol)) return Standard_False;
420 if (!IsYThin(tol)) return Standard_False;
421 if (!IsZThin(tol)) return Standard_False;
422 return Standard_True;
425 //=======================================================================
426 //function : Transformed
428 //=======================================================================
430 Bnd_Box Bnd_Box::Transformed (const gp_Trsf& T) const
432 gp_TrsfForm F = T.Form();
434 if ( IsVoid() ) return newb;
436 if (F == gp_Identity) {}
437 else if (F == gp_Translation) {
438 Standard_Real DX,DY,DZ;
439 (T.TranslationPart()).Coord(DX,DY,DZ);
440 if (!XminFlag()) newb.Xmin += DX;
441 if (!XmaxFlag()) newb.Xmax += DX;
442 if (!YminFlag()) newb.Ymin += DY;
443 if (!YmaxFlag()) newb.Ymax += DY;
444 if (!ZminFlag()) newb.Zmin += DZ;
445 if (!ZmaxFlag()) newb.Zmax += DZ;
449 Standard_Boolean Vertex[8];
451 for (i=0;i<8;i++) Vertex[i] = Standard_True;
453 // Standard_Integer vertices = 0;
454 Standard_Integer directions = 0;
458 D[directions-1].SetCoord(-1., 0., 0.);
459 Vertex[0] = Vertex[2] = Vertex[4] = Vertex[6] = Standard_False;
463 D[directions-1].SetCoord( 1., 0., 0.);
464 Vertex[1] = Vertex[3] = Vertex[5] = Vertex[7] = Standard_False;
468 D[directions-1].SetCoord( 0.,-1., 0.);
469 Vertex[0] = Vertex[1] = Vertex[4] = Vertex[5] = Standard_False;
473 D[directions-1].SetCoord( 0., 1., 0.);
474 Vertex[2] = Vertex[3] = Vertex[6] = Vertex[7] = Standard_False;
478 D[directions-1].SetCoord( 0., 0.,-1.);
479 Vertex[0] = Vertex[1] = Vertex[2] = Vertex[3] = Standard_False;
483 D[directions-1].SetCoord( 0., 0., 1.);
484 Vertex[4] = Vertex[5] = Vertex[6] = Vertex[7] = Standard_False;
488 for (i=0;i<directions;i++) {
492 P[0].SetCoord(Xmin,Ymin,Zmin);
493 P[1].SetCoord(Xmax,Ymin,Zmin);
494 P[2].SetCoord(Xmin,Ymax,Zmin);
495 P[3].SetCoord(Xmax,Ymax,Zmin);
496 P[4].SetCoord(Xmin,Ymin,Zmax);
497 P[5].SetCoord(Xmax,Ymin,Zmax);
498 P[6].SetCoord(Xmin,Ymax,Zmax);
499 P[7].SetCoord(Xmax,Ymax,Zmax);
511 //=======================================================================
514 //=======================================================================
516 void Bnd_Box::Add (const Bnd_Box& Other)
518 if (IsWhole()) return;
519 else if (Other.IsVoid()) return;
520 else if (Other.IsWhole()) SetWhole();
521 else if (IsVoid()) (*this) = Other;
524 if ( ! IsOpenXmin() )
526 if (Other.IsOpenXmin()) OpenXmin();
527 else if (Xmin > Other.Xmin) Xmin = Other.Xmin;
529 if ( ! IsOpenXmax() )
531 if (Other.IsOpenXmax()) OpenXmax();
532 else if (Xmax < Other.Xmax) Xmax = Other.Xmax;
534 if ( ! IsOpenYmin() )
536 if (Other.IsOpenYmin()) OpenYmin();
537 else if (Ymin > Other.Ymin) Ymin = Other.Ymin;
539 if ( ! IsOpenYmax() )
541 if (Other.IsOpenYmax()) OpenYmax();
542 else if (Ymax < Other.Ymax) Ymax = Other.Ymax;
544 if ( ! IsOpenZmin() )
546 if (Other.IsOpenZmin()) OpenZmin();
547 else if (Zmin > Other.Zmin) Zmin = Other.Zmin;
549 if ( ! IsOpenZmax() )
551 if (Other.IsOpenZmax()) OpenZmax();
552 else if (Zmax < Other.Zmax) Zmax = Other.Zmax;
554 Gap = Max (Gap, Other.Gap);
558 //=======================================================================
561 //=======================================================================
563 void Bnd_Box::Add (const gp_Pnt& P)
570 //=======================================================================
573 //=======================================================================
575 void Bnd_Box::Add (const gp_Pnt& P, const gp_Dir& D)
582 //=======================================================================
585 //=======================================================================
587 void Bnd_Box::Add (const gp_Dir& D)
589 Standard_Real DX,DY,DZ;
592 if (DX < -RealEpsilon())
594 else if (DX > RealEpsilon())
597 if (DY < -RealEpsilon())
599 else if (DY > RealEpsilon())
602 if (DZ < -RealEpsilon())
604 else if (DZ > RealEpsilon())
608 //=======================================================================
611 //=======================================================================
613 Standard_Boolean Bnd_Box::IsOut (const gp_Pnt& P) const
615 if (IsWhole()) return Standard_False;
616 else if (IsVoid()) return Standard_True;
620 if (!XminFlag() && (X < (Xmin-Gap))) return Standard_True;
621 else if (!XmaxFlag() && (X > (Xmax+Gap))) return Standard_True;
622 else if (!YminFlag() && (Y < (Ymin-Gap))) return Standard_True;
623 else if (!YmaxFlag() && (Y > (Ymax+Gap))) return Standard_True;
624 else if (!ZminFlag() && (Z < (Zmin-Gap))) return Standard_True;
625 else if (!ZmaxFlag() && (Z > (Zmax+Gap))) return Standard_True;
626 else return Standard_False;
631 //=======================================================================
634 //=======================================================================
636 Standard_Boolean Bnd_Box::IsOut (const gp_Pln& P) const
638 if (IsWhole()) return Standard_False;
639 else if (IsVoid()) return Standard_True;
641 Standard_Real A,B,C,D;
642 P.Coefficients (A, B ,C ,D);
643 Standard_Real d = A * (Xmin-Gap) + B * (Ymin-Gap) + C * (Zmin-Gap) + D;
644 // Standard_Boolean plus = d > 0;
645 Standard_Integer plus = d > 0;
646 if (plus != ((A*(Xmin-Gap) + B*(Ymin-Gap) + C*(Zmax+Gap) + D) > 0))
647 return Standard_False;
648 if (plus != ((A*(Xmin-Gap) + B*(Ymax+Gap) + C*(Zmin-Gap) + D) > 0))
649 return Standard_False;
650 if (plus != ((A*(Xmin-Gap) + B*(Ymax+Gap) + C*(Zmax+Gap) + D) > 0))
651 return Standard_False;
652 if (plus != ((A*(Xmax+Gap) + B*(Ymin-Gap) + C*(Zmin-Gap) + D) > 0))
653 return Standard_False;
654 if (plus != ((A*(Xmax+Gap) + B*(Ymin-Gap) + C*(Zmax+Gap) + D) > 0))
655 return Standard_False;
656 if (plus != ((A*(Xmax+Gap) + B*(Ymax+Gap) + C*(Zmin-Gap) + D) > 0))
657 return Standard_False;
658 if (plus != ((A*(Xmax+Gap) + B*(Ymax+Gap) + C*(Zmax+Gap) + D) > 0))
659 return Standard_False;
660 else return Standard_True;
664 //=======================================================================
667 //=======================================================================
669 Standard_Boolean Bnd_Box::IsOut (const gp_Lin& L) const
671 if (IsWhole()) return Standard_False;
672 else if (IsVoid()) return Standard_True;
674 Standard_Real xmin = 0, xmax = 0, ymin = 0, ymax = 0, zmin, zmax;
675 Standard_Real parmin, parmax, par1, par2;
676 Standard_Boolean xToSet, yToSet;
677 Standard_Real myXmin, myYmin, myZmin, myXmax, myYmax, myZmax;
678 Get (myXmin, myYmin, myZmin, myXmax, myYmax, myZmax);
680 if (Abs(L.Direction().XYZ().X())>0.) {
681 par1=(myXmin-L.Location().XYZ().X())/L.Direction().XYZ().X();
682 par2=(myXmax-L.Location().XYZ().X())/L.Direction().XYZ().X();
683 parmin=Min(par1, par2);
684 parmax=Max(par1, par2);
685 xToSet=Standard_True;
688 if (L.Location().XYZ().X()<myXmin || myXmax<L.Location().XYZ().X()) {
689 return Standard_True;
691 xmin=L.Location().XYZ().X();
692 xmax=L.Location().XYZ().X();
693 parmin=-Bnd_Precision_Infinite;
694 parmax=Bnd_Precision_Infinite;
695 xToSet=Standard_False;
698 if (Abs(L.Direction().XYZ().Y())>0.) {
699 par1=(myYmin-L.Location().XYZ().Y())/L.Direction().XYZ().Y();
700 par2=(myYmax-L.Location().XYZ().Y())/L.Direction().XYZ().Y();
701 //=================DET change 06/03/01====================
702 if(parmax < Min(par1,par2) || parmin > Max(par1,par2))
703 return Standard_True;
704 //========================================================
705 parmin=Max(parmin, Min(par1,par2));
706 parmax=Min(parmax, Max(par1,par2));
707 yToSet=Standard_True;
710 if (L.Location().XYZ().Y()<myYmin || myYmax<L.Location().XYZ().Y()) {
711 return Standard_True;
713 ymin=L.Location().XYZ().Y();
714 ymax=L.Location().XYZ().Y();
715 yToSet=Standard_False;
718 if (Abs(L.Direction().XYZ().Z())>0.) {
719 par1=(myZmin-L.Location().XYZ().Z())/L.Direction().XYZ().Z();
720 par2=(myZmax-L.Location().XYZ().Z())/L.Direction().XYZ().Z();
721 //=================DET change 06/03/01====================
722 if(parmax < Min(par1,par2) || parmin > Max(par1,par2))
723 return Standard_True;
724 //========================================================
725 parmin=Max(parmin, Min(par1,par2));
726 parmax=Min(parmax, Max(par1,par2));
727 par1=L.Location().XYZ().Z()+parmin*L.Direction().XYZ().Z();
728 par2=L.Location().XYZ().Z()+parmax*L.Direction().XYZ().Z();
729 zmin=Min(par1, par2);
730 zmax=Max(par1, par2);
733 if (L.Location().XYZ().Z()<myZmin || myZmax<L.Location().XYZ().Z())
734 return Standard_True;
735 zmin=L.Location().XYZ().Z();
736 zmax=L.Location().XYZ().Z();
738 if (zmax<myZmin || myZmax<zmin) return Standard_True;
741 par1=L.Location().XYZ().X()+parmin*L.Direction().XYZ().X();
742 par2=L.Location().XYZ().X()+parmax*L.Direction().XYZ().X();
743 xmin=Min(par1, par2);
744 xmax=Max(par1, par2);
746 if (xmax<myXmin || myXmax<xmin) return Standard_True;
749 par1=L.Location().XYZ().Y()+parmin*L.Direction().XYZ().Y();
750 par2=L.Location().XYZ().Y()+parmax*L.Direction().XYZ().Y();
751 ymin=Min(par1, par2);
752 ymax=Max(par1, par2);
754 if (ymax<myYmin || myYmax<ymin) return Standard_True;
756 return Standard_False;
759 //=======================================================================
762 //=======================================================================
764 Standard_Boolean Bnd_Box::IsOut (const Bnd_Box& Other) const
766 //modified by NIZNHY-PKV Fri Jul 08 11:03:43 2011f
767 if (!Flags && !Other.Flags) {
768 Standard_Boolean bRet;
771 delta = Other.Gap + Gap;
772 bRet=((Xmin - Other.Xmax > delta) ||
773 (Other.Xmin - Xmax > delta) ||
774 (Ymin - Other.Ymax > delta) ||
775 (Other.Ymin - Ymax > delta) ||
776 (Zmin - Other.Zmax > delta) ||
777 (Other.Zmin - Zmax > delta));
780 //modified by NIZNHY-PKV Fri Jul 08 11:03:46 2011t
781 if (IsVoid()) return Standard_True;
782 if (Other.IsVoid()) return Standard_True;
783 if (IsWhole()) return Standard_False;
784 if (Other.IsWhole()) return Standard_False;
786 Standard_Real delta = Other.Gap + Gap;
788 if (!XminFlag() && !Other.IsOpenXmax())
789 if (Xmin - Other.Xmax > delta) return Standard_True;
790 if (!XmaxFlag() && !Other.IsOpenXmin())
791 if (Other.Xmin - Xmax > delta) return Standard_True;
793 if (!YminFlag() && !Other.IsOpenYmax())
794 if (Ymin - Other.Ymax > delta) return Standard_True;
795 if (!YmaxFlag() && !Other.IsOpenYmin())
796 if (Other.Ymin - Ymax > delta) return Standard_True;
798 if (!ZminFlag() && !Other.IsOpenZmax())
799 if (Zmin - Other.Zmax > delta) return Standard_True;
800 if (!ZmaxFlag() && !Other.IsOpenZmin())
801 if (Other.Zmin - Zmax > delta) return Standard_True;
803 return Standard_False;
806 //=======================================================================
809 //=======================================================================
811 Standard_Boolean Bnd_Box::IsOut (const Bnd_Box& Other,
812 const gp_Trsf& T) const
814 return IsOut(Other.Transformed(T));
817 //=======================================================================
820 //=======================================================================
822 Standard_Boolean Bnd_Box::IsOut (const gp_Trsf& T1,
823 const Bnd_Box& Other,
824 const gp_Trsf& T2) const
826 return Transformed(T1).IsOut(Other.Transformed(T2));
830 //=======================================================================
831 //function : IsSegmentOut
833 //=======================================================================
835 static Standard_Boolean IsSegmentOut(Standard_Real x1,Standard_Real y1,
836 Standard_Real x2,Standard_Real y2,
837 Standard_Real xs1,Standard_Real ys1,
838 Standard_Real xs2,Standard_Real ys2)
840 Standard_Real eps = RealSmall();
841 Standard_Real xsmin = Min (xs1, xs2);
842 Standard_Real xsmax = Max (xs1, xs2);
843 Standard_Real ysmin = Min (ys1, ys2);
844 Standard_Real ysmax = Max (ys1, ys2);
846 if (ysmax-ysmin < eps && (y1-ys1 < eps && ys1-y2 < eps) &&
847 ((xsmin-x1 < eps && x1-xsmax < eps) ||
848 (xsmin-x2 < eps && x2-xsmax < eps) ||
849 (x1-xs1 < eps && xs1-x2 < eps)))
850 return Standard_False;
851 if (xsmax-xsmin < eps && (x1-xs1 < eps && xs1-x2 < eps) &&
852 ((ysmin-y1 < eps && y1-ysmax < eps) ||
853 (ysmin-y2 < eps && y2-ysmax < eps) ||
854 (y1-ys1 < eps && ys1-y2 < eps)))
855 return Standard_False;
857 if ((xs1 < x1 && xs2 < x1) || (xs1 > x2 && xs2 > x2) ||
858 (ys1 < y1 && ys2 < y1) || (ys1 > y2 && ys2 > y2) )
859 return Standard_True;
861 if (Abs(xs2-xs1) > eps)
863 Standard_Real ya = ( Min(x1, x2) - xs1 ) * ( ys2 - ys1 ) / ( xs2 - xs1 ) + ys1;
864 Standard_Real yb = ( Max(x1, x2) - xs1 ) * ( ys2 - ys1 ) / ( xs2 - xs1 ) + ys1;
865 if ( (ya < y1 && yb < y1) || (ya > y2 && yb > y2) ) return Standard_True;
867 else if (Abs(ys2-ys1) > eps)
869 Standard_Real xa = ( Min(y1, y2) - ys1 ) * ( xs2 - xs1 ) / ( ys2 - ys1 ) + xs1;
870 Standard_Real xb = ( Max(y1, y2) - ys1 ) * ( xs2 - xs1 ) / ( ys2 - ys1 ) + xs1;
871 if ( (xa < x1 && xb < x1) || (xa > x2 && xb > x2) ) return Standard_True;
874 return Standard_True;
876 return Standard_False;
879 Standard_Boolean Bnd_Box::IsOut(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Dir& D) const
882 if (IsWhole()) return Standard_False;
883 else if (IsVoid()) return Standard_True;
885 Standard_Real eps = RealSmall();
886 Standard_Real myXmin, myYmin, myZmin, myXmax, myYmax, myZmax;
887 Get (myXmin, myYmin, myZmin, myXmax, myYmax, myZmax);
889 if(Abs(D.X()) < eps && Abs(D.Y()) < eps)
890 return IsSegmentOut(myXmin, myYmin, myXmax, myYmax, P1.X(), P1.Y(), P2.X(), P2.Y());
892 if(Abs(D.X()) < eps && Abs(D.Z()) < eps)
893 return IsSegmentOut(myXmin, myZmin, myXmax, myZmax, P1.X(), P1.Z(), P2.X(), P2.Z());
895 if(Abs(D.Y()) < eps && Abs(D.Z()) < eps)
896 return IsSegmentOut(myYmin, myZmin, myYmax, myZmax, P1.Y(), P1.Z(), P2.Y(), P2.Z());
900 if(!IsSegmentOut(myXmin, myZmin, myXmax, myZmax,
901 P1.X(),(myYmin-P1.Y())*D.Z()/D.Y()+P1.Z(),
902 P2.X(),(myYmin-P2.Y())*D.Z()/D.Y()+P2.Z()))
903 return Standard_False;
905 if(!IsSegmentOut(myXmin, myZmin, myXmax, myZmax,
906 P1.X(),(myYmax-P1.Y())*D.Z()/D.Y()+P1.Z(),
907 P2.X(),(myYmax-P2.Y())*D.Z()/D.Y()+P2.Z()))
908 return Standard_False;
910 if(!IsSegmentOut(myXmin, myYmin, myXmax, myYmax,
911 P1.X(),(myZmin-P1.Z())*D.Y()/D.Z()+P1.Y(),
912 P2.X(),(myZmin-P2.Z())*D.Y()/D.Z()+P2.Y()))
913 return Standard_False;
915 if(!IsSegmentOut(myXmin, myYmin, myXmax, myYmax,
916 P1.X(),(myZmax-P1.Z())*D.Y()/D.Z()+P1.Y(),
917 P2.X(),(myZmax-P2.Z())*D.Y()/D.Z()+P2.Y()))
918 return Standard_False;
920 return Standard_True;
925 if(!IsSegmentOut(myYmin, myZmin, myYmax, myZmax,
926 P1.Y(),(myXmin-P1.X())*D.Z()/D.X()+P1.Z(),
927 P2.Y(),(myXmin-P2.X())*D.Z()/D.X()+P2.Z()))
928 return Standard_False;
930 if(!IsSegmentOut(myYmin, myZmin, myYmax, myZmax,
931 P1.Y(),(myXmax-P1.X())*D.Z()/D.X()+P1.Z(),
932 P2.Y(),(myXmax-P2.X())*D.Z()/D.X()+P2.Z()))
933 return Standard_False;
935 if(!IsSegmentOut(myYmin, myXmin, myYmax, myXmax,
936 P1.Y(),(myZmin-P1.Z())*D.X()/D.Z()+P1.X(),
937 P2.Y(),(myZmin-P2.Z())*D.X()/D.Z()+P2.X()))
938 return Standard_False;
940 if(!IsSegmentOut(myYmin, myXmin, myYmax, myXmax,
941 P1.Y(),(myZmax-P1.Z())*D.X()/D.Z()+P1.X(),
942 P2.Y(),(myZmax-P2.Z())*D.X()/D.Z()+P2.X()))
943 return Standard_False;
945 return Standard_True;
950 if(!IsSegmentOut(myZmin, myXmin, myZmax, myXmax,
951 P1.Z(),(myYmax-P1.Y())*D.X()/D.Y()+P1.X(),
952 P2.Z(),(myYmax-P2.Y())*D.X()/D.Y()+P2.X()))
953 return Standard_False;
955 if(!IsSegmentOut(myZmin, myXmin, myZmax, myXmax,
956 P1.Z(),(myYmin-P1.Y())*D.X()/D.Y()+P1.X(),
957 P2.Z(),(myYmin-P2.Y())*D.X()/D.Y()+P2.X()))
958 return Standard_False;
960 if(!IsSegmentOut(myZmin, myYmin, myZmax, myYmax,
961 P1.Z(),(myXmax-P1.X())*D.Y()/D.X()+P1.Y(),
962 P2.Z(),(myXmax-P2.X())*D.Y()/D.X()+P2.Y()))
963 return Standard_False;
965 if(!IsSegmentOut(myZmin, myYmin, myZmax, myYmax,
966 P1.Z(),(myXmin-P1.X())*D.Y()/D.X()+P1.Y(),
967 P2.Z(),(myXmin-P2.X())*D.Y()/D.X()+P2.Y()))
968 return Standard_False;
970 return Standard_True;
973 if(!IsSegmentOut(myXmin,myZmin,myXmax,myZmax,
974 (myYmin - P1.Y())/D.Y()*D.X() + P1.X(),
975 (myYmin - P1.Y())/D.Y()*D.Z() + P1.Z(),
976 (myYmin - P2.Y())/D.Y()*D.X() + P2.X(),
977 (myYmin - P2.Y())/D.Y()*D.Z() + P2.Z()))
978 return Standard_False;
980 if(!IsSegmentOut(myXmin,myZmin,myXmax,myZmax,
981 (myYmax - P1.Y())/D.Y()*D.X() + P1.X(),
982 (myYmax - P1.Y())/D.Y()*D.Z() + P1.Z(),
983 (myYmax - P2.Y())/D.Y()*D.X() + P2.X(),
984 (myYmax - P2.Y())/D.Y()*D.Z() + P2.Z()))
985 return Standard_False;
987 if(!IsSegmentOut(myXmin,myYmin,myXmax,myYmax,
988 (myZmin - P1.Z())/D.Z()*D.X() + P1.X(),
989 (myZmin - P1.Z())/D.Z()*D.Y() + P1.Y(),
990 (myZmin - P2.Z())/D.Z()*D.X() + P2.X(),
991 (myZmin - P2.Z())/D.Z()*D.Y() + P2.Y()))
992 return Standard_False;
994 if(!IsSegmentOut(myXmin,myYmin,myXmax,myYmax,
995 (myZmax - P1.Z())/D.Z()*D.X() + P1.X(),
996 (myZmax - P1.Z())/D.Z()*D.Y() + P1.Y(),
997 (myZmax - P2.Z())/D.Z()*D.X() + P2.X(),
998 (myZmax - P2.Z())/D.Z()*D.Y() + P2.Y()))
999 return Standard_False;
1001 if(!IsSegmentOut(myZmin,myYmin,myZmax,myYmax,
1002 (myXmin - P1.X())/D.X()*D.Z() + P1.Z(),
1003 (myXmin - P1.X())/D.X()*D.Y() + P1.Y(),
1004 (myXmin - P2.X())/D.X()*D.Z() + P2.Z(),
1005 (myXmin - P2.X())/D.X()*D.Y() + P2.Y()))
1006 return Standard_False;
1008 if(!IsSegmentOut(myZmin,myYmin,myZmax,myYmax,
1009 (myXmax - P1.X())/D.X()*D.Z() + P1.Z(),
1010 (myXmax - P1.X())/D.X()*D.Y() + P1.Y(),
1011 (myXmax - P2.X())/D.X()*D.Z() + P2.Z(),
1012 (myXmax - P2.X())/D.X()*D.Y() + P2.Y()))
1013 return Standard_False;
1015 return Standard_True;
1019 //=======================================================================
1020 //function : Distance
1021 //purpose : computes the minimum distance between two boxes
1022 //=======================================================================
1024 static Standard_Real DistMini2Box( const Standard_Real r1min, const Standard_Real r1max, const Standard_Real r2min, const Standard_Real r2max)
1025 { Standard_Real r1, r2;
1027 r1 = Square(r1min - r2max);
1028 r2 = Square(r1max - r2min);
1029 return (Min( r1, r2 ));
1034 Standard_Real Bnd_Box::Distance(const Bnd_Box& Other) const
1035 { Standard_Real xminB1, yminB1, zminB1, xmaxB1, ymaxB1, zmaxB1;
1036 Standard_Real xminB2, yminB2, zminB2, xmaxB2, ymaxB2, zmaxB2;
1037 Standard_Real dist_x, dist_y, dist_z, dist_t;
1039 Get( xminB1, yminB1, zminB1, xmaxB1, ymaxB1, zmaxB1);
1040 Other.Get( xminB2, yminB2, zminB2, xmaxB2, ymaxB2, zmaxB2);
1042 if ( ((xminB1<= xminB2)&&( xminB2 <= xmaxB1)) || ((xminB2<= xminB1)&&( xminB1 <= xmaxB2)) )
1044 else { dist_x= DistMini2Box(xminB1, xmaxB1, xminB2, xmaxB2);}
1045 if ( ((yminB1<= yminB2)&&( yminB2 <= ymaxB1)) || ((yminB2<= yminB1)&&( yminB1 <= ymaxB2)) )
1047 else { dist_y= DistMini2Box(yminB1, ymaxB1, yminB2, ymaxB2);}
1048 if ( ((zminB1<= zminB2)&&( zminB2 <= zmaxB1)) || ((zminB2<= zminB1)&&( zminB1 <= zmaxB2)) )
1050 else { dist_z= DistMini2Box(zminB1, zmaxB1, zminB2, zmaxB2);}
1051 dist_t = dist_x+ dist_y+ dist_z;
1052 return( Sqrt ( dist_t));
1055 //=======================================================================
1058 //=======================================================================
1060 void Bnd_Box::Dump () const
1063 if (IsVoid()) cout << "Void";
1064 else if (IsWhole()) cout << "Whole";
1066 cout << "\n Xmin : ";
1067 if (IsOpenXmin()) cout << "Infinite";
1069 cout << "\n Xmax : ";
1070 if (IsOpenXmax()) cout << "Infinite";
1072 cout << "\n Ymin : ";
1073 if (IsOpenYmin()) cout << "Infinite";
1075 cout << "\n Ymax : ";
1076 if (IsOpenYmax()) cout << "Infinite";
1078 cout << "\n Zmin : ";
1079 if (IsOpenZmin()) cout << "Infinite";
1081 cout << "\n Zmax : ";
1082 if (IsOpenZmax()) cout << "Infinite";
1085 cout << "\n Gap : " << Gap;