1 #include <BndLib.ixx> // BUG BUG BUG pas .hxx
7 #include <gp_Pnt2d.hxx>
8 #include <BndLib_Compute.hxx>
9 #include <Precision.hxx>
10 #include <Standard_Failure.hxx>
13 static void OpenMin(const gp_Dir& V,Bnd_Box& B) {
17 if (V.IsParallel(OX,Precision::Angular()))
19 else if (V.IsParallel(OY,Precision::Angular()))
21 else if (V.IsParallel(OZ,Precision::Angular()))
24 B.OpenXmin();B.OpenYmin();B.OpenZmin();
28 static void OpenMax(const gp_Dir& V,Bnd_Box& B) {
32 if (V.IsParallel(OX,Precision::Angular()))
34 else if (V.IsParallel(OY,Precision::Angular()))
36 else if (V.IsParallel(OZ,Precision::Angular()))
39 B.OpenXmax();B.OpenYmax();B.OpenZmax();
43 static void OpenMinMax(const gp_Dir& V,Bnd_Box& B) {
47 if (V.IsParallel(OX,Precision::Angular())) {
48 B.OpenXmax();B.OpenXmin();
50 else if (V.IsParallel(OY,Precision::Angular())) {
51 B.OpenYmax();B.OpenYmin();
53 else if (V.IsParallel(OZ,Precision::Angular())) {
54 B.OpenZmax();B.OpenZmin();
57 B.OpenXmin();B.OpenYmin();B.OpenZmin();
58 B.OpenXmax();B.OpenYmax();B.OpenZmax();
62 static void OpenMin(const gp_Dir2d& V,Bnd_Box2d& B) {
65 if (V.IsParallel(OX,Precision::Angular()))
67 else if (V.IsParallel(OY,Precision::Angular()))
70 B.OpenXmin();B.OpenYmin();
74 static void OpenMax(const gp_Dir2d& V,Bnd_Box2d& B) {
77 if (V.IsParallel(OX,Precision::Angular()))
79 else if (V.IsParallel(OY,Precision::Angular()))
82 B.OpenXmax();B.OpenYmax();
86 static void OpenMinMax(const gp_Dir2d& V,Bnd_Box2d& B) {
89 if (V.IsParallel(OX,Precision::Angular())) {
90 B.OpenXmax();B.OpenXmin();
92 else if (V.IsParallel(OY,Precision::Angular())) {
93 B.OpenYmax();B.OpenYmin();
96 B.OpenXmin();B.OpenYmin();
97 B.OpenXmax();B.OpenYmax();
102 void BndLib::Add( const gp_Lin& L,const Standard_Real P1,
103 const Standard_Real P2,
104 const Standard_Real Tol, Bnd_Box& B) {
106 if (Precision::IsNegativeInfinite(P1)) {
107 if (Precision::IsNegativeInfinite(P2)) {
108 Standard_Failure::Raise("BndLib::bad parameter");
110 else if (Precision::IsPositiveInfinite(P2)) {
111 OpenMinMax(L.Direction(),B);
112 B.Add(ElCLib::Value(0.,L));
115 OpenMin(L.Direction(),B);
116 B.Add(ElCLib::Value(P2,L));
119 else if (Precision::IsPositiveInfinite(P1)) {
120 if (Precision::IsNegativeInfinite(P2)) {
121 OpenMinMax(L.Direction(),B);
122 B.Add(ElCLib::Value(0.,L));
124 else if (Precision::IsPositiveInfinite(P2)) {
125 Standard_Failure::Raise("BndLib::bad parameter");
128 OpenMax(L.Direction(),B);
129 B.Add(ElCLib::Value(P2,L));
133 B.Add(ElCLib::Value(P1,L));
134 if (Precision::IsNegativeInfinite(P2)) {
135 OpenMin(L.Direction(),B);
137 else if (Precision::IsPositiveInfinite(P2)){
138 OpenMax(L.Direction(),B);
141 B.Add(ElCLib::Value(P2,L));
147 void BndLib::Add( const gp_Lin2d& L,const Standard_Real P1,
148 const Standard_Real P2,
149 const Standard_Real Tol, Bnd_Box2d& B) {
151 if (Precision::IsNegativeInfinite(P1)) {
152 if (Precision::IsNegativeInfinite(P2)) {
153 Standard_Failure::Raise("BndLib::bad parameter");
155 else if (Precision::IsPositiveInfinite(P2)) {
156 OpenMinMax(L.Direction(),B);
157 B.Add(ElCLib::Value(0.,L));
160 OpenMin(L.Direction(),B);
161 B.Add(ElCLib::Value(P2,L));
164 else if (Precision::IsPositiveInfinite(P1)) {
165 if (Precision::IsNegativeInfinite(P2)) {
166 OpenMinMax(L.Direction(),B);
167 B.Add(ElCLib::Value(0.,L));
169 else if (Precision::IsPositiveInfinite(P2)) {
170 Standard_Failure::Raise("BndLib::bad parameter");
173 OpenMax(L.Direction(),B);
174 B.Add(ElCLib::Value(P2,L));
178 B.Add(ElCLib::Value(P1,L));
179 if (Precision::IsNegativeInfinite(P2)) {
180 OpenMin(L.Direction(),B);
182 else if (Precision::IsPositiveInfinite(P2)){
183 OpenMax(L.Direction(),B);
186 B.Add(ElCLib::Value(P2,L));
192 void BndLib::Add( const gp_Circ& C,const Standard_Real Tol, Bnd_Box& B) {
194 Standard_Real R = C.Radius();
195 gp_XYZ O = C.Location().XYZ();
196 gp_XYZ Xd = C.XAxis().Direction().XYZ();
197 gp_XYZ Yd = C.YAxis().Direction().XYZ();
198 B.Add(gp_Pnt(O -R*Xd -R*Yd));
199 B.Add(gp_Pnt(O -R*Xd +R*Yd));
200 B.Add(gp_Pnt(O +R*Xd -R*Yd));
201 B.Add(gp_Pnt(O +R*Xd +R*Yd));
205 void BndLib::Add( const gp_Circ& C,const Standard_Real P1,
206 const Standard_Real P2,
207 const Standard_Real Tol, Bnd_Box& B) {
209 Compute(P1,P2,C.Radius(),C.Radius(),C.XAxis().Direction().XYZ(),
210 C.YAxis().Direction().XYZ(),C.Location().XYZ(),B);
214 void BndLib::Add( const gp_Circ2d& C,const Standard_Real Tol, Bnd_Box2d& B) {
216 Standard_Real R = C.Radius();
217 gp_XY O = C.Location().XY();
218 gp_XY Xd = C.XAxis().Direction().XY();
219 gp_XY Yd = C.YAxis().Direction().XY();
220 B.Add(gp_Pnt2d(O -R*Xd -R*Yd));
221 B.Add(gp_Pnt2d(O -R*Xd +R*Yd));
222 B.Add(gp_Pnt2d(O +R*Xd -R*Yd));
223 B.Add(gp_Pnt2d(O +R*Xd +R*Yd));
227 void BndLib::Add(const gp_Circ2d& C,const Standard_Real P1,
228 const Standard_Real P2,
229 const Standard_Real Tol, Bnd_Box2d& B) {
231 Compute(P1,P2,C.Radius(),C.Radius(),C.XAxis().Direction().XY(),
232 C.YAxis().Direction().XY(),C.Location().XY(),B);
236 void BndLib::Add( const gp_Elips& C,const Standard_Real Tol, Bnd_Box& B) {
238 Standard_Real Ra = C.MajorRadius();
239 Standard_Real Rb = C.MinorRadius();
240 gp_XYZ Xd = C.XAxis().Direction().XYZ();
241 gp_XYZ Yd = C.YAxis().Direction().XYZ();
242 gp_XYZ O = C.Location().XYZ();
243 B.Add(gp_Pnt(O +Ra*Xd +Rb*Yd));
244 B.Add(gp_Pnt(O -Ra*Xd +Rb*Yd));
245 B.Add(gp_Pnt(O -Ra*Xd -Rb*Yd));
246 B.Add(gp_Pnt(O +Ra*Xd -Rb*Yd));
250 void BndLib::Add( const gp_Elips& C,const Standard_Real P1,
251 const Standard_Real P2,
252 const Standard_Real Tol, Bnd_Box& B) {
254 Compute(P1,P2,C.MajorRadius(),C.MinorRadius(),C.XAxis().Direction().XYZ(),
255 C.YAxis().Direction().XYZ(),C.Location().XYZ(),B);
259 void BndLib::Add( const gp_Elips2d& C,const Standard_Real Tol, Bnd_Box2d& B) {
261 Standard_Real Ra= C.MajorRadius();
262 Standard_Real Rb= C.MinorRadius();
263 gp_XY Xd = C.XAxis().Direction().XY();
264 gp_XY Yd = C.YAxis().Direction().XY();
265 gp_XY O = C.Location().XY();
266 B.Add(gp_Pnt2d(O +Ra*Xd +Rb*Yd));
267 B.Add(gp_Pnt2d(O -Ra*Xd +Rb*Yd));
268 B.Add(gp_Pnt2d(O -Ra*Xd -Rb*Yd));
269 B.Add(gp_Pnt2d(O +Ra*Xd -Rb*Yd));
273 void BndLib::Add( const gp_Elips2d& C,const Standard_Real P1,
274 const Standard_Real P2,
275 const Standard_Real Tol, Bnd_Box2d& B) {
277 Compute(P1,P2,C.MajorRadius(),C.MinorRadius(),
278 C.XAxis().Direction().XY(),
279 C.YAxis().Direction().XY(),C.Location().XY(),B);
283 void BndLib::Add( const gp_Parab& P,const Standard_Real P1,
284 const Standard_Real P2,
285 const Standard_Real Tol, Bnd_Box& B) {
287 if (Precision::IsNegativeInfinite(P1)) {
288 if (Precision::IsNegativeInfinite(P2)) {
289 Standard_Failure::Raise("BndLib::bad parameter");
291 else if (Precision::IsPositiveInfinite(P2)) {
292 B.OpenXmax();B.OpenYmax();B.OpenZmax();
295 B.Add(ElCLib::Value(P2,P));
297 B.OpenXmin();B.OpenYmin();B.OpenZmin();
299 else if (Precision::IsPositiveInfinite(P1)) {
300 if (Precision::IsNegativeInfinite(P2)) {
301 B.OpenXmin();B.OpenYmin();B.OpenZmin();
303 else if (Precision::IsPositiveInfinite(P2)) {
304 Standard_Failure::Raise("BndLib::bad parameter");
307 B.Add(ElCLib::Value(P2,P));
309 B.OpenXmax();B.OpenYmax();B.OpenZmax();
312 B.Add(ElCLib::Value(P1,P));
313 if (Precision::IsNegativeInfinite(P2)) {
314 B.OpenXmin();B.OpenYmin();B.OpenZmin();
316 else if (Precision::IsPositiveInfinite(P2)){
317 B.OpenXmax();B.OpenYmax();B.OpenZmax();
320 B.Add(ElCLib::Value(P2,P));
321 if (P1*P2<0) B.Add(ElCLib::Value(0.,P));
327 void BndLib::Add( const gp_Parab2d& P,const Standard_Real P1,
328 const Standard_Real P2,
329 const Standard_Real Tol, Bnd_Box2d& B) {
331 if (Precision::IsNegativeInfinite(P1)) {
332 if (Precision::IsNegativeInfinite(P2)) {
333 Standard_Failure::Raise("BndLib::bad parameter");
335 else if (Precision::IsPositiveInfinite(P2)) {
336 B.OpenXmax();B.OpenYmax();
339 B.Add(ElCLib::Value(P2,P));
341 B.OpenXmin();B.OpenYmin();
343 else if (Precision::IsPositiveInfinite(P1)) {
344 if (Precision::IsNegativeInfinite(P2)) {
345 B.OpenXmin();B.OpenYmin();
347 else if (Precision::IsPositiveInfinite(P2)) {
348 Standard_Failure::Raise("BndLib::bad parameter");
351 B.Add(ElCLib::Value(P2,P));
353 B.OpenXmax();B.OpenYmax();
356 B.Add(ElCLib::Value(P1,P));
357 if (Precision::IsNegativeInfinite(P2)) {
358 B.OpenXmin();B.OpenYmin();
360 else if (Precision::IsPositiveInfinite(P2)){
361 B.OpenXmax();B.OpenYmax();
364 B.Add(ElCLib::Value(P2,P));
365 if (P1*P2<0) B.Add(ElCLib::Value(0.,P));
371 void BndLib::Add( const gp_Hypr& H,const Standard_Real P1,
372 const Standard_Real P2,
373 const Standard_Real Tol, Bnd_Box& B) {
375 if (Precision::IsNegativeInfinite(P1)) {
376 if (Precision::IsNegativeInfinite(P2)) {
377 Standard_Failure::Raise("BndLib::bad parameter");
379 else if (Precision::IsPositiveInfinite(P2)) {
380 B.OpenXmax();B.OpenYmax();B.OpenZmax();
383 B.Add(ElCLib::Value(P2,H));
385 B.OpenXmin();B.OpenYmin();B.OpenZmin();
387 else if (Precision::IsPositiveInfinite(P1)) {
388 if (Precision::IsNegativeInfinite(P2)) {
389 B.OpenXmin();B.OpenYmin();B.OpenZmin();
391 else if (Precision::IsPositiveInfinite(P2)) {
392 Standard_Failure::Raise("BndLib::bad parameter");
395 B.Add(ElCLib::Value(P2,H));
397 B.OpenXmax();B.OpenYmax();B.OpenZmax();
400 B.Add(ElCLib::Value(P1,H));
401 if (Precision::IsNegativeInfinite(P2)) {
402 B.OpenXmin();B.OpenYmin();B.OpenZmin();
404 else if (Precision::IsPositiveInfinite(P2)){
405 B.OpenXmax();B.OpenYmax();B.OpenZmax();
408 B.Add(ElCLib::Value(P2,H));
409 if (P1*P2<0) B.Add(ElCLib::Value(0.,H));
415 void BndLib::Add(const gp_Hypr2d& H,const Standard_Real P1,
416 const Standard_Real P2,
417 const Standard_Real Tol, Bnd_Box2d& B) {
419 if (Precision::IsNegativeInfinite(P1)) {
420 if (Precision::IsNegativeInfinite(P2)) {
421 Standard_Failure::Raise("BndLib::bad parameter");
423 else if (Precision::IsPositiveInfinite(P2)) {
424 B.OpenXmax();B.OpenYmax();
427 B.Add(ElCLib::Value(P2,H));
429 B.OpenXmin();B.OpenYmin();
431 else if (Precision::IsPositiveInfinite(P1)) {
432 if (Precision::IsNegativeInfinite(P2)) {
433 B.OpenXmin();B.OpenYmin();
435 else if (Precision::IsPositiveInfinite(P2)) {
436 Standard_Failure::Raise("BndLib::bad parameter");
439 B.Add(ElCLib::Value(P2,H));
441 B.OpenXmax();B.OpenYmax();
444 B.Add(ElCLib::Value(P1,H));
445 if (Precision::IsNegativeInfinite(P2)) {
446 B.OpenXmin();B.OpenYmin();
448 else if (Precision::IsPositiveInfinite(P2)){
449 B.OpenXmax();B.OpenYmax();
452 B.Add(ElCLib::Value(P2,H));
453 if (P1*P2<0) B.Add(ElCLib::Value(0.,H));
459 void BndLib::Add( const gp_Cylinder& S,const Standard_Real UMin,
460 const Standard_Real UMax,const Standard_Real VMin,
461 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
463 if (Precision::IsNegativeInfinite(VMin)) {
464 if (Precision::IsNegativeInfinite(VMax)) {
465 Standard_Failure::Raise("BndLib::bad parameter");
467 else if (Precision::IsPositiveInfinite(VMax)) {
468 OpenMinMax(S.Axis().Direction(),B);
471 Compute(UMin,UMax,S.Radius(),S.Radius(),
472 S.XAxis().Direction().XYZ(),
473 S.YAxis().Direction().XYZ(),
474 S.Location().XYZ() + VMax*S.Axis().Direction().XYZ(),B);
475 OpenMin(S.Axis().Direction(),B);
478 else if (Precision::IsPositiveInfinite(VMin)) {
479 if (Precision::IsNegativeInfinite(VMax)) {
480 OpenMinMax(S.Axis().Direction(),B);
482 else if (Precision::IsPositiveInfinite(VMax)) {
483 Standard_Failure::Raise("BndLib::bad parameter");
486 Compute(UMin,UMax,S.Radius(),S.Radius(),
487 S.XAxis().Direction().XYZ(),
488 S.YAxis().Direction().XYZ(),
489 S.Location().XYZ() + VMax*S.Axis().Direction().XYZ(),B);
490 OpenMax(S.Axis().Direction(),B);
495 Compute(UMin,UMax,S.Radius(),S.Radius(),
496 S.XAxis().Direction().XYZ(),
497 S.YAxis().Direction().XYZ(),
498 S.Location().XYZ() + VMin*S.Axis().Direction().XYZ(),B);
499 if (Precision::IsNegativeInfinite(VMax)) {
500 OpenMin(S.Axis().Direction(),B);
502 else if (Precision::IsPositiveInfinite(VMax)) {
503 OpenMax(S.Axis().Direction(),B);
506 Compute(UMin,UMax,S.Radius(),S.Radius(),
507 S.XAxis().Direction().XYZ(),
508 S.YAxis().Direction().XYZ(),
509 S.Location().XYZ() + VMax*S.Axis().Direction().XYZ(),B);
517 void BndLib::Add( const gp_Cylinder& S,const Standard_Real VMin,
518 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
520 BndLib::Add(S,0.,2.*M_PI,VMin,VMax,Tol,B);
523 void BndLib::Add(const gp_Cone& S,const Standard_Real UMin,
524 const Standard_Real UMax,const Standard_Real VMin,
525 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
527 Standard_Real R = S.RefRadius();
528 Standard_Real A = S.SemiAngle();
529 if (Precision::IsNegativeInfinite(VMin)) {
530 if (Precision::IsNegativeInfinite(VMax)) {
531 Standard_Failure::Raise("BndLib::bad parameter");
533 else if (Precision::IsPositiveInfinite(VMax)) {
534 gp_Dir D(Cos(A)*S.Axis().Direction());
538 Compute(UMin,UMax,R+VMax*Sin(A),R+VMax*Sin(A),
539 S.XAxis().Direction().XYZ(),
540 S.YAxis().Direction().XYZ(),
542 VMax*Cos(A)*S.Axis().Direction().XYZ(),B);
543 gp_Dir D(Cos(A)*S.Axis().Direction());
548 else if (Precision::IsPositiveInfinite(VMin)) {
549 if (Precision::IsNegativeInfinite(VMax)) {
550 gp_Dir D(Cos(A)*S.Axis().Direction());
553 else if (Precision::IsPositiveInfinite(VMax)) {
554 Standard_Failure::Raise("BndLib::bad parameter");
557 Compute(UMin,UMax,R+VMax*Sin(A),R+VMax*Sin(A),
558 S.XAxis().Direction().XYZ(),
559 S.YAxis().Direction().XYZ(),
561 VMax*Cos(A)*S.Axis().Direction().XYZ(),B);
562 gp_Dir D(Cos(A)*S.Axis().Direction());
568 Compute(UMin,UMax,R+VMin*Sin(A),R+VMin*Sin(A),
569 S.XAxis().Direction().XYZ(),
570 S.YAxis().Direction().XYZ(),
572 VMin*Cos(A)*S.Axis().Direction().XYZ(),B);
573 if (Precision::IsNegativeInfinite(VMax)) {
574 gp_Dir D(Cos(A)*S.Axis().Direction());
577 else if (Precision::IsPositiveInfinite(VMax)) {
578 gp_Dir D(Cos(A)*S.Axis().Direction());
582 Compute(UMin,UMax,R+VMax*Sin(A),R+VMax*Sin(A),
583 S.XAxis().Direction().XYZ(),
584 S.YAxis().Direction().XYZ(),
586 VMax*Cos(A)*S.Axis().Direction().XYZ(),B);
594 void BndLib::Add( const gp_Cone& S,const Standard_Real VMin,
595 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
597 BndLib::Add(S,0.,2.*M_PI,VMin,VMax,Tol,B);
600 void BndLib::Add(const gp_Sphere& S,const Standard_Real UMin,
601 const Standard_Real UMax,const Standard_Real VMin,
602 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
616 if (-Fi1>Precision::Angular()) {
617 if (-Fi2>Precision::Angular()) {
618 Compute(UMin,UMax,S.Radius(),S.Radius(),
619 S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),
620 S.Location().XYZ(),B);
621 Compute(UMin,UMax,S.Radius(),S.Radius(),
622 S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),
623 S.Location().XYZ()- S.Radius()*S.Position().Axis().Direction().XYZ(),B);
626 Compute(UMin,UMax,S.Radius(),S.Radius(),
627 S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),
628 S.Location().XYZ()+ S.Radius()*S.Position().Axis().Direction().XYZ(),B);
629 Compute(UMin,UMax,S.Radius(),S.Radius(),
630 S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),
631 S.Location().XYZ()- S.Radius()*S.Position().Axis().Direction().XYZ(),B);
635 Compute(UMin,UMax,S.Radius(),S.Radius(),
636 S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),
637 S.Location().XYZ(),B);
638 Compute(UMin,UMax,S.Radius(),S.Radius(),
639 S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),
640 S.Location().XYZ() +S.Radius()*S.Position().Axis().Direction().XYZ(),B);
644 Standard_Real u,v,du,dv;
645 Standard_Integer iu,iv;
648 Standard_Real COSV[11];
649 Standard_Real SINV[11];
650 for(iv=0,v=VMin;iv<=10;iv++) {
655 for(u=UMin,iu=0; iu<=10 ; iu++) {
656 Standard_Real Radiuscosu=S.Radius()*cos(u);
657 Standard_Real Radiussinu=S.Radius()*sin(u);
658 for(v=VMin,iv=0; iv<=10 ; iv++) {
659 Standard_Real sinv=SINV[iv];
660 Standard_Real cosv=COSV[iv];
662 M.SetLinearForm (cosv*Radiuscosu, S.Position().XDirection().XYZ(),
663 cosv*Radiussinu, S.Position().YDirection().XYZ(),
664 S.Radius()*sinv, S.Position().Direction().XYZ() ,
665 S.Position().Location().XYZ() );
667 //-- cout<<"point p"<<++t<<" "<<M.X()<<" "<<M.Y()<<" "<<M.Z()<<endl;
674 Standard_Real Maxduv = Max(du,dv)*0.5;
675 Standard_Real Fleche = S.Radius() * (1 - cos(Maxduv));
681 void BndLib::Add( const gp_Sphere& S,const Standard_Real Tol, Bnd_Box& B) {
683 Standard_Real R = S.Radius();
684 gp_XYZ O = S.Location().XYZ();
685 gp_XYZ Xd = S.XAxis().Direction().XYZ();
686 gp_XYZ Yd = S.YAxis().Direction().XYZ();
687 gp_XYZ Zd = S.Position().Axis().Direction().XYZ();
688 B.Add(gp_Pnt(O -R*Xd -R*Yd+ R*Zd));
689 B.Add(gp_Pnt(O -R*Xd +R*Yd+ R*Zd));
690 B.Add(gp_Pnt(O +R*Xd -R*Yd+ R*Zd));
691 B.Add(gp_Pnt(O +R*Xd +R*Yd+ R*Zd));
692 B.Add(gp_Pnt(O +R*Xd -R*Yd- R*Zd));
693 B.Add(gp_Pnt(O -R*Xd -R*Yd- R*Zd));
694 B.Add(gp_Pnt(O +R*Xd +R*Yd- R*Zd));
695 B.Add(gp_Pnt(O -R*Xd +R*Yd- R*Zd));
699 void BndLib::Add(const gp_Torus& S,const Standard_Real UMin,
700 const Standard_Real UMax,const Standard_Real VMin,
701 const Standard_Real VMax,const Standard_Real Tol, Bnd_Box& B) {
703 Standard_Integer Fi1;
704 Standard_Integer Fi2;
706 Fi1 = (Standard_Integer )( VMax/(M_PI/4.));
707 Fi2 = (Standard_Integer )( VMin/(M_PI/4.));
710 Fi1 = (Standard_Integer )( VMin/(M_PI/4.));
711 Fi2 = (Standard_Integer )( VMax/(M_PI/4.));
715 Standard_Real Ra = S.MajorRadius();
716 Standard_Real Ri = S.MinorRadius();
721 #define addP0 (Compute(UMin,UMax,Ra+Ri,Ra+Ri,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ(),B))
722 #define addP1 (Compute(UMin,UMax,Ra+Ri*SC,Ra+Ri*SC,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ()+(Ri*SC)*S.Axis().Direction().XYZ(),B))
723 #define addP2 (Compute(UMin,UMax,Ra,Ra,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ()+Ri*S.Axis().Direction().XYZ(),B))
724 #define addP3 (Compute(UMin,UMax,Ra-Ri*SC,Ra-Ri*SC,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ()+(Ri*SC)*S.Axis().Direction().XYZ(),B))
725 #define addP4 (Compute(UMin,UMax,Ra-Ri,Ra-Ri,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ(),B))
726 #define addP5 (Compute(UMin,UMax,Ra-Ri*SC,Ra-Ri*SC,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ()-(Ri*SC)*S.Axis().Direction().XYZ(),B))
727 #define addP6 (Compute(UMin,UMax,Ra,Ra,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ()-Ri*S.Axis().Direction().XYZ(),B))
728 #define addP7 (Compute(UMin,UMax,Ra+Ri*SC,Ra+Ri*SC,S.XAxis().Direction().XYZ(),S.YAxis().Direction().XYZ(),S.Location().XYZ()-(Ri*SC)*S.Axis().Direction().XYZ(),B))
799 void BndLib::Add( const gp_Torus& S,const Standard_Real Tol, Bnd_Box& B) {
801 Standard_Real RMa = S.MajorRadius();
802 Standard_Real Rmi = S.MinorRadius();
803 gp_XYZ O = S.Location().XYZ();
804 gp_XYZ Xd = S.XAxis().Direction().XYZ();
805 gp_XYZ Yd = S.YAxis().Direction().XYZ();
806 gp_XYZ Zd = S.Axis().Direction().XYZ();
807 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd -(RMa+Rmi)*Yd+ Rmi*Zd));
808 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd -(RMa+Rmi)*Yd- Rmi*Zd));
809 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd -(RMa+Rmi)*Yd+ Rmi*Zd));
810 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd -(RMa+Rmi)*Yd- Rmi*Zd));
811 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd +(RMa+Rmi)*Yd+ Rmi*Zd));
812 B.Add(gp_Pnt(O -(RMa+Rmi)*Xd +(RMa+Rmi)*Yd- Rmi*Zd));
813 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd +(RMa+Rmi)*Yd+ Rmi*Zd));
814 B.Add(gp_Pnt(O +(RMa+Rmi)*Xd +(RMa+Rmi)*Yd- Rmi*Zd));