1 *
2 * \$Id\$
3 *
4 * \$Log\$
5 * Revision 1.1.1.1  1995/10/24 10:19:45  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.32  by  S.Giani
11 *-- Author :
12       SUBROUTINE CGVTEF(IFACE,XYZ,IVIS)
13 ************************************************************************
14 *                                                                      *
15 *     Name: CGVTEF                                                     *
16 *     Author: E. Chernyaev                       Date:    16.08.88     *
17 *                                                Revised:              *
18 *                                                                      *
19 *     Function: Test edge against face                                 *
20 *                                                                      *
21 *     References: CGHPLA, CGVTIN                                       *
22 *                                                                      *
23 *     Input: IFACE(*) - face                                           *
24 *            XYZ(3,*) - nodes coordinates                              *
25 *                                                                      *
26 *     Output: IVIS = -1 for unvisible edge                             *
27 *                                                                      *
28 *     Errors: none                                                     *
29 *                                                                      *
30 ************************************************************************
31 #include "geant321/cgdelt.inc"
32 #include "geant321/cgcedg.inc"
33 *SG
34       INTEGER   IFACE(*)
35 *SG
36       REAL      XYZ(3,*),ABCD(4)
37 *-
38       ERROR  = 2.*EESCR
39       IVIS   = 0
40       NEDGE  = IFACE(1)
41       JF     = 2
42       JT     = 0
43       TMIN   = 99999.
44       TMAX   =-99999.
45 *           C O M P U T E   A L L   I N T E R S E C T I O N   POINTS
46       DO 140 NE=1,NEDGE
47         N1     = IFACE(JF)
48         N2     = IFACE(JF+1)
49         JF     = JF + 2
50         TY1    = ABC(1,2)*XYZ(1,N1) + ABC(2,2)*XYZ(2,N1) + ABC(3,2)
51         TY2    = ABC(1,2)*XYZ(1,N2) + ABC(2,2)*XYZ(2,N2) + ABC(3,2)
52         IF (ABS(TY1) .LE. ERROR) TY1 = 0.
53         IF (ABS(TY2) .LE. ERROR) TY2 = 0.
54         IF (TY1*TY2) 110,120,140
55   110   TX1    = ABC(1,1)*XYZ(1,N1) + ABC(2,1)*XYZ(2,N1) + ABC(3,1)
56         TX2    = ABC(1,1)*XYZ(1,N2) + ABC(2,1)*XYZ(2,N2) + ABC(3,1)
57         T1     = (TX1*TY2-TX2*TY1) / (TY2-TY1)
58         T2     = 0.
59         GOTO 130
60   120   IF (TY2 .NE. 0.) GOTO 121
61         IF (TY1 .NE. 0.) GOTO 122
62         TTT(1,JT+1) = ABC(1,1)*XYZ(1,N1) + ABC(2,1)*XYZ(2,N1) + ABC(3,1)
63         TTT(2,JT+1) = 0
64         TTT(1,JT+2) = ABC(1,1)*XYZ(1,N2) + ABC(2,1)*XYZ(2,N2) + ABC(3,1)
65         TTT(2,JT+2) = 0
66         IF (TTT(1,JT+1) .LT. TMIN)  TMIN = TTT(1,JT+1)
67         IF (TTT(1,JT+1) .GT. TMAX)  TMAX = TTT(1,JT+1)
68         IF (TTT(1,JT+2) .LT. TMIN)  TMIN = TTT(1,JT+1)
69         IF (TTT(1,JT+2) .GT. TMAX)  TMAX = TTT(1,JT+1)
70         GOTO 140
71   121   T1     = ABC(1,1)*XYZ(1,N1) + ABC(2,1)*XYZ(2,N1) + ABC(3,1)
72         IF (TY2 .LT. 0.) T2=-1.
73         IF (TY2 .GT. 0.) T2= 1.
74         GOTO 130
75   122   T1     = ABC(1,1)*XYZ(1,N2) + ABC(2,1)*XYZ(2,N2) + ABC(3,1)
76         IF (TY1 .LT. 0.) T2=-1
77         IF (TY1 .GT. 0.) T2= 1
78         GOTO 130
79   130   JT     = JT + 1
80         TTT(1,JT)= T1
81         TTT(2,JT)= T2
82         IF (TTT(1,JT) .LT. TMIN)  TMIN = TTT(1,JT)
83         IF (TTT(1,JT) .GT. TMAX)  TMAX = TTT(1,JT)
84   140   CONTINUE
85 *           C H E C K   I F   F A C E   O U T   O F   E D G E
86       IF (JT .EQ. 0)                  GOTO 999
87       IF (TMIN.GE.1.-TDEL .OR. TMAX.LE.0.+TDEL) GOTO 999
88 *           C O M P U T E   F A C E   P L A N E
89 *           C H E C K   I F   E D G E   B E F O R E  P L A N E
90       CALL CGHPLA(IFACE,XYZ,ABCD)
91       DA    = ABCD(1)*AA(1)+ABCD(2)*AA(2)+ABCD(3)*AA(3)+ABCD(4)
92       DB    = ABCD(1)*BB(1)+ABCD(2)*BB(2)+ABCD(3)*BB(3)+ABCD(4)
93       IF (DA.GE.-2.*EESCR .AND. DB.GE.-2.*EESCR)      GOTO 999
94       IF (DA.LE.0. .AND. DB.LE.0.)              GOTO 150
95       T0    = DA/(DA-DB)
96       IF (DA.GE.0. .AND. TMAX.LE.T0+TDEL)       GOTO 999
97       IF (DB.GE.0. .AND. TMIN.GE.T0-TDEL)       GOTO 999
98 *          S O R T   I N T E R S E C T I O N   P O I N T S
99       IF (JT .EQ. 1)    GOTO 400
100   150 DO 300 I=1,JT-1
101         DO 200 J=I,1,-1
102           IF (TTT(1,J+1) .GE. TTT(1,J))   GOTO 300
103           T1         = TTT(1,J+1)
104           T2         = TTT(2,J+1)
105           TTT(1,J+1) = TTT(1,J)
106           TTT(2,J+1) = TTT(2,J)
107           TTT(1,J)   = T1
108           TTT(2,J)   = T2
109   200     CONTINUE
110   300   CONTINUE
111 *
112       DO 310 I=2,JT
113         IF (TTT(2,I-1) .EQ. -2.)      GOTO 310
114 *
115 ******* 02-FEB-1990  **** R.N.
116         IF(.0001.LT.ABS(TTT(1,I)-TTT(1,I-1)))GOTO 310
117 ******* 02-FEB-1990  **** R.N.
118 *
119         IF (TTT(1,I) .NE. TTT(1,I-1)) GOTO 310
120         IF (TTT(2,I) .EQ. TTT(2,I-1)) GOTO 305
121         IF (TTT(2,I) .EQ. 0.)         GOTO 305
122         IF (TTT(2,I-1) .EQ. 0.)       GOTO 305
123         TTT(2,I)   = -2
124         GOTO 310
125   305   TTT(2,I-1) = -2.
126         TTT(2,I)   = -2.
127   310   CONTINUE
128 *
129       J     = 0
130       DO 320 I=1,JT
131         IF (TTT(2,I) .EQ. -2.)        GOTO 320
132         J     = J + 1
133         TTT(1,J) = TTT(1,I)
134   320   CONTINUE
135       JT    = J
136       IF (JT .EQ. 0)                  GOTO 999
137 *
138   400 T1    = 0.
139       T2    = 1.
140       IF (DA .GT. 0.)           T1 = T0
141       IF (DB .GT. 0.)           T2 = T0
142       DO 500 I=1,JT,2
143         IF (TTT(1,I+1) .LE. T1)   GOTO 500
144         IF (TTT(1,I)   .GE. T2)   GOTO 999
145         TMIN = TTT(1,I)
146         TMAX = TTT(1,I+1)
147         IF (TMIN .LT. T1)       TMIN = T1
148         IF (TMAX .GT. T2)       TMAX = T2
149         IF (TMAX-TMIN.LE.TDEL)  GOTO 500
150         CALL CGVTIN(TMIN,TMAX,IVIS)
151         IF (IVIS .LT. 0)        GOTO 999
152   500   CONTINUE
153   999 RETURN
154       END