5 * Revision 1.1.1.1 1995/10/24 10:20:50 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.29 by S.Giani
12 SUBROUTINE GINPGO(X,P,IYES)
14 C. ******************************************************************
16 C. * ROUTINE TO PERFORM GINME FUNCTION FOR A POLYGON. *
17 C. * X - A VECTOR DIMENSION 3 GIVING THE POINT. *
18 C. * P - THE VECTOR OF PARAMETERS, (1) = PHIMIN, *
19 C. * (2) = DPHI, (3) = NDIV, (4) = NZ, (5) = Z(1) *
20 C. * (6) = RMIN(1), (7) = RMAX(1), (8) = Z(2), *
21 C. * (9) = RMIN(2), (10) = RMAX(2), ETC. *
22 C. * RMIN IS THE DISTANCE FROM THE ORIGIN TO THE *
23 C. * INSIDE EDGE PROJECTED ALONG THE CENTRE LINE *
24 C. * OF THE DIVISION. RMAX IS THE CORRESPONDING *
25 C. * PROJECTED DISTANCE FOR THE OUTER EDGE. *
26 C. * IYES - RETURNED AS 1 IF POINT IS INSIDE, OTHERWISE 0. *
28 C. * ==>Called by : GINME *
29 C. * Author A.McPherson ********* *
31 C. ******************************************************************
33 #include "geant321/gconsp.inc"
34 #include "geant321/gcpoly.inc"
35 #if !defined(CERNLIB_SINGLE)
36 DOUBLE PRECISION XX1,XX2,PHI,DELPHI,PH0,R,DZRAT,DIVPHI
37 DOUBLE PRECISION RMN,RMX,HNDIV
41 C. ---------------------------------
45 C FIRST CHECK TOTAL Z RANGE.
48 IF(X(3).LT.P(5).OR.X(3).GT.P(NZ*3+2)) GO TO 999
50 C Find smallest RMIN and largest RMAX
56 IF(P(IP).LT.RMIN)RMIN=P(IP)
57 IF(P(IP+1).GT.RMAX) RMAX=P(IP+1)
60 * *** Check R against RMIN
64 R = SQRT(XX1**2+XX2**2)
65 IF(R.LT.RMIN)GO TO 999
70 * *** Find the radius of the outscribed circle
72 RMAX = RMAX/COS(0.5*DIVPHI*DEGRAD)
74 * *** Check R against RMAX
76 IF(R.GT.RMAX)GO TO 999
78 C If R sufficiently small ignore phi structure.
82 IF(R.LT.1.0E-5) GO TO 20
86 PHI=ATAN2(XX2,XX1)*RADDEG
87 IF(PHI.LT.P(1)) PHI=PHI+360.0
88 IF(PHI.LT.P(1).OR.PHI-P(1).GT.P(2)) GO TO 999
90 C NOW FIND PHI DIVISION.
92 IPSEC=MIN((PHI-P(1))/DIVPHI+1.,HNDIV)
94 PH0=(P(1)+DIVPHI*(IPSEC-0.5))*DEGRAD
96 C NOW CHECK PROJECTED DISTANCE. FIRST COMPUTE IT.
98 R=XX1*COS(PH0)+XX2*SIN(PH0)
102 C NOW FIND WHICH Z SECTION THE POINT IS IN.
109 30 IF(IZH-IZL.GT.1) THEN
113 IF(X(3).LE.P(IPT)) THEN
126 C THE POINT IS IN THE SECTION BOUNDED BY THE IZL TH AND THE
129 C NOW COMPUTE RMIN AND RMAX AND TEST THE VALUE OF R .
133 DZRAT=DZRAT/(P(IPH)-P(IPL))
134 RMN=P(IPL+1)+DZRAT*(P(IPH+1)-P(IPL+1))
136 * *** Is the point inside the 'hole' at the centre of the volume?
138 IF(R.LT.RMN) GO TO 999
140 RMX=P(IPL+2)+DZRAT*(P(IPH+2)-P(IPL+2))
142 * *** Is the point outside the volume?
144 IF(R.GT.RMX) GO TO 999
146 C POINT IS IN POLYGON.