]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 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 |