2 // Created: Fri Mar 8 11:07:06 1991
3 // Author: Christophe MARION
15 #define WholeMask 0x7e
17 // Standard_True if the flag is one
18 #define VoidFlag() ( Flags & VoidMask )
19 #define XminFlag() ( Flags & XminMask )
20 #define XmaxFlag() ( Flags & XmaxMask )
21 #define YminFlag() ( Flags & YminMask )
22 #define YmaxFlag() ( Flags & YmaxMask )
23 #define ZminFlag() ( Flags & ZminMask )
24 #define ZmaxFlag() ( Flags & ZmaxMask )
25 #define WholeFlag() ( (Flags & WholeMask) == WholeMask )
27 // set the flag to one
28 #define SetVoidFlag() ( Flags = VoidMask )
29 #define SetXminFlag() ( Flags |= XminMask )
30 #define SetXmaxFlag() ( Flags |= XmaxMask )
31 #define SetYminFlag() ( Flags |= YminMask )
32 #define SetYmaxFlag() ( Flags |= YmaxMask )
33 #define SetZminFlag() ( Flags |= ZminMask )
34 #define SetZmaxFlag() ( Flags |= ZmaxMask )
35 #define SetWholeFlag() ( Flags = WholeMask )
37 #define ClearVoidFlag() ( Flags &= ~VoidMask )
39 #include <Standard_Stream.hxx>
41 // #include <Precision.hxx>
42 #define Bnd_Precision_Infinite 1e+100
44 //=======================================================================
47 //=======================================================================
50 : Xmin(0.), Xmax(0.), Ymin(0.), Ymax(0.), Zmin(0.), Zmax(0.), Gap(0.)
55 //=======================================================================
58 //=======================================================================
60 void Bnd_Box::SetWhole ()
65 //=======================================================================
68 //=======================================================================
70 void Bnd_Box::SetVoid ()
76 //=======================================================================
79 //=======================================================================
81 void Bnd_Box::Set(const gp_Pnt& P)
87 //=======================================================================
90 //=======================================================================
92 void Bnd_Box::Set(const gp_Pnt& P, const gp_Dir& D)
99 //=======================================================================
102 //=======================================================================
104 void Bnd_Box::Update (const Standard_Real x,
105 const Standard_Real y,
106 const Standard_Real z,
107 const Standard_Real X,
108 const Standard_Real Y,
109 const Standard_Real Z)
121 if (!XminFlag() && (x < Xmin)) Xmin = x;
122 if (!XmaxFlag() && (X > Xmax)) Xmax = X;
123 if (!YminFlag() && (y < Ymin)) Ymin = y;
124 if (!YmaxFlag() && (Y > Ymax)) Ymax = Y;
125 if (!ZminFlag() && (z < Zmin)) Zmin = z;
126 if (!ZmaxFlag() && (Z > Zmax)) Zmax = Z;
130 //=======================================================================
133 //=======================================================================
135 void Bnd_Box::Update (const Standard_Real X,
136 const Standard_Real Y,
137 const Standard_Real Z)
149 if (!XminFlag() && (X < Xmin)) Xmin = X;
150 else if (!XmaxFlag() && (X > Xmax)) Xmax = X;
151 if (!YminFlag() && (Y < Ymin)) Ymin = Y;
152 else if (!YmaxFlag() && (Y > Ymax)) Ymax = Y;
153 if (!ZminFlag() && (Z < Zmin)) Zmin = Z;
154 else if (!ZmaxFlag() && (Z > Zmax)) Zmax = Z;
158 //=======================================================================
161 //=======================================================================
163 Standard_Real Bnd_Box::GetGap () const
168 //=======================================================================
171 //=======================================================================
173 void Bnd_Box::SetGap (const Standard_Real Tol)
178 //=======================================================================
181 //=======================================================================
183 void Bnd_Box::Enlarge (const Standard_Real Tol)
185 Gap=Max(Gap, Abs(Tol));
188 //=======================================================================
191 //=======================================================================
193 void Bnd_Box::Get (Standard_Real& x,
198 Standard_Real& Z) const
201 Standard_ConstructionError::Raise("Bnd_Box is void");
202 if (XminFlag()) x = -Bnd_Precision_Infinite;
204 if (XmaxFlag()) X = Bnd_Precision_Infinite;
206 if (YminFlag()) y = -Bnd_Precision_Infinite;
208 if (YmaxFlag()) Y = Bnd_Precision_Infinite;
210 if (ZminFlag()) z = -Bnd_Precision_Infinite;
212 if (ZmaxFlag()) Z = Bnd_Precision_Infinite;
216 //=======================================================================
217 //function : OpenXmin
219 //=======================================================================
221 void Bnd_Box::OpenXmin ()
226 //=======================================================================
227 //function : OpenXmax
229 //=======================================================================
231 void Bnd_Box::OpenXmax ()
236 //=======================================================================
237 //function : OpenYmin
239 //=======================================================================
241 void Bnd_Box::OpenYmin ()
246 //=======================================================================
247 //function : OpenYmax
249 //=======================================================================
251 void Bnd_Box::OpenYmax ()
256 //=======================================================================
257 //function : OpenZmin
259 //=======================================================================
261 void Bnd_Box::OpenZmin ()
266 //=======================================================================
267 //function : OpenZmax
269 //=======================================================================
271 void Bnd_Box::OpenZmax ()
276 //=======================================================================
277 //function : IsOpenXmin
279 //=======================================================================
281 Standard_Boolean Bnd_Box::IsOpenXmin () const
286 //=======================================================================
287 //function : IsOpenXmax
289 //=======================================================================
291 Standard_Boolean Bnd_Box::IsOpenXmax () const
296 //=======================================================================
297 //function : IsOpenYmin
299 //=======================================================================
301 Standard_Boolean Bnd_Box::IsOpenYmin () const
306 //=======================================================================
307 //function : IsOpenYmax
309 //=======================================================================
311 Standard_Boolean Bnd_Box::IsOpenYmax () const
316 //=======================================================================
317 //function : IsOpenZmin
319 //=======================================================================
321 Standard_Boolean Bnd_Box::IsOpenZmin () const
326 //=======================================================================
327 //function : IsOpenZmax
329 //=======================================================================
331 Standard_Boolean Bnd_Box::IsOpenZmax () const
336 //=======================================================================
339 //=======================================================================
341 Standard_Boolean Bnd_Box::IsWhole () const
346 //=======================================================================
349 //=======================================================================
351 Standard_Boolean Bnd_Box::IsVoid () const
356 //=======================================================================
359 //=======================================================================
361 Standard_Boolean Bnd_Box::IsXThin (const Standard_Real tol) const
363 if (IsWhole()) return Standard_False;
364 if (IsVoid()) return Standard_True;
365 if (XminFlag()) return Standard_False;
366 if (XmaxFlag()) return Standard_False;
367 if (Xmax-Xmin < tol) return Standard_True;
368 return Standard_False;
371 //=======================================================================
374 //=======================================================================
376 Standard_Boolean Bnd_Box::IsYThin (const Standard_Real tol) const
378 if (IsWhole()) return Standard_False;
379 if (IsVoid()) return Standard_True;
380 if (YminFlag()) return Standard_False;
381 if (YmaxFlag()) return Standard_False;
382 if (Ymax-Ymin < tol) return Standard_True;
383 return Standard_False;
386 //=======================================================================
389 //=======================================================================
391 Standard_Boolean Bnd_Box::IsZThin (const Standard_Real tol) const
393 if (IsWhole()) return Standard_False;
394 if (IsVoid()) return Standard_True;
395 if (ZminFlag()) return Standard_False;
396 if (ZmaxFlag()) return Standard_False;
397 if (Zmax-Zmin < tol) return Standard_True;
398 return Standard_False;
401 //=======================================================================
404 //=======================================================================
406 Standard_Boolean Bnd_Box::IsThin (const Standard_Real tol) const
408 if (!IsXThin(tol)) return Standard_False;
409 if (!IsYThin(tol)) return Standard_False;
410 if (!IsZThin(tol)) return Standard_False;
411 return Standard_True;
414 //=======================================================================
415 //function : Transformed
417 //=======================================================================
419 Bnd_Box Bnd_Box::Transformed (const gp_Trsf& T) const
421 gp_TrsfForm F = T.Form();
423 if ( IsVoid() ) return newb;
425 if (F == gp_Identity) {}
426 else if (F == gp_Translation) {
427 Standard_Real DX,DY,DZ;
428 (T.TranslationPart()).Coord(DX,DY,DZ);
429 if (!XminFlag()) newb.Xmin += DX;
430 if (!XmaxFlag()) newb.Xmax += DX;
431 if (!YminFlag()) newb.Ymin += DY;
432 if (!YmaxFlag()) newb.Ymax += DY;
433 if (!ZminFlag()) newb.Zmin += DZ;
434 if (!ZmaxFlag()) newb.Zmax += DZ;
438 Standard_Boolean Vertex[8];
440 for (i=0;i<8;i++) Vertex[i] = Standard_True;
442 // Standard_Integer vertices = 0;
443 Standard_Integer directions = 0;
447 D[directions-1].SetCoord(-1., 0., 0.);
448 Vertex[0] = Vertex[2] = Vertex[4] = Vertex[6] = Standard_False;
452 D[directions-1].SetCoord( 1., 0., 0.);
453 Vertex[1] = Vertex[3] = Vertex[5] = Vertex[7] = Standard_False;
457 D[directions-1].SetCoord( 0.,-1., 0.);
458 Vertex[0] = Vertex[1] = Vertex[4] = Vertex[5] = Standard_False;
462 D[directions-1].SetCoord( 0., 1., 0.);
463 Vertex[2] = Vertex[3] = Vertex[6] = Vertex[7] = Standard_False;
467 D[directions-1].SetCoord( 0., 0.,-1.);
468 Vertex[0] = Vertex[1] = Vertex[2] = Vertex[3] = Standard_False;
472 D[directions-1].SetCoord( 0., 0., 1.);
473 Vertex[4] = Vertex[5] = Vertex[6] = Vertex[7] = Standard_False;
477 for (i=0;i<directions;i++) {
481 P[0].SetCoord(Xmin,Ymin,Zmin);
482 P[1].SetCoord(Xmax,Ymin,Zmin);
483 P[2].SetCoord(Xmin,Ymax,Zmin);
484 P[3].SetCoord(Xmax,Ymax,Zmin);
485 P[4].SetCoord(Xmin,Ymin,Zmax);
486 P[5].SetCoord(Xmax,Ymin,Zmax);
487 P[6].SetCoord(Xmin,Ymax,Zmax);
488 P[7].SetCoord(Xmax,Ymax,Zmax);
500 //=======================================================================
503 //=======================================================================
505 void Bnd_Box::Add (const Bnd_Box& Other)
507 if (IsWhole()) return;
508 else if (Other.IsVoid()) return;
509 else if (Other.IsWhole()) SetWhole();
510 else if (IsVoid()) (*this) = Other;
513 if ( ! IsOpenXmin() )
515 if (Other.IsOpenXmin()) OpenXmin();
516 else if (Xmin > Other.Xmin) Xmin = Other.Xmin;
518 if ( ! IsOpenXmax() )
520 if (Other.IsOpenXmax()) OpenXmax();
521 else if (Xmax < Other.Xmax) Xmax = Other.Xmax;
523 if ( ! IsOpenYmin() )
525 if (Other.IsOpenYmin()) OpenYmin();
526 else if (Ymin > Other.Ymin) Ymin = Other.Ymin;
528 if ( ! IsOpenYmax() )
530 if (Other.IsOpenYmax()) OpenYmax();
531 else if (Ymax < Other.Ymax) Ymax = Other.Ymax;
533 if ( ! IsOpenZmin() )
535 if (Other.IsOpenZmin()) OpenZmin();
536 else if (Zmin > Other.Zmin) Zmin = Other.Zmin;
538 if ( ! IsOpenZmax() )
540 if (Other.IsOpenZmax()) OpenZmax();
541 else if (Zmax < Other.Zmax) Zmax = Other.Zmax;
543 Gap = Max (Gap, Other.Gap);
547 //=======================================================================
550 //=======================================================================
552 void Bnd_Box::Add (const gp_Pnt& P)
559 //=======================================================================
562 //=======================================================================
564 void Bnd_Box::Add (const gp_Pnt& P, const gp_Dir& D)
571 //=======================================================================
574 //=======================================================================
576 void Bnd_Box::Add (const gp_Dir& D)
578 Standard_Real DX,DY,DZ;
580 if (Abs(DX) > gp::Resolution()) {
581 if (DX > 0) OpenXmax();
584 if (Abs(DY) > gp::Resolution()) {
585 if (DY > 0) OpenYmax();
588 if (Abs(DZ) > gp::Resolution()) {
589 if (DZ > 0) OpenZmax();
594 //=======================================================================
597 //=======================================================================
599 Standard_Boolean Bnd_Box::IsOut (const gp_Pnt& P) const
601 if (IsWhole()) return Standard_False;
602 else if (IsVoid()) return Standard_True;
606 if (!XminFlag() && (X < (Xmin-Gap))) return Standard_True;
607 else if (!XmaxFlag() && (X > (Xmax+Gap))) return Standard_True;
608 else if (!YminFlag() && (Y < (Ymin-Gap))) return Standard_True;
609 else if (!YmaxFlag() && (Y > (Ymax+Gap))) return Standard_True;
610 else if (!ZminFlag() && (Z < (Zmin-Gap))) return Standard_True;
611 else if (!ZmaxFlag() && (Z > (Zmax+Gap))) return Standard_True;
612 else return Standard_False;
617 //=======================================================================
620 //=======================================================================
622 Standard_Boolean Bnd_Box::IsOut (const gp_Pln& P) const
624 if (IsWhole()) return Standard_False;
625 else if (IsVoid()) return Standard_True;
627 Standard_Real A,B,C,D;
628 P.Coefficients (A, B ,C ,D);
629 Standard_Real d = A * (Xmin-Gap) + B * (Ymin-Gap) + C * (Zmin-Gap) + D;
630 // Standard_Boolean plus = d > 0;
631 Standard_Integer plus = d > 0;
632 if (plus != ((A*(Xmin-Gap) + B*(Ymin-Gap) + C*(Zmax+Gap) + D) > 0))
633 return Standard_False;
634 if (plus != ((A*(Xmin-Gap) + B*(Ymax+Gap) + C*(Zmin-Gap) + D) > 0))
635 return Standard_False;
636 if (plus != ((A*(Xmin-Gap) + B*(Ymax+Gap) + C*(Zmax+Gap) + D) > 0))
637 return Standard_False;
638 if (plus != ((A*(Xmax+Gap) + B*(Ymin-Gap) + C*(Zmin-Gap) + D) > 0))
639 return Standard_False;
640 if (plus != ((A*(Xmax+Gap) + B*(Ymin-Gap) + C*(Zmax+Gap) + D) > 0))
641 return Standard_False;
642 if (plus != ((A*(Xmax+Gap) + B*(Ymax+Gap) + C*(Zmin-Gap) + D) > 0))
643 return Standard_False;
644 if (plus != ((A*(Xmax+Gap) + B*(Ymax+Gap) + C*(Zmax+Gap) + D) > 0))
645 return Standard_False;
646 else return Standard_True;
650 //=======================================================================
653 //=======================================================================
655 Standard_Boolean Bnd_Box::IsOut (const gp_Lin& L) const
657 if (IsWhole()) return Standard_False;
658 else if (IsVoid()) return Standard_True;
660 Standard_Real xmin = 0, xmax = 0, ymin = 0, ymax = 0, zmin, zmax;
661 Standard_Real parmin, parmax, par1, par2;
662 Standard_Boolean xToSet, yToSet;
663 Standard_Real myXmin, myYmin, myZmin, myXmax, myYmax, myZmax;
664 Get (myXmin, myYmin, myZmin, myXmax, myYmax, myZmax);
666 if (Abs(L.Direction().XYZ().X())>0.) {
667 par1=(myXmin-L.Location().XYZ().X())/L.Direction().XYZ().X();
668 par2=(myXmax-L.Location().XYZ().X())/L.Direction().XYZ().X();
669 parmin=Min(par1, par2);
670 parmax=Max(par1, par2);
671 xToSet=Standard_True;
674 if (L.Location().XYZ().X()<myXmin || myXmax<L.Location().XYZ().X()) {
675 return Standard_True;
677 xmin=L.Location().XYZ().X();
678 xmax=L.Location().XYZ().X();
679 parmin=-Bnd_Precision_Infinite;
680 parmax=Bnd_Precision_Infinite;
681 xToSet=Standard_False;
684 if (Abs(L.Direction().XYZ().Y())>0.) {
685 par1=(myYmin-L.Location().XYZ().Y())/L.Direction().XYZ().Y();
686 par2=(myYmax-L.Location().XYZ().Y())/L.Direction().XYZ().Y();
687 //=================DET change 06/03/01====================
688 if(parmax < Min(par1,par2) || parmin > Max(par1,par2))
689 return Standard_True;
690 //========================================================
691 parmin=Max(parmin, Min(par1,par2));
692 parmax=Min(parmax, Max(par1,par2));
693 yToSet=Standard_True;
696 if (L.Location().XYZ().Y()<myYmin || myYmax<L.Location().XYZ().Y()) {
697 return Standard_True;
699 ymin=L.Location().XYZ().Y();
700 ymax=L.Location().XYZ().Y();
701 yToSet=Standard_False;
704 if (Abs(L.Direction().XYZ().Z())>0.) {
705 par1=(myZmin-L.Location().XYZ().Z())/L.Direction().XYZ().Z();
706 par2=(myZmax-L.Location().XYZ().Z())/L.Direction().XYZ().Z();
707 //=================DET change 06/03/01====================
708 if(parmax < Min(par1,par2) || parmin > Max(par1,par2))
709 return Standard_True;
710 //========================================================
711 parmin=Max(parmin, Min(par1,par2));
712 parmax=Min(parmax, Max(par1,par2));
713 par1=L.Location().XYZ().Z()+parmin*L.Direction().XYZ().Z();
714 par2=L.Location().XYZ().Z()+parmax*L.Direction().XYZ().Z();
715 zmin=Min(par1, par2);
716 zmax=Max(par1, par2);
719 if (L.Location().XYZ().Z()<myZmin || myZmax<L.Location().XYZ().Z())
720 return Standard_True;
721 zmin=L.Location().XYZ().Z();
722 zmax=L.Location().XYZ().Z();
724 if (zmax<myZmin || myZmax<zmin) return Standard_True;
727 par1=L.Location().XYZ().X()+parmin*L.Direction().XYZ().X();
728 par2=L.Location().XYZ().X()+parmax*L.Direction().XYZ().X();
729 xmin=Min(par1, par2);
730 xmax=Max(par1, par2);
732 if (xmax<myXmin || myXmax<xmin) return Standard_True;
735 par1=L.Location().XYZ().Y()+parmin*L.Direction().XYZ().Y();
736 par2=L.Location().XYZ().Y()+parmax*L.Direction().XYZ().Y();
737 ymin=Min(par1, par2);
738 ymax=Max(par1, par2);
740 if (ymax<myYmin || myYmax<ymin) return Standard_True;
742 return Standard_False;
745 //=======================================================================
748 //=======================================================================
750 Standard_Boolean Bnd_Box::IsOut (const Bnd_Box& Other) const
752 //modified by NIZNHY-PKV Fri Jul 08 11:03:43 2011f
753 if (!Flags && !Other.Flags) {
754 Standard_Boolean bRet;
757 delta = Other.Gap + Gap;
758 bRet=((Xmin - Other.Xmax > delta) ||
759 (Other.Xmin - Xmax > delta) ||
760 (Ymin - Other.Ymax > delta) ||
761 (Other.Ymin - Ymax > delta) ||
762 (Zmin - Other.Zmax > delta) ||
763 (Other.Zmin - Zmax > delta));
766 //modified by NIZNHY-PKV Fri Jul 08 11:03:46 2011t
767 if (IsVoid()) return Standard_True;
768 if (Other.IsVoid()) return Standard_True;
769 if (IsWhole()) return Standard_False;
770 if (Other.IsWhole()) return Standard_False;
772 Standard_Real delta = Other.Gap + Gap;
774 if (!XminFlag() && !Other.IsOpenXmax())
775 if (Xmin - Other.Xmax > delta) return Standard_True;
776 if (!XmaxFlag() && !Other.IsOpenXmin())
777 if (Other.Xmin - Xmax > delta) return Standard_True;
779 if (!YminFlag() && !Other.IsOpenYmax())
780 if (Ymin - Other.Ymax > delta) return Standard_True;
781 if (!YmaxFlag() && !Other.IsOpenYmin())
782 if (Other.Ymin - Ymax > delta) return Standard_True;
784 if (!ZminFlag() && !Other.IsOpenZmax())
785 if (Zmin - Other.Zmax > delta) return Standard_True;
786 if (!ZmaxFlag() && !Other.IsOpenZmin())
787 if (Other.Zmin - Zmax > delta) return Standard_True;
789 return Standard_False;
792 //=======================================================================
795 //=======================================================================
797 Standard_Boolean Bnd_Box::IsOut (const Bnd_Box& Other,
798 const gp_Trsf& T) const
800 return IsOut(Other.Transformed(T));
803 //=======================================================================
806 //=======================================================================
808 Standard_Boolean Bnd_Box::IsOut (const gp_Trsf& T1,
809 const Bnd_Box& Other,
810 const gp_Trsf& T2) const
812 return Transformed(T1).IsOut(Other.Transformed(T2));
816 //=======================================================================
819 //=======================================================================
821 static Standard_Boolean IsSegmentOut(Standard_Real x1,Standard_Real y1,
822 Standard_Real x2,Standard_Real y2,
823 Standard_Real xs1,Standard_Real ys1,
824 Standard_Real xs2,Standard_Real ys2)
826 Standard_Real eps = RealSmall();
827 Standard_Real xsmin = Min (xs1, xs2);
828 Standard_Real xsmax = Max (xs1, xs2);
829 Standard_Real ysmin = Min (ys1, ys2);
830 Standard_Real ysmax = Max (ys1, ys2);
832 if (ysmax-ysmin < eps && (y1-ys1 < eps && ys1-y2 < eps) &&
833 (xsmin-x1 < eps && x1-xsmax < eps || xsmin-x2 < eps && x2-xsmax < eps ||
834 x1-xs1 < eps && xs1-x2 < eps))
835 return Standard_False;
836 if (xsmax-xsmin < eps && (x1-xs1 < eps && xs1-x2 < eps) &&
837 (ysmin-y1 < eps && y1-ysmax < eps || ysmin-y2 < eps && y2-ysmax < eps ||
838 y1-ys1 < eps && ys1-y2 < eps))
839 return Standard_False;
841 if ((xs1 < x1 && xs2 < x1) || (xs1 > x2 && xs2 > x2) ||
842 (ys1 < y1 && ys2 < y1) || (ys1 > y2 && ys2 > y2) )
843 return Standard_True;
845 if (Abs(xs2-xs1) > eps)
847 Standard_Real ya = ( Min(x1, x2) - xs1 ) * ( ys2 - ys1 ) / ( xs2 - xs1 ) + ys1;
848 Standard_Real yb = ( Max(x1, x2) - xs1 ) * ( ys2 - ys1 ) / ( xs2 - xs1 ) + ys1;
849 if ( (ya < y1 && yb < y1) || (ya > y2 && yb > y2) ) return Standard_True;
851 else if (Abs(ys2-ys1) > eps)
853 Standard_Real xa = ( Min(y1, y2) - ys1 ) * ( xs2 - xs1 ) / ( ys2 - ys1 ) + xs1;
854 Standard_Real xb = ( Max(y1, y2) - ys1 ) * ( xs2 - xs1 ) / ( ys2 - ys1 ) + xs1;
855 if ( (xa < x1 && xb < x1) || (xa > x2 && xb > x2) ) return Standard_True;
858 return Standard_True;
860 return Standard_False;
863 Standard_Boolean Bnd_Box::IsOut(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Dir& D) const
866 if (IsWhole()) return Standard_False;
867 else if (IsVoid()) return Standard_True;
869 Standard_Real eps = RealSmall();
870 Standard_Real myXmin, myYmin, myZmin, myXmax, myYmax, myZmax;
871 Get (myXmin, myYmin, myZmin, myXmax, myYmax, myZmax);
873 if(Abs(D.X()) < eps && Abs(D.Y()) < eps)
874 return IsSegmentOut(myXmin, myYmin, myXmax, myYmax, P1.X(), P1.Y(), P2.X(), P2.Y());
876 if(Abs(D.X()) < eps && Abs(D.Z()) < eps)
877 return IsSegmentOut(myXmin, myZmin, myXmax, myZmax, P1.X(), P1.Z(), P2.X(), P2.Z());
879 if(Abs(D.Y()) < eps && Abs(D.Z()) < eps)
880 return IsSegmentOut(myYmin, myZmin, myYmax, myZmax, P1.Y(), P1.Z(), P2.Y(), P2.Z());
884 if(!IsSegmentOut(myXmin, myZmin, myXmax, myZmax,
885 P1.X(),(myYmin-P1.Y())*D.Z()/D.Y()+P1.Z(),
886 P2.X(),(myYmin-P2.Y())*D.Z()/D.Y()+P2.Z()))
887 return Standard_False;
889 if(!IsSegmentOut(myXmin, myZmin, myXmax, myZmax,
890 P1.X(),(myYmax-P1.Y())*D.Z()/D.Y()+P1.Z(),
891 P2.X(),(myYmax-P2.Y())*D.Z()/D.Y()+P2.Z()))
892 return Standard_False;
894 if(!IsSegmentOut(myXmin, myYmin, myXmax, myYmax,
895 P1.X(),(myZmin-P1.Z())*D.Y()/D.Z()+P1.Y(),
896 P2.X(),(myZmin-P2.Z())*D.Y()/D.Z()+P2.Y()))
897 return Standard_False;
899 if(!IsSegmentOut(myXmin, myYmin, myXmax, myYmax,
900 P1.X(),(myZmax-P1.Z())*D.Y()/D.Z()+P1.Y(),
901 P2.X(),(myZmax-P2.Z())*D.Y()/D.Z()+P2.Y()))
902 return Standard_False;
904 return Standard_True;
909 if(!IsSegmentOut(myYmin, myZmin, myYmax, myZmax,
910 P1.Y(),(myXmin-P1.X())*D.Z()/D.X()+P1.Z(),
911 P2.Y(),(myXmin-P2.X())*D.Z()/D.X()+P2.Z()))
912 return Standard_False;
914 if(!IsSegmentOut(myYmin, myZmin, myYmax, myZmax,
915 P1.Y(),(myXmax-P1.X())*D.Z()/D.X()+P1.Z(),
916 P2.Y(),(myXmax-P2.X())*D.Z()/D.X()+P2.Z()))
917 return Standard_False;
919 if(!IsSegmentOut(myYmin, myXmin, myYmax, myXmax,
920 P1.Y(),(myZmin-P1.Z())*D.X()/D.Z()+P1.X(),
921 P2.Y(),(myZmin-P2.Z())*D.X()/D.Z()+P2.X()))
922 return Standard_False;
924 if(!IsSegmentOut(myYmin, myXmin, myYmax, myXmax,
925 P1.Y(),(myZmax-P1.Z())*D.X()/D.Z()+P1.X(),
926 P2.Y(),(myZmax-P2.Z())*D.X()/D.Z()+P2.X()))
927 return Standard_False;
929 return Standard_True;
934 if(!IsSegmentOut(myZmin, myXmin, myZmax, myXmax,
935 P1.Z(),(myYmax-P1.Y())*D.X()/D.Y()+P1.X(),
936 P2.Z(),(myYmax-P2.Y())*D.X()/D.Y()+P2.X()))
937 return Standard_False;
939 if(!IsSegmentOut(myZmin, myXmin, myZmax, myXmax,
940 P1.Z(),(myYmin-P1.Y())*D.X()/D.Y()+P1.X(),
941 P2.Z(),(myYmin-P2.Y())*D.X()/D.Y()+P2.X()))
942 return Standard_False;
944 if(!IsSegmentOut(myZmin, myYmin, myZmax, myYmax,
945 P1.Z(),(myXmax-P1.X())*D.Y()/D.X()+P1.Y(),
946 P2.Z(),(myXmax-P2.X())*D.Y()/D.X()+P2.Y()))
947 return Standard_False;
949 if(!IsSegmentOut(myZmin, myYmin, myZmax, myYmax,
950 P1.Z(),(myXmin-P1.X())*D.Y()/D.X()+P1.Y(),
951 P2.Z(),(myXmin-P2.X())*D.Y()/D.X()+P2.Y()))
952 return Standard_False;
954 return Standard_True;
957 if(!IsSegmentOut(myXmin,myZmin,myXmax,myZmax,
958 (myYmin - P1.Y())/D.Y()*D.X() + P1.X(),
959 (myYmin - P1.Y())/D.Y()*D.Z() + P1.Z(),
960 (myYmin - P2.Y())/D.Y()*D.X() + P2.X(),
961 (myYmin - P2.Y())/D.Y()*D.Z() + P2.Z()))
962 return Standard_False;
964 if(!IsSegmentOut(myXmin,myZmin,myXmax,myZmax,
965 (myYmax - P1.Y())/D.Y()*D.X() + P1.X(),
966 (myYmax - P1.Y())/D.Y()*D.Z() + P1.Z(),
967 (myYmax - P2.Y())/D.Y()*D.X() + P2.X(),
968 (myYmax - P2.Y())/D.Y()*D.Z() + P2.Z()))
969 return Standard_False;
971 if(!IsSegmentOut(myXmin,myYmin,myXmax,myYmax,
972 (myZmin - P1.Z())/D.Z()*D.X() + P1.X(),
973 (myZmin - P1.Z())/D.Z()*D.Y() + P1.Y(),
974 (myZmin - P2.Z())/D.Z()*D.X() + P2.X(),
975 (myZmin - P2.Z())/D.Z()*D.Y() + P2.Y()))
976 return Standard_False;
978 if(!IsSegmentOut(myXmin,myYmin,myXmax,myYmax,
979 (myZmax - P1.Z())/D.Z()*D.X() + P1.X(),
980 (myZmax - P1.Z())/D.Z()*D.Y() + P1.Y(),
981 (myZmax - P2.Z())/D.Z()*D.X() + P2.X(),
982 (myZmax - P2.Z())/D.Z()*D.Y() + P2.Y()))
983 return Standard_False;
985 if(!IsSegmentOut(myZmin,myYmin,myZmax,myYmax,
986 (myXmin - P1.X())/D.X()*D.Z() + P1.Z(),
987 (myXmin - P1.X())/D.X()*D.Y() + P1.Y(),
988 (myXmin - P2.X())/D.X()*D.Z() + P2.Z(),
989 (myXmin - P2.X())/D.X()*D.Y() + P2.Y()))
990 return Standard_False;
992 if(!IsSegmentOut(myZmin,myYmin,myZmax,myYmax,
993 (myXmax - P1.X())/D.X()*D.Z() + P1.Z(),
994 (myXmax - P1.X())/D.X()*D.Y() + P1.Y(),
995 (myXmax - P2.X())/D.X()*D.Z() + P2.Z(),
996 (myXmax - P2.X())/D.X()*D.Y() + P2.Y()))
997 return Standard_False;
999 return Standard_True;
1003 //=======================================================================
1004 //function : Distance
1005 //purpose : computes the minimum distance between two boxes
1006 //=======================================================================
1008 static Standard_Real DistMini2Box( const Standard_Real r1min, const Standard_Real r1max, const Standard_Real r2min, const Standard_Real r2max)
1009 { Standard_Real r1, r2;
1011 r1 = Square(r1min - r2max);
1012 r2 = Square(r1max - r2min);
1013 return (Min( r1, r2 ));
1018 Standard_Real Bnd_Box::Distance(const Bnd_Box& Other) const
1019 { Standard_Real xminB1, yminB1, zminB1, xmaxB1, ymaxB1, zmaxB1;
1020 Standard_Real xminB2, yminB2, zminB2, xmaxB2, ymaxB2, zmaxB2;
1021 Standard_Real dist_x, dist_y, dist_z, dist_t;
1023 Get( xminB1, yminB1, zminB1, xmaxB1, ymaxB1, zmaxB1);
1024 Other.Get( xminB2, yminB2, zminB2, xmaxB2, ymaxB2, zmaxB2);
1026 if ( ((xminB1<= xminB2)&&( xminB2 <= xmaxB1)) || ((xminB2<= xminB1)&&( xminB1 <= xmaxB2)) )
1028 else { dist_x= DistMini2Box(xminB1, xmaxB1, xminB2, xmaxB2);}
1029 if ( ((yminB1<= yminB2)&&( yminB2 <= ymaxB1)) || ((yminB2<= yminB1)&&( yminB1 <= ymaxB2)) )
1031 else { dist_y= DistMini2Box(yminB1, ymaxB1, yminB2, ymaxB2);}
1032 if ( ((zminB1<= zminB2)&&( zminB2 <= zmaxB1)) || ((zminB2<= zminB1)&&( zminB1 <= zmaxB2)) )
1034 else { dist_z= DistMini2Box(zminB1, zmaxB1, zminB2, zmaxB2);}
1035 dist_t = dist_x+ dist_y+ dist_z;
1036 return( Sqrt ( dist_t));
1039 //=======================================================================
1042 //=======================================================================
1044 void Bnd_Box::Dump () const
1047 if (IsVoid()) cout << "Void";
1048 else if (IsWhole()) cout << "Whole";
1050 cout << "\n Xmin : ";
1051 if (IsOpenXmin()) cout << "Infinite";
1053 cout << "\n Xmax : ";
1054 if (IsOpenXmax()) cout << "Infinite";
1056 cout << "\n Ymin : ";
1057 if (IsOpenYmin()) cout << "Infinite";
1059 cout << "\n Ymax : ";
1060 if (IsOpenYmax()) cout << "Infinite";
1062 cout << "\n Zmin : ";
1063 if (IsOpenZmin()) cout << "Infinite";
1065 cout << "\n Zmax : ";
1066 if (IsOpenZmax()) cout << "Infinite";
1069 cout << "\n Gap : " << Gap;