5 * Revision 1.1.1.1 1995/10/24 10:20:24 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.27 by S.Giani
12 SUBROUTINE GDRAWS(ISHAPE,PAR)
14 C. ******************************************************************
16 C. * Draw the shape number ISHAPE, of parameters PAR *
18 C. * SHAPE SHAPE SHAPE *
19 C. * NUMBER TYPE PARAMETERS *
20 C. * -------------------------------------------------------------- *
23 C. * 2 TRD1 DX1,DX2,DY,DZ *
24 C. * 3 TRD2 DX1,DX2,DY1,DY2,DZ *
25 C. * 4 TRAP DZ,TX,TY,H1,BL1,TL1,TTH1,H2,BL2,TL2,TTH2 *
27 C. * 5 TUBE RMIN,RMAX,DZ *
28 C. * 6 TUBS RMIN,RMAX,DZ,PHIMIN,PHIMAX *
29 C. * 7 CONE DZ,RMIN1,RMAX1,RMIN2,RMAX2 *
30 C. * 8 CONS DZ,RMIN1,RMAX1,RMIN2,RMAX2,PHIMIN,PHIMAX *
32 C. * 9 SPHE RMIN,RMAX,THEMIN,THEMAX,PHIMIN,PHIMAX *
34 C. * 10 PARA DX,DY,DZ,TXY,TXZ,TYZ *
35 C. * 11 PGON PHIMIN,DPHI,NDIV,NZ,Z(1),RMIN(1),RMAX(1),...*
36 C. * 12 PCON PHIMIN,DPHI,NZ,Z(1),RMIN(1),RMAX(1),Z(2),...*
38 C. * 14 HYPE RMIN,RMAX,DZ,PHI *
39 C. * NSGTRA GTRA DZ,TH,PHI,TWIST,Y1,XL1,XH1,TH1,Y2,XL2,XH2,..*
40 C. * NSCTUB CTUB RMIN,RMAX,DZ,PHIMIN,PHIMAX,LXL,LYL,LZL,LXH,.*
42 C. * ==>Called by : GDRAW *
43 C. * Author : P.Zanarini ********* *
44 C. * Modification log. *
45 C. * 1-Jun-88 A.C.McPherson - Introduce cut tube shape. *
47 C. ******************************************************************
49 #include "geant321/gcdraw.inc"
50 #include "geant321/gconsp.inc"
51 #include "geant321/gcshno.inc"
53 PARAMETER ( NLPC = 40 )
55 * The constant NLPC defined in the parameter statement
56 * is the number of line elements to form a complete
57 * circle in the surface definitions for a cut tube.
59 DIMENSION CPHIS(NLPC+1),SPHIS(NLPC+1)
61 DIMENSION X(3,46), U(46), V(46)
62 DIMENSION PAR(50),P(3,8),PP(3,8)
64 C. ------------------------------------------------------------------
66 IF (ISHAPE.NE.1) GO TO 200
77 200 IF (ISHAPE.NE.2) GO TO 300
88 300 IF (ISHAPE.NE.3) GO TO 400
99 400 IF (ISHAPE.NE.4) GO TO 500
116 500 IF (ISHAPE.NE.5) GO TO 600
128 600 IF (ISHAPE.NE.6) GO TO 700
142 700 IF (ISHAPE.NE.7) GO TO 800
154 800 IF (ISHAPE.NE.8) GO TO 900
168 900 IF (ISHAPE.NE.9) GO TO 910
178 910 IF (ISHAPE.NE.10) GO TO 911
201 911 IF (ISHAPE.NE.11) GO TO 912
209 DPHI=(PHIMAX-PHIMIN)/NDIV
211 C Z(1)=PAR(5) - RMIN(1)=PAR(6) - RMAX(1)=PAR(7) - Z(2)=PAR(8) - ...
215 912 IF (ISHAPE.NE.12) GO TO 950
223 C Z(1)=PAR(4) - RMIN(1)=PAR(5) - RMAX(1)=PAR(6) - Z(2)=PAR(7) - ...
229 IF (ISHAPE.NE.13) GO TO 951
240 IF (ISHAPE.NE.14) GO TO 955
247 TANTHS = (TAN(PAR(4)*DEGRAD))**2
250 RMIN2 = SQRT(RMIN12 + Z2*Z2*TANTHS)
251 RMAX2 = SQRT(RMAX12 + Z2*Z2*TANTHS)
256 IF(ISHAPE.NE.28) GO TO 980
258 C General twisted trapezoid.
263 P(1,IL)=PAR(I0)+PAR(I0+2)*P(3,IL)
264 P(2,IL)=PAR(I0+1)+PAR(I0+3)*P(3,IL)
266 P(1,IL+4)=PAR(I0)+PAR(I0+2)*P(3,IL+4)
267 P(2,IL+4)=PAR(I0+1)+PAR(I0+3)*P(3,IL+4)
273 IF( ISHAPE .EQ. NSCTUB ) THEN
275 DPHIS = PAR(5)-PAR(4)
276 IF( DPHIS .LE. 0.0 ) DPHIS=DPHIS+TWOPI
277 NL = MAX(DPHIS*NLPC/360.0,1.)
280 IF( PAR(4) .EQ. 0.0 .AND. PAR(5) .EQ. 360.0 ) THEN
295 C Rectilinear shapes: BOX,TRD1,TRD2
304 C Calculate the 8 vertex for rectilinear shapes
331 CALL GDRECT(P(1,1),P(1,2),P(1,3),P(1,4))
332 CALL GDRECT(P(1,5),P(1,6),P(1,7),P(1,8))
333 CALL GDLINE(P(1,1),P(1,5))
334 CALL GDLINE(P(1,2),P(1,6))
335 CALL GDLINE(P(1,3),P(1,7))
336 CALL GDLINE(P(1,4),P(1,8))
344 C Calculate the 8 vertex
346 P(1,1)=-DZ*TX+TTH1*H1+TL1
349 P(1,2)=-DZ*TX+TTH1*H1-TL1
352 P(1,3)=-DZ*TX-TTH1*H1-BL1
355 P(1,4)=-DZ*TX-TTH1*H1+BL1
358 P(1,5)=+DZ*TX+TTH2*H2+TL2
361 P(1,6)=+DZ*TX+TTH2*H2-TL2
364 P(1,7)=+DZ*TX-TTH2*H2-BL2
367 P(1,8)=+DZ*TX-TTH2*H2+BL2
373 CALL GDRECT(P(1,1),P(1,2),P(1,3),P(1,4))
374 CALL GDRECT(P(1,5),P(1,6),P(1,7),P(1,8))
375 CALL GDLINE(P(1,1),P(1,5))
376 CALL GDLINE(P(1,2),P(1,6))
377 CALL GDLINE(P(1,3),P(1,7))
378 CALL GDLINE(P(1,4),P(1,8))
380 C Condition for plane sides are :
386 C H2*(BL1-TL1)=H1(BL2-TL2)
388 C In that case we should draw on each side 10 lines
389 C (perpendicular to side lines) to make an easy
390 C visualisation that sides are not planes
396 C Cylindric shapes: TUBE,CONE
398 CALL GDCIRC(RMAX1,Z1)
399 CALL GDCIRC(RMIN1,Z1)
400 CALL GDCIRC(RMAX2,Z2)
401 CALL GDCIRC(RMIN2,Z2)
404 CALL GDLCYL(RMIN1,PHIP,Z1,RMIN2,PHIP,Z2)
405 CALL GDLCYL(RMIN1,PHIM,Z1,RMIN2,PHIM,Z2)
406 CALL GDLCYL(RMAX1,PHIP,Z1,RMAX2,PHIP,Z2)
407 CALL GDLCYL(RMAX1,PHIM,Z1,RMAX2,PHIM,Z2)
413 C Segmented cylindric shapes: TUBS,CONS
415 CALL GDARC(RMAX1,Z1,PHIMIN,PHIMAX)
416 CALL GDARC(RMIN1,Z1,PHIMIN,PHIMAX)
417 CALL GDARC(RMAX2,Z2,PHIMIN,PHIMAX)
418 CALL GDARC(RMIN2,Z2,PHIMIN,PHIMAX)
419 PHIP=AMOD((GPHI+90.),360.)
420 PHIM=AMOD((GPHI+270.),360.)
421 IF (PHIP.LE.PHIMIN.OR.PHIP.GE.PHIMAX) GO TO 2510
422 CALL GDLCYL(RMIN1,PHIP,Z1,RMIN2,PHIP,Z2)
423 CALL GDLCYL(RMAX1,PHIP,Z1,RMAX2,PHIP,Z2)
424 2510 IF (PHIM.LE.PHIMIN.OR.PHIM.GE.PHIMAX) GO TO 2520
425 CALL GDLCYL(RMIN1,PHIM,Z1,RMIN2,PHIM,Z2)
426 CALL GDLCYL(RMAX1,PHIM,Z1,RMAX2,PHIM,Z2)
427 2520 CALL GDLCYL(RMAX1,PHIMIN,Z1,RMAX2,PHIMIN,Z2)
428 CALL GDLCYL(RMAX1,PHIMAX,Z1,RMAX2,PHIMAX,Z2)
429 CALL GDLCYL(RMIN1,PHIMIN,Z1,RMIN2,PHIMIN,Z2)
430 CALL GDLCYL(RMIN1,PHIMAX,Z1,RMIN2,PHIMAX,Z2)
431 CALL GDLCYL(RMAX1,PHIMIN,Z1,RMIN1,PHIMIN,Z1)
432 CALL GDLCYL(RMAX2,PHIMIN,Z2,RMIN2,PHIMIN,Z2)
433 CALL GDLCYL(RMAX1,PHIMAX,Z1,RMIN1,PHIMAX,Z1)
434 CALL GDLCYL(RMAX2,PHIMAX,Z2,RMIN2,PHIMAX,Z2)
442 CALL GDARC(RMAX,0.,PHMI,PHMA)
443 CALL GDARC(RMIN,0.,PHMI,PHMA)
445 IF(DP.LE.0.) DP=DP+360.
446 NSTEP = MAX(DP/15.,1.)
456 X(1,J) = RMAX*SIN(THET)*COSPH
457 X(2,J) = RMAX*SIN(THET)*SINPH
458 X(3,J) = RMAX*COS(THET)
460 CALL GDFR3D(X,46,U,V)
472 X(1,J) = RMIN*SIN(THET)*COSPH
473 X(2,J) = RMIN*SIN(THET)*SINPH
474 X(3,J) = RMIN*COS(THET)
476 CALL GDFR3D(X,46,U,V)
490 CALL GDLINE(P(1,1),P(1,2))
491 CALL GDLINE(P(1,3),P(1,4))
492 CALL GDLINE(P(1,5),P(1,6))
494 P(1,1) = RMIN*COS(PHMI*DEGRAD)
495 P(2,1) = RMIN*SIN(PHMI*DEGRAD)
496 P(1,2) = RMAX*COS(PHMI*DEGRAD)
497 P(2,2) = RMAX*SIN(PHMI*DEGRAD)
498 CALL GDLINE(P(1,1),P(1,2))
499 P(1,1) = RMIN*COS(PHMA*DEGRAD)
500 P(2,1) = RMIN*SIN(PHMA*DEGRAD)
501 P(1,2) = RMAX*COS(PHMA*DEGRAD)
502 P(2,2) = RMAX*SIN(PHMA*DEGRAD)
503 CALL GDLINE(P(1,1),P(1,2))
506 CALL GDLINE(P(1,3),P(1,4))
509 CALL GDLINE(P(1,3),P(1,4))
517 FACT=1./COS(DEGRAD*DPHI/2.)
519 PAR(6+(IZ-1)*3)=PAR(6+(IZ-1)*3)*FACT
520 PAR(7+(IZ-1)*3)=PAR(7+(IZ-1)*3)*FACT
529 IF (IZ.EQ.1.OR.IZ.EQ.NZ) GO TO 4003
530 R0PRE=PAR(6+(IZ-2)*3)
532 IF (R0.EQ.R0PRE)GO TO 4006
533 IF (R0.EQ.R0POST)GO TO 4006
536 PHI0=PHIMIN+(IDIV-1)*DPHI
538 CALL GDLCYL(R0,PHI0,ZI,R0,PHI1,ZI)
541 4006 IF (IZ.EQ.1.OR.IZ.EQ.NZ) GO TO 4008
542 R1PRE=PAR(7+(IZ-2)*3)
544 IF (R1.EQ.R1PRE )GO TO 4020
545 IF (R1.EQ.R1POST)GO TO 4020
548 PHI0=PHIMIN+(IDIV-1)*DPHI
550 CALL GDLCYL(R1,PHI0,ZI,R1,PHI1,ZI)
553 4020 IF ((IZ.EQ.1.OR.IZ.EQ.NZ).AND.(PHIMAX-PHIMIN.NE.360.)) THEN
554 CALL GDLCYL(R0,PHIMIN,ZI,R1,PHIMIN,ZI)
555 CALL GDLCYL(R0,PHIMAX,ZI,R1,PHIMAX,ZI)
558 IF (IZ.EQ.1) GO TO 4050
564 PH=PHIMIN+(IDIV-1)*DPHI
565 CALL GDLCYL(R00,PH,ZI0,R0,PH,ZI)
566 CALL GDLCYL(R10,PH,ZI0,R1,PH,ZI)
568 CALL GDLCYL(R00,PHIMAX,ZI0,R0,PHIMAX,ZI)
569 CALL GDLCYL(R10,PHIMAX,ZI0,R1,PHIMAX,ZI)
583 IF (IZ.EQ.1.OR.IZ.EQ.NZ) GO TO 5010
584 R1PRE=PAR(6+(IZ-2)*3)
586 IF (R1.LE.R1PRE.OR.R1.LE.R1POST) GO TO 5015
588 CALL GDARC(R0,ZI,PHIMIN,PHIMAX)
589 CALL GDARC(R1,ZI,PHIMIN,PHIMAX)
591 IF ((PHIMAX-PHIMIN).EQ.360.) GO TO 5020
592 CALL GDLCYL(R0,PHIMIN,ZI,R1,PHIMIN,ZI)
593 CALL GDLCYL(R0,PHIMAX,ZI,R1,PHIMAX,ZI)
595 IF (IZ.EQ.1) GO TO 5555
599 IF ((PHIMAX-PHIMIN).EQ.360.) GO TO 5030
600 CALL GDLCYL(R00,PHIMIN,ZI0,R0,PHIMIN,ZI)
601 CALL GDLCYL(R10,PHIMIN,ZI0,R1,PHIMIN,ZI)
602 CALL GDLCYL(R00,PHIMAX,ZI0,R0,PHIMAX,ZI)
603 CALL GDLCYL(R10,PHIMAX,ZI0,R1,PHIMAX,ZI)
606 PHIP=AMOD((GPHI+90.),360.)
607 PHIM=AMOD((GPHI+270.),360.)
608 IF (PHIP.LT.PHIMIN.OR.PHIP.GT.PHIMAX) GO TO 5510
609 CALL GDLCYL(R00,PHIP,ZI0,R0,PHIP,ZI)
610 CALL GDLCYL(R10,PHIP,ZI0,R1,PHIP,ZI)
611 5510 IF (PHIM.LT.PHIMIN.OR.PHIM.GT.PHIMAX) GO TO 5555
612 CALL GDLCYL(R00,PHIM,ZI0,R0,PHIM,ZI)
613 CALL GDLCYL(R10,PHIM,ZI0,R1,PHIM,ZI)
622 CPHIS(1) = COS( PHIS*DEGRAD )
623 SPHIS(1) = SIN( PHIS*DEGRAD )
626 CPHIS(I+1) = COS( PHIS*DEGRAD )
627 SPHIS(I+1) = SIN( PHIS*DEGRAD )
629 P( 1, 1) = PAR(2)*CPHIS(1)
630 P( 2, 1) = PAR(2)*SPHIS(1)
631 P( 3, 1) = -( PAR( 6)*P( 1, 1) +PAR( 7)*P( 2, 1) )/PAR( 8)
633 P( 1, 4) = PAR(1)*CPHIS(1)
634 P( 2, 4) = PAR(1)*SPHIS(1)
635 P( 3, 4) = -( PAR( 6)*P( 1, 4) +PAR( 7)*P( 2, 4) )/PAR( 8)
637 P( 1, 5) = PAR(2)*CPHIS(1)
638 P( 2, 5) = PAR(2)*SPHIS(1)
639 P( 3, 5) = -( PAR( 9)*P( 1, 5) +PAR( 10)*P( 2, 5) )/PAR( 11)
641 P( 1, 8) = PAR(1)*CPHIS(1)
642 P( 2, 8) = PAR(1)*SPHIS(1)
643 P( 3, 8) = -( PAR( 9)*P( 1, 8) +PAR( 10)*P( 2, 8) )/PAR( 11)
646 IF( ISEG .EQ. 1 ) THEN
647 CALL GDRECT( P( 1, 1), P( 1, 4), P( 1, 8), P( 1, 5) )
651 P( 1, 2) = PAR(2)*CPHIS(I+1)
652 P( 2, 2) = PAR(2)*SPHIS(I+1)
653 P( 3, 2) = -( PAR( 6)*P( 1, 2) +PAR( 7)*P( 2, 2) )/PAR( 8)
655 CALL GDLINE( P( 1, 1), P( 1, 2) )
662 P( 1, 3) = PAR(1)*CPHIS(I+1)
663 P( 2, 3) = PAR(1)*SPHIS(I+1)
664 P( 3, 3) = -( PAR( 6)*P( 1, 3) +PAR( 7)*P( 2, 3) )/PAR( 8)
666 CALL GDLINE( P( 1, 4), P( 1, 3) )
673 P( 1, 6) = PAR(2)*CPHIS(I+1)
674 P( 2, 6) = PAR(2)*SPHIS(I+1)
675 P( 3, 6) = -( PAR( 9)*P( 1, 6) +PAR( 10)*P( 2, 6) )/PAR( 11)
677 CALL GDLINE( P( 1, 5), P( 1, 6) )
684 P( 1, 7) = PAR(1)*CPHIS(I+1)
685 P( 2, 7) = PAR(1)*SPHIS(I+1)
686 P( 3, 7) = -( PAR( 9)*P( 1, 7) +PAR( 10)*P( 2, 7) )/PAR( 11)
688 CALL GDLINE( P( 1, 8), P( 1, 7) )
694 IF( ISEG .EQ. 1 ) THEN
695 CALL GDRECT( P( 1, 1), P( 1, 4), P( 1, 8), P( 1, 5) )
698 PHIP = AMOD( GPHI+90.0, 360.0 )
699 PHIM = AMOD( GPHI+270.0, 360.0 )
702 IF( DPHIP .LT. 0.0 ) DPHIP = DPHIP+TWOPI
703 IF( DPHIM .LT. 0.0 ) DPHIM = DPHIM+TWOPI
705 IF( DPHIP .LE. DPHIS ) THEN
706 CP = COS( PHIP*DEGRAD )
707 SP = SIN( PHIP*DEGRAD )
710 P( 3, 1) = -( PAR( 6)*P( 1, 1) +PAR( 7)*P( 2, 1) )/PAR( 8)
714 P( 3, 4) = -( PAR( 6)*P( 1, 4) +PAR( 7)*P( 2, 4) )/PAR( 8)
718 P( 3, 5) = -( PAR( 9)*P( 1, 5) +PAR( 10)*P( 2, 5) )/PAR( 11)
722 P( 3, 8) = -( PAR( 9)*P( 1, 8) +PAR( 10)*P( 2, 8) )/PAR( 11)
724 CALL GDLINE( P( 1, 1), P( 1, 5) )
725 CALL GDLINE( P( 1, 4), P( 1, 8) )
729 IF( DPHIM .LE. DPHIS ) THEN
730 CP = COS( PHIM*DEGRAD )
731 SP = SIN( PHIM*DEGRAD )
734 P( 3, 1) = -( PAR( 6)*P( 1, 1) +PAR( 7)*P( 2, 1) )/PAR( 8)
738 P( 3, 4) = -( PAR( 6)*P( 1, 4) +PAR( 7)*P( 2, 4) )/PAR( 8)
742 P( 3, 5) = -( PAR( 9)*P( 1, 5) +PAR( 10)*P( 2, 5) )/PAR( 11)
746 P( 3, 8) = -( PAR( 9)*P( 1, 8) +PAR( 10)*P( 2, 8) )/PAR( 11)
748 CALL GDLINE( P( 1, 1), P( 1, 5) )
749 CALL GDLINE( P( 1, 4), P( 1, 8) )
772 CALL GDLINE(P(1,1),P(1,2))
773 CALL GDLINE(P(1,3),P(1,4))
785 CALL GDCIRC(RMAX2,Z1)
786 CALL GDCIRC(RMIN2,Z1)
787 CALL GDCIRC(RMAX2,Z2)
788 CALL GDCIRC(RMIN2,Z2)
791 DO 7440 IZ = 1, NZSTEP
796 PP(2,2) = SQRT(RMAX12 + ZZZ)
797 PP(2,4) = SQRT(RMIN12 + ZZZ)
798 DO 7430 ISY = -1, +1, 2
799 DO 7430 ISZ = -1, +1, 2
801 P(2,J) = ISY * PP(2,J)
802 P(3,J) = ISZ * PP(3,J)
804 CALL GDLINE(P(1,1),P(1,2))
805 CALL GDLINE(P(1,3),P(1,4))