1 // Created on: 1991-03-08
2 // Created by: Christophe MARION
3 // Copyright (c) 1991-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
21 #include <Bnd_Box.ixx>
30 #define WholeMask 0x7e
32 // Standard_True if the flag is one
33 #define VoidFlag() ( Flags & VoidMask )
34 #define XminFlag() ( Flags & XminMask )
35 #define XmaxFlag() ( Flags & XmaxMask )
36 #define YminFlag() ( Flags & YminMask )
37 #define YmaxFlag() ( Flags & YmaxMask )
38 #define ZminFlag() ( Flags & ZminMask )
39 #define ZmaxFlag() ( Flags & ZmaxMask )
40 #define WholeFlag() ( (Flags & WholeMask) == WholeMask )
42 // set the flag to one
43 #define SetVoidFlag() ( Flags = VoidMask )
44 #define SetXminFlag() ( Flags |= XminMask )
45 #define SetXmaxFlag() ( Flags |= XmaxMask )
46 #define SetYminFlag() ( Flags |= YminMask )
47 #define SetYmaxFlag() ( Flags |= YmaxMask )
48 #define SetZminFlag() ( Flags |= ZminMask )
49 #define SetZmaxFlag() ( Flags |= ZmaxMask )
50 #define SetWholeFlag() ( Flags = WholeMask )
52 #define ClearVoidFlag() ( Flags &= ~VoidMask )
54 #include <Standard_Stream.hxx>
56 // #include <Precision.hxx>
57 #define Bnd_Precision_Infinite 1e+100
59 //=======================================================================
62 //=======================================================================
65 : Xmin(0.), Xmax(0.), Ymin(0.), Ymax(0.), Zmin(0.), Zmax(0.), Gap(0.)
70 //=======================================================================
73 //=======================================================================
75 void Bnd_Box::SetWhole ()
80 //=======================================================================
83 //=======================================================================
85 void Bnd_Box::SetVoid ()
91 //=======================================================================
94 //=======================================================================
96 void Bnd_Box::Set(const gp_Pnt& P)
102 //=======================================================================
105 //=======================================================================
107 void Bnd_Box::Set(const gp_Pnt& P, const gp_Dir& D)
114 //=======================================================================
117 //=======================================================================
119 void Bnd_Box::Update (const Standard_Real x,
120 const Standard_Real y,
121 const Standard_Real z,
122 const Standard_Real X,
123 const Standard_Real Y,
124 const Standard_Real Z)
136 if (!XminFlag() && (x < Xmin)) Xmin = x;
137 if (!XmaxFlag() && (X > Xmax)) Xmax = X;
138 if (!YminFlag() && (y < Ymin)) Ymin = y;
139 if (!YmaxFlag() && (Y > Ymax)) Ymax = Y;
140 if (!ZminFlag() && (z < Zmin)) Zmin = z;
141 if (!ZmaxFlag() && (Z > Zmax)) Zmax = Z;
145 //=======================================================================
148 //=======================================================================
150 void Bnd_Box::Update (const Standard_Real X,
151 const Standard_Real Y,
152 const Standard_Real Z)
164 if (!XminFlag() && (X < Xmin)) Xmin = X;
165 else if (!XmaxFlag() && (X > Xmax)) Xmax = X;
166 if (!YminFlag() && (Y < Ymin)) Ymin = Y;
167 else if (!YmaxFlag() && (Y > Ymax)) Ymax = Y;
168 if (!ZminFlag() && (Z < Zmin)) Zmin = Z;
169 else if (!ZmaxFlag() && (Z > Zmax)) Zmax = Z;
173 //=======================================================================
176 //=======================================================================
178 Standard_Real Bnd_Box::GetGap () const
183 //=======================================================================
186 //=======================================================================
188 void Bnd_Box::SetGap (const Standard_Real Tol)
193 //=======================================================================
196 //=======================================================================
198 void Bnd_Box::Enlarge (const Standard_Real Tol)
200 Gap=Max(Gap, Abs(Tol));
203 //=======================================================================
206 //=======================================================================
208 void Bnd_Box::Get (Standard_Real& x,
213 Standard_Real& Z) const
216 Standard_ConstructionError::Raise("Bnd_Box is void");
217 if (XminFlag()) x = -Bnd_Precision_Infinite;
219 if (XmaxFlag()) X = Bnd_Precision_Infinite;
221 if (YminFlag()) y = -Bnd_Precision_Infinite;
223 if (YmaxFlag()) Y = Bnd_Precision_Infinite;
225 if (ZminFlag()) z = -Bnd_Precision_Infinite;
227 if (ZmaxFlag()) Z = Bnd_Precision_Infinite;
231 //=======================================================================
232 //function : OpenXmin
234 //=======================================================================
236 void Bnd_Box::OpenXmin ()
241 //=======================================================================
242 //function : OpenXmax
244 //=======================================================================
246 void Bnd_Box::OpenXmax ()
251 //=======================================================================
252 //function : OpenYmin
254 //=======================================================================
256 void Bnd_Box::OpenYmin ()
261 //=======================================================================
262 //function : OpenYmax
264 //=======================================================================
266 void Bnd_Box::OpenYmax ()
271 //=======================================================================
272 //function : OpenZmin
274 //=======================================================================
276 void Bnd_Box::OpenZmin ()
281 //=======================================================================
282 //function : OpenZmax
284 //=======================================================================
286 void Bnd_Box::OpenZmax ()
291 //=======================================================================
292 //function : IsOpenXmin
294 //=======================================================================
296 Standard_Boolean Bnd_Box::IsOpenXmin () const
301 //=======================================================================
302 //function : IsOpenXmax
304 //=======================================================================
306 Standard_Boolean Bnd_Box::IsOpenXmax () const
311 //=======================================================================
312 //function : IsOpenYmin
314 //=======================================================================
316 Standard_Boolean Bnd_Box::IsOpenYmin () const
321 //=======================================================================
322 //function : IsOpenYmax
324 //=======================================================================
326 Standard_Boolean Bnd_Box::IsOpenYmax () const
331 //=======================================================================
332 //function : IsOpenZmin
334 //=======================================================================
336 Standard_Boolean Bnd_Box::IsOpenZmin () const
341 //=======================================================================
342 //function : IsOpenZmax
344 //=======================================================================
346 Standard_Boolean Bnd_Box::IsOpenZmax () const
351 //=======================================================================
354 //=======================================================================
356 Standard_Boolean Bnd_Box::IsWhole () const
361 //=======================================================================
364 //=======================================================================
366 Standard_Boolean Bnd_Box::IsVoid () const
371 //=======================================================================
374 //=======================================================================
376 Standard_Boolean Bnd_Box::IsXThin (const Standard_Real tol) const
378 if (IsWhole()) return Standard_False;
379 if (IsVoid()) return Standard_True;
380 if (XminFlag()) return Standard_False;
381 if (XmaxFlag()) return Standard_False;
382 if (Xmax-Xmin < tol) return Standard_True;
383 return Standard_False;
386 //=======================================================================
389 //=======================================================================
391 Standard_Boolean Bnd_Box::IsYThin (const Standard_Real tol) const
393 if (IsWhole()) return Standard_False;
394 if (IsVoid()) return Standard_True;
395 if (YminFlag()) return Standard_False;
396 if (YmaxFlag()) return Standard_False;
397 if (Ymax-Ymin < tol) return Standard_True;
398 return Standard_False;
401 //=======================================================================
404 //=======================================================================
406 Standard_Boolean Bnd_Box::IsZThin (const Standard_Real tol) const
408 if (IsWhole()) return Standard_False;
409 if (IsVoid()) return Standard_True;
410 if (ZminFlag()) return Standard_False;
411 if (ZmaxFlag()) return Standard_False;
412 if (Zmax-Zmin < tol) return Standard_True;
413 return Standard_False;
416 //=======================================================================
419 //=======================================================================
421 Standard_Boolean Bnd_Box::IsThin (const Standard_Real tol) const
423 if (!IsXThin(tol)) return Standard_False;
424 if (!IsYThin(tol)) return Standard_False;
425 if (!IsZThin(tol)) return Standard_False;
426 return Standard_True;
429 //=======================================================================
430 //function : Transformed
432 //=======================================================================
434 Bnd_Box Bnd_Box::Transformed (const gp_Trsf& T) const
436 gp_TrsfForm F = T.Form();
438 if ( IsVoid() ) return newb;
440 if (F == gp_Identity) {}
441 else if (F == gp_Translation) {
442 Standard_Real DX,DY,DZ;
443 (T.TranslationPart()).Coord(DX,DY,DZ);
444 if (!XminFlag()) newb.Xmin += DX;
445 if (!XmaxFlag()) newb.Xmax += DX;
446 if (!YminFlag()) newb.Ymin += DY;
447 if (!YmaxFlag()) newb.Ymax += DY;
448 if (!ZminFlag()) newb.Zmin += DZ;
449 if (!ZmaxFlag()) newb.Zmax += DZ;
453 Standard_Boolean Vertex[8];
455 for (i=0;i<8;i++) Vertex[i] = Standard_True;
457 // Standard_Integer vertices = 0;
458 Standard_Integer directions = 0;
462 D[directions-1].SetCoord(-1., 0., 0.);
463 Vertex[0] = Vertex[2] = Vertex[4] = Vertex[6] = Standard_False;
467 D[directions-1].SetCoord( 1., 0., 0.);
468 Vertex[1] = Vertex[3] = Vertex[5] = Vertex[7] = Standard_False;
472 D[directions-1].SetCoord( 0.,-1., 0.);
473 Vertex[0] = Vertex[1] = Vertex[4] = Vertex[5] = Standard_False;
477 D[directions-1].SetCoord( 0., 1., 0.);
478 Vertex[2] = Vertex[3] = Vertex[6] = Vertex[7] = Standard_False;
482 D[directions-1].SetCoord( 0., 0.,-1.);
483 Vertex[0] = Vertex[1] = Vertex[2] = Vertex[3] = Standard_False;
487 D[directions-1].SetCoord( 0., 0., 1.);
488 Vertex[4] = Vertex[5] = Vertex[6] = Vertex[7] = Standard_False;
492 for (i=0;i<directions;i++) {
496 P[0].SetCoord(Xmin,Ymin,Zmin);
497 P[1].SetCoord(Xmax,Ymin,Zmin);
498 P[2].SetCoord(Xmin,Ymax,Zmin);
499 P[3].SetCoord(Xmax,Ymax,Zmin);
500 P[4].SetCoord(Xmin,Ymin,Zmax);
501 P[5].SetCoord(Xmax,Ymin,Zmax);
502 P[6].SetCoord(Xmin,Ymax,Zmax);
503 P[7].SetCoord(Xmax,Ymax,Zmax);
515 //=======================================================================
518 //=======================================================================
520 void Bnd_Box::Add (const Bnd_Box& Other)
522 if (IsWhole()) return;
523 else if (Other.IsVoid()) return;
524 else if (Other.IsWhole()) SetWhole();
525 else if (IsVoid()) (*this) = Other;
528 if ( ! IsOpenXmin() )
530 if (Other.IsOpenXmin()) OpenXmin();
531 else if (Xmin > Other.Xmin) Xmin = Other.Xmin;
533 if ( ! IsOpenXmax() )
535 if (Other.IsOpenXmax()) OpenXmax();
536 else if (Xmax < Other.Xmax) Xmax = Other.Xmax;
538 if ( ! IsOpenYmin() )
540 if (Other.IsOpenYmin()) OpenYmin();
541 else if (Ymin > Other.Ymin) Ymin = Other.Ymin;
543 if ( ! IsOpenYmax() )
545 if (Other.IsOpenYmax()) OpenYmax();
546 else if (Ymax < Other.Ymax) Ymax = Other.Ymax;
548 if ( ! IsOpenZmin() )
550 if (Other.IsOpenZmin()) OpenZmin();
551 else if (Zmin > Other.Zmin) Zmin = Other.Zmin;
553 if ( ! IsOpenZmax() )
555 if (Other.IsOpenZmax()) OpenZmax();
556 else if (Zmax < Other.Zmax) Zmax = Other.Zmax;
558 Gap = Max (Gap, Other.Gap);
562 //=======================================================================
565 //=======================================================================
567 void Bnd_Box::Add (const gp_Pnt& P)
574 //=======================================================================
577 //=======================================================================
579 void Bnd_Box::Add (const gp_Pnt& P, const gp_Dir& D)
586 //=======================================================================
589 //=======================================================================
591 void Bnd_Box::Add (const gp_Dir& D)
593 Standard_Real DX,DY,DZ;
596 if (DX < -RealEpsilon())
598 else if (DX > RealEpsilon())
601 if (DY < -RealEpsilon())
603 else if (DY > RealEpsilon())
606 if (DZ < -RealEpsilon())
608 else if (DZ > RealEpsilon())
612 //=======================================================================
615 //=======================================================================
617 Standard_Boolean Bnd_Box::IsOut (const gp_Pnt& P) const
619 if (IsWhole()) return Standard_False;
620 else if (IsVoid()) return Standard_True;
624 if (!XminFlag() && (X < (Xmin-Gap))) return Standard_True;
625 else if (!XmaxFlag() && (X > (Xmax+Gap))) return Standard_True;
626 else if (!YminFlag() && (Y < (Ymin-Gap))) return Standard_True;
627 else if (!YmaxFlag() && (Y > (Ymax+Gap))) return Standard_True;
628 else if (!ZminFlag() && (Z < (Zmin-Gap))) return Standard_True;
629 else if (!ZmaxFlag() && (Z > (Zmax+Gap))) return Standard_True;
630 else return Standard_False;
635 //=======================================================================
638 //=======================================================================
640 Standard_Boolean Bnd_Box::IsOut (const gp_Pln& P) const
642 if (IsWhole()) return Standard_False;
643 else if (IsVoid()) return Standard_True;
645 Standard_Real A,B,C,D;
646 P.Coefficients (A, B ,C ,D);
647 Standard_Real d = A * (Xmin-Gap) + B * (Ymin-Gap) + C * (Zmin-Gap) + D;
648 // Standard_Boolean plus = d > 0;
649 Standard_Integer plus = d > 0;
650 if (plus != ((A*(Xmin-Gap) + B*(Ymin-Gap) + C*(Zmax+Gap) + D) > 0))
651 return Standard_False;
652 if (plus != ((A*(Xmin-Gap) + B*(Ymax+Gap) + C*(Zmin-Gap) + D) > 0))
653 return Standard_False;
654 if (plus != ((A*(Xmin-Gap) + B*(Ymax+Gap) + C*(Zmax+Gap) + D) > 0))
655 return Standard_False;
656 if (plus != ((A*(Xmax+Gap) + B*(Ymin-Gap) + C*(Zmin-Gap) + D) > 0))
657 return Standard_False;
658 if (plus != ((A*(Xmax+Gap) + B*(Ymin-Gap) + C*(Zmax+Gap) + D) > 0))
659 return Standard_False;
660 if (plus != ((A*(Xmax+Gap) + B*(Ymax+Gap) + C*(Zmin-Gap) + D) > 0))
661 return Standard_False;
662 if (plus != ((A*(Xmax+Gap) + B*(Ymax+Gap) + C*(Zmax+Gap) + D) > 0))
663 return Standard_False;
664 else return Standard_True;
668 //=======================================================================
671 //=======================================================================
673 Standard_Boolean Bnd_Box::IsOut (const gp_Lin& L) const
675 if (IsWhole()) return Standard_False;
676 else if (IsVoid()) return Standard_True;
678 Standard_Real xmin = 0, xmax = 0, ymin = 0, ymax = 0, zmin, zmax;
679 Standard_Real parmin, parmax, par1, par2;
680 Standard_Boolean xToSet, yToSet;
681 Standard_Real myXmin, myYmin, myZmin, myXmax, myYmax, myZmax;
682 Get (myXmin, myYmin, myZmin, myXmax, myYmax, myZmax);
684 if (Abs(L.Direction().XYZ().X())>0.) {
685 par1=(myXmin-L.Location().XYZ().X())/L.Direction().XYZ().X();
686 par2=(myXmax-L.Location().XYZ().X())/L.Direction().XYZ().X();
687 parmin=Min(par1, par2);
688 parmax=Max(par1, par2);
689 xToSet=Standard_True;
692 if (L.Location().XYZ().X()<myXmin || myXmax<L.Location().XYZ().X()) {
693 return Standard_True;
695 xmin=L.Location().XYZ().X();
696 xmax=L.Location().XYZ().X();
697 parmin=-Bnd_Precision_Infinite;
698 parmax=Bnd_Precision_Infinite;
699 xToSet=Standard_False;
702 if (Abs(L.Direction().XYZ().Y())>0.) {
703 par1=(myYmin-L.Location().XYZ().Y())/L.Direction().XYZ().Y();
704 par2=(myYmax-L.Location().XYZ().Y())/L.Direction().XYZ().Y();
705 //=================DET change 06/03/01====================
706 if(parmax < Min(par1,par2) || parmin > Max(par1,par2))
707 return Standard_True;
708 //========================================================
709 parmin=Max(parmin, Min(par1,par2));
710 parmax=Min(parmax, Max(par1,par2));
711 yToSet=Standard_True;
714 if (L.Location().XYZ().Y()<myYmin || myYmax<L.Location().XYZ().Y()) {
715 return Standard_True;
717 ymin=L.Location().XYZ().Y();
718 ymax=L.Location().XYZ().Y();
719 yToSet=Standard_False;
722 if (Abs(L.Direction().XYZ().Z())>0.) {
723 par1=(myZmin-L.Location().XYZ().Z())/L.Direction().XYZ().Z();
724 par2=(myZmax-L.Location().XYZ().Z())/L.Direction().XYZ().Z();
725 //=================DET change 06/03/01====================
726 if(parmax < Min(par1,par2) || parmin > Max(par1,par2))
727 return Standard_True;
728 //========================================================
729 parmin=Max(parmin, Min(par1,par2));
730 parmax=Min(parmax, Max(par1,par2));
731 par1=L.Location().XYZ().Z()+parmin*L.Direction().XYZ().Z();
732 par2=L.Location().XYZ().Z()+parmax*L.Direction().XYZ().Z();
733 zmin=Min(par1, par2);
734 zmax=Max(par1, par2);
737 if (L.Location().XYZ().Z()<myZmin || myZmax<L.Location().XYZ().Z())
738 return Standard_True;
739 zmin=L.Location().XYZ().Z();
740 zmax=L.Location().XYZ().Z();
742 if (zmax<myZmin || myZmax<zmin) return Standard_True;
745 par1=L.Location().XYZ().X()+parmin*L.Direction().XYZ().X();
746 par2=L.Location().XYZ().X()+parmax*L.Direction().XYZ().X();
747 xmin=Min(par1, par2);
748 xmax=Max(par1, par2);
750 if (xmax<myXmin || myXmax<xmin) return Standard_True;
753 par1=L.Location().XYZ().Y()+parmin*L.Direction().XYZ().Y();
754 par2=L.Location().XYZ().Y()+parmax*L.Direction().XYZ().Y();
755 ymin=Min(par1, par2);
756 ymax=Max(par1, par2);
758 if (ymax<myYmin || myYmax<ymin) return Standard_True;
760 return Standard_False;
763 //=======================================================================
766 //=======================================================================
768 Standard_Boolean Bnd_Box::IsOut (const Bnd_Box& Other) const
770 //modified by NIZNHY-PKV Fri Jul 08 11:03:43 2011f
771 if (!Flags && !Other.Flags) {
772 Standard_Boolean bRet;
775 delta = Other.Gap + Gap;
776 bRet=((Xmin - Other.Xmax > delta) ||
777 (Other.Xmin - Xmax > delta) ||
778 (Ymin - Other.Ymax > delta) ||
779 (Other.Ymin - Ymax > delta) ||
780 (Zmin - Other.Zmax > delta) ||
781 (Other.Zmin - Zmax > delta));
784 //modified by NIZNHY-PKV Fri Jul 08 11:03:46 2011t
785 if (IsVoid()) return Standard_True;
786 if (Other.IsVoid()) return Standard_True;
787 if (IsWhole()) return Standard_False;
788 if (Other.IsWhole()) return Standard_False;
790 Standard_Real delta = Other.Gap + Gap;
792 if (!XminFlag() && !Other.IsOpenXmax())
793 if (Xmin - Other.Xmax > delta) return Standard_True;
794 if (!XmaxFlag() && !Other.IsOpenXmin())
795 if (Other.Xmin - Xmax > delta) return Standard_True;
797 if (!YminFlag() && !Other.IsOpenYmax())
798 if (Ymin - Other.Ymax > delta) return Standard_True;
799 if (!YmaxFlag() && !Other.IsOpenYmin())
800 if (Other.Ymin - Ymax > delta) return Standard_True;
802 if (!ZminFlag() && !Other.IsOpenZmax())
803 if (Zmin - Other.Zmax > delta) return Standard_True;
804 if (!ZmaxFlag() && !Other.IsOpenZmin())
805 if (Other.Zmin - Zmax > delta) return Standard_True;
807 return Standard_False;
810 //=======================================================================
813 //=======================================================================
815 Standard_Boolean Bnd_Box::IsOut (const Bnd_Box& Other,
816 const gp_Trsf& T) const
818 return IsOut(Other.Transformed(T));
821 //=======================================================================
824 //=======================================================================
826 Standard_Boolean Bnd_Box::IsOut (const gp_Trsf& T1,
827 const Bnd_Box& Other,
828 const gp_Trsf& T2) const
830 return Transformed(T1).IsOut(Other.Transformed(T2));
834 //=======================================================================
835 //function : IsSegmentOut
837 //=======================================================================
839 static Standard_Boolean IsSegmentOut(Standard_Real x1,Standard_Real y1,
840 Standard_Real x2,Standard_Real y2,
841 Standard_Real xs1,Standard_Real ys1,
842 Standard_Real xs2,Standard_Real ys2)
844 Standard_Real eps = RealSmall();
845 Standard_Real xsmin = Min (xs1, xs2);
846 Standard_Real xsmax = Max (xs1, xs2);
847 Standard_Real ysmin = Min (ys1, ys2);
848 Standard_Real ysmax = Max (ys1, ys2);
850 if (ysmax-ysmin < eps && (y1-ys1 < eps && ys1-y2 < eps) &&
851 ((xsmin-x1 < eps && x1-xsmax < eps) ||
852 (xsmin-x2 < eps && x2-xsmax < eps) ||
853 (x1-xs1 < eps && xs1-x2 < eps)))
854 return Standard_False;
855 if (xsmax-xsmin < eps && (x1-xs1 < eps && xs1-x2 < eps) &&
856 ((ysmin-y1 < eps && y1-ysmax < eps) ||
857 (ysmin-y2 < eps && y2-ysmax < eps) ||
858 (y1-ys1 < eps && ys1-y2 < eps)))
859 return Standard_False;
861 if ((xs1 < x1 && xs2 < x1) || (xs1 > x2 && xs2 > x2) ||
862 (ys1 < y1 && ys2 < y1) || (ys1 > y2 && ys2 > y2) )
863 return Standard_True;
865 if (Abs(xs2-xs1) > eps)
867 Standard_Real ya = ( Min(x1, x2) - xs1 ) * ( ys2 - ys1 ) / ( xs2 - xs1 ) + ys1;
868 Standard_Real yb = ( Max(x1, x2) - xs1 ) * ( ys2 - ys1 ) / ( xs2 - xs1 ) + ys1;
869 if ( (ya < y1 && yb < y1) || (ya > y2 && yb > y2) ) return Standard_True;
871 else if (Abs(ys2-ys1) > eps)
873 Standard_Real xa = ( Min(y1, y2) - ys1 ) * ( xs2 - xs1 ) / ( ys2 - ys1 ) + xs1;
874 Standard_Real xb = ( Max(y1, y2) - ys1 ) * ( xs2 - xs1 ) / ( ys2 - ys1 ) + xs1;
875 if ( (xa < x1 && xb < x1) || (xa > x2 && xb > x2) ) return Standard_True;
878 return Standard_True;
880 return Standard_False;
883 Standard_Boolean Bnd_Box::IsOut(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Dir& D) const
886 if (IsWhole()) return Standard_False;
887 else if (IsVoid()) return Standard_True;
889 Standard_Real eps = RealSmall();
890 Standard_Real myXmin, myYmin, myZmin, myXmax, myYmax, myZmax;
891 Get (myXmin, myYmin, myZmin, myXmax, myYmax, myZmax);
893 if(Abs(D.X()) < eps && Abs(D.Y()) < eps)
894 return IsSegmentOut(myXmin, myYmin, myXmax, myYmax, P1.X(), P1.Y(), P2.X(), P2.Y());
896 if(Abs(D.X()) < eps && Abs(D.Z()) < eps)
897 return IsSegmentOut(myXmin, myZmin, myXmax, myZmax, P1.X(), P1.Z(), P2.X(), P2.Z());
899 if(Abs(D.Y()) < eps && Abs(D.Z()) < eps)
900 return IsSegmentOut(myYmin, myZmin, myYmax, myZmax, P1.Y(), P1.Z(), P2.Y(), P2.Z());
904 if(!IsSegmentOut(myXmin, myZmin, myXmax, myZmax,
905 P1.X(),(myYmin-P1.Y())*D.Z()/D.Y()+P1.Z(),
906 P2.X(),(myYmin-P2.Y())*D.Z()/D.Y()+P2.Z()))
907 return Standard_False;
909 if(!IsSegmentOut(myXmin, myZmin, myXmax, myZmax,
910 P1.X(),(myYmax-P1.Y())*D.Z()/D.Y()+P1.Z(),
911 P2.X(),(myYmax-P2.Y())*D.Z()/D.Y()+P2.Z()))
912 return Standard_False;
914 if(!IsSegmentOut(myXmin, myYmin, myXmax, myYmax,
915 P1.X(),(myZmin-P1.Z())*D.Y()/D.Z()+P1.Y(),
916 P2.X(),(myZmin-P2.Z())*D.Y()/D.Z()+P2.Y()))
917 return Standard_False;
919 if(!IsSegmentOut(myXmin, myYmin, myXmax, myYmax,
920 P1.X(),(myZmax-P1.Z())*D.Y()/D.Z()+P1.Y(),
921 P2.X(),(myZmax-P2.Z())*D.Y()/D.Z()+P2.Y()))
922 return Standard_False;
924 return Standard_True;
929 if(!IsSegmentOut(myYmin, myZmin, myYmax, myZmax,
930 P1.Y(),(myXmin-P1.X())*D.Z()/D.X()+P1.Z(),
931 P2.Y(),(myXmin-P2.X())*D.Z()/D.X()+P2.Z()))
932 return Standard_False;
934 if(!IsSegmentOut(myYmin, myZmin, myYmax, myZmax,
935 P1.Y(),(myXmax-P1.X())*D.Z()/D.X()+P1.Z(),
936 P2.Y(),(myXmax-P2.X())*D.Z()/D.X()+P2.Z()))
937 return Standard_False;
939 if(!IsSegmentOut(myYmin, myXmin, myYmax, myXmax,
940 P1.Y(),(myZmin-P1.Z())*D.X()/D.Z()+P1.X(),
941 P2.Y(),(myZmin-P2.Z())*D.X()/D.Z()+P2.X()))
942 return Standard_False;
944 if(!IsSegmentOut(myYmin, myXmin, myYmax, myXmax,
945 P1.Y(),(myZmax-P1.Z())*D.X()/D.Z()+P1.X(),
946 P2.Y(),(myZmax-P2.Z())*D.X()/D.Z()+P2.X()))
947 return Standard_False;
949 return Standard_True;
954 if(!IsSegmentOut(myZmin, myXmin, myZmax, myXmax,
955 P1.Z(),(myYmax-P1.Y())*D.X()/D.Y()+P1.X(),
956 P2.Z(),(myYmax-P2.Y())*D.X()/D.Y()+P2.X()))
957 return Standard_False;
959 if(!IsSegmentOut(myZmin, myXmin, myZmax, myXmax,
960 P1.Z(),(myYmin-P1.Y())*D.X()/D.Y()+P1.X(),
961 P2.Z(),(myYmin-P2.Y())*D.X()/D.Y()+P2.X()))
962 return Standard_False;
964 if(!IsSegmentOut(myZmin, myYmin, myZmax, myYmax,
965 P1.Z(),(myXmax-P1.X())*D.Y()/D.X()+P1.Y(),
966 P2.Z(),(myXmax-P2.X())*D.Y()/D.X()+P2.Y()))
967 return Standard_False;
969 if(!IsSegmentOut(myZmin, myYmin, myZmax, myYmax,
970 P1.Z(),(myXmin-P1.X())*D.Y()/D.X()+P1.Y(),
971 P2.Z(),(myXmin-P2.X())*D.Y()/D.X()+P2.Y()))
972 return Standard_False;
974 return Standard_True;
977 if(!IsSegmentOut(myXmin,myZmin,myXmax,myZmax,
978 (myYmin - P1.Y())/D.Y()*D.X() + P1.X(),
979 (myYmin - P1.Y())/D.Y()*D.Z() + P1.Z(),
980 (myYmin - P2.Y())/D.Y()*D.X() + P2.X(),
981 (myYmin - P2.Y())/D.Y()*D.Z() + P2.Z()))
982 return Standard_False;
984 if(!IsSegmentOut(myXmin,myZmin,myXmax,myZmax,
985 (myYmax - P1.Y())/D.Y()*D.X() + P1.X(),
986 (myYmax - P1.Y())/D.Y()*D.Z() + P1.Z(),
987 (myYmax - P2.Y())/D.Y()*D.X() + P2.X(),
988 (myYmax - P2.Y())/D.Y()*D.Z() + P2.Z()))
989 return Standard_False;
991 if(!IsSegmentOut(myXmin,myYmin,myXmax,myYmax,
992 (myZmin - P1.Z())/D.Z()*D.X() + P1.X(),
993 (myZmin - P1.Z())/D.Z()*D.Y() + P1.Y(),
994 (myZmin - P2.Z())/D.Z()*D.X() + P2.X(),
995 (myZmin - P2.Z())/D.Z()*D.Y() + P2.Y()))
996 return Standard_False;
998 if(!IsSegmentOut(myXmin,myYmin,myXmax,myYmax,
999 (myZmax - P1.Z())/D.Z()*D.X() + P1.X(),
1000 (myZmax - P1.Z())/D.Z()*D.Y() + P1.Y(),
1001 (myZmax - P2.Z())/D.Z()*D.X() + P2.X(),
1002 (myZmax - P2.Z())/D.Z()*D.Y() + P2.Y()))
1003 return Standard_False;
1005 if(!IsSegmentOut(myZmin,myYmin,myZmax,myYmax,
1006 (myXmin - P1.X())/D.X()*D.Z() + P1.Z(),
1007 (myXmin - P1.X())/D.X()*D.Y() + P1.Y(),
1008 (myXmin - P2.X())/D.X()*D.Z() + P2.Z(),
1009 (myXmin - P2.X())/D.X()*D.Y() + P2.Y()))
1010 return Standard_False;
1012 if(!IsSegmentOut(myZmin,myYmin,myZmax,myYmax,
1013 (myXmax - P1.X())/D.X()*D.Z() + P1.Z(),
1014 (myXmax - P1.X())/D.X()*D.Y() + P1.Y(),
1015 (myXmax - P2.X())/D.X()*D.Z() + P2.Z(),
1016 (myXmax - P2.X())/D.X()*D.Y() + P2.Y()))
1017 return Standard_False;
1019 return Standard_True;
1023 //=======================================================================
1024 //function : Distance
1025 //purpose : computes the minimum distance between two boxes
1026 //=======================================================================
1028 static Standard_Real DistMini2Box( const Standard_Real r1min, const Standard_Real r1max, const Standard_Real r2min, const Standard_Real r2max)
1029 { Standard_Real r1, r2;
1031 r1 = Square(r1min - r2max);
1032 r2 = Square(r1max - r2min);
1033 return (Min( r1, r2 ));
1038 Standard_Real Bnd_Box::Distance(const Bnd_Box& Other) const
1039 { Standard_Real xminB1, yminB1, zminB1, xmaxB1, ymaxB1, zmaxB1;
1040 Standard_Real xminB2, yminB2, zminB2, xmaxB2, ymaxB2, zmaxB2;
1041 Standard_Real dist_x, dist_y, dist_z, dist_t;
1043 Get( xminB1, yminB1, zminB1, xmaxB1, ymaxB1, zmaxB1);
1044 Other.Get( xminB2, yminB2, zminB2, xmaxB2, ymaxB2, zmaxB2);
1046 if ( ((xminB1<= xminB2)&&( xminB2 <= xmaxB1)) || ((xminB2<= xminB1)&&( xminB1 <= xmaxB2)) )
1048 else { dist_x= DistMini2Box(xminB1, xmaxB1, xminB2, xmaxB2);}
1049 if ( ((yminB1<= yminB2)&&( yminB2 <= ymaxB1)) || ((yminB2<= yminB1)&&( yminB1 <= ymaxB2)) )
1051 else { dist_y= DistMini2Box(yminB1, ymaxB1, yminB2, ymaxB2);}
1052 if ( ((zminB1<= zminB2)&&( zminB2 <= zmaxB1)) || ((zminB2<= zminB1)&&( zminB1 <= zmaxB2)) )
1054 else { dist_z= DistMini2Box(zminB1, zmaxB1, zminB2, zmaxB2);}
1055 dist_t = dist_x+ dist_y+ dist_z;
1056 return( Sqrt ( dist_t));
1059 //=======================================================================
1062 //=======================================================================
1064 void Bnd_Box::Dump () const
1067 if (IsVoid()) cout << "Void";
1068 else if (IsWhole()) cout << "Whole";
1070 cout << "\n Xmin : ";
1071 if (IsOpenXmin()) cout << "Infinite";
1073 cout << "\n Xmax : ";
1074 if (IsOpenXmax()) cout << "Infinite";
1076 cout << "\n Ymin : ";
1077 if (IsOpenYmin()) cout << "Infinite";
1079 cout << "\n Ymax : ";
1080 if (IsOpenYmax()) cout << "Infinite";
1082 cout << "\n Zmin : ";
1083 if (IsOpenZmin()) cout << "Infinite";
1085 cout << "\n Zmax : ";
1086 if (IsOpenZmax()) cout << "Infinite";
1089 cout << "\n Gap : " << Gap;