5 * Revision 1.1.1.1 1995/10/24 10:19:42 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.31 by S.Giani
12 SUBROUTINE CGBOOL(IFA,IFB,A,B,NMAX,C)
13 ************************************************************************
16 * Author: E. Chernyaev Date: 05.04.89 *
19 * Function: Make boolean operation with *
21 * References: CGMNMX,CGCOPY,CGINVE,CGBSEA,CGBSEC,CGBINT,CGBSUB *
23 * Input: A(*) - 1-st CG-object *
24 * B(*) - 2-nd CG-object *
25 * NMAX - max length C array *
27 * Output: C(*) - resulting CG-object *
31 ************************************************************************
32 #include "geant321/cggpar.inc"
33 #include "geant321/cgdelt.inc"
34 REAL A(*),B(*),C(*),AMN(3),AMX(3),BMN(3),BMX(3)
37 * T E S T P A R A M E T E R S C O R R E C T N E S S
38 CALL CGMNMX(A,AMN,AMX)
39 CALL CGMNMX(B,BMN,BMX)
40 IF (AMN(1) .GT. AMX(1)) GOTO 999
41 IF (BMN(1) .GT. BMX(1)) GOTO 999
42 IF (NMAX .LT. LCGHEA) GOTO 998
43 IF (A(KCGNF) .EQ. 0.) GOTO 110
44 IF (B(KCGNF) .EQ. 0.) GOTO 120
46 * O B J E C T "A" I S E M P T Y
47 110 IF (IFA.NE.0 .AND. IFB.EQ.0) GOTO 999
48 IF (IFA .EQ. 0) CALL CGCOPY(B,NMAX,C)
49 IF (IFB .NE. 0) CALL CGCOPY(A,NMAX,C)
50 IF (C(KCGSIZ) .LT. 0.) GOTO 998
52 * O B J E C T "B" I S E M P T Y
53 120 IF (IFB .EQ. 0) CALL CGCOPY(A,NMAX,C)
54 IF (IFB .NE. 0) CALL CGCOPY(B,NMAX,C)
55 IF (C(KCGSIZ) .LT. 0.) GOTO 998
58 ** M I N - M A X T E S T
61 IF (AMN(I) .GT. BMX(I)+EEWOR) GOTO 210
62 IF (AMX(I) .LT. BMN(I)-EEWOR) GOTO 210
66 ** N O I N T E R S E C T I O N O F S C O P E S
68 210 IF (IFA.NE.0 .AND. IFB.NE.0) GOTO 220
71 * IF (IFA.NE.0 .AND. IFB.EQ.0) GOTO 220
72 IF (IFA.NE.0 .AND. IFB.EQ.0) GOTO 230
74 IF (IFA.EQ.0 .AND. IFB.EQ.0) GOTO 240
75 * N O I N T E R S E C T I O N
76 220 C(KCGSIZ) = LCGHEA
80 * N O S U B T R A C T I O N
81 230 CALL CGCOPY(A,NMAX,C)
82 IF (C(KCGSIZ) .LT. 0.) GOTO 998
84 * S I M P L E S U M O F O B J E C T S
85 240 LTOTAL = A(KCGSIZ) + B(KCGSIZ) - LCGHEA
86 IF (LTOTAL .GT. NMAX) GOTO 998
87 J = A(KCGSIZ) - LCGHEA + 1
88 CALL CGCOPY(B,NMAX,C(J))
91 C(KCGNF) = A(KCGNF) + B(KCGNF)
94 ** F I N D I N T E R S E C T I O N O F F A C E S
95 ** W I T H T H E S A M E P L A N E
97 300 IF (IFA .NE. 0) CALL CGINVE(A)
98 IF (IFB .NE. 0) CALL CGINVE(B)
106 310 CALL CGBSEA(A(JA+1),B,NB,JB)
107 IF (NB .EQ. 0) GOTO 320
108 CALL CGBINT(A(JA+1),B(JB+1),NMAX-JC,C(JC+1),IREP)
109 IF (IREP .LT. 0) GOTO 997
110 IF (IREP .EQ. 0) GOTO 310
114 320 NEDGE = A(JA+KCGNE)
115 JA = JA + LCGFAC + NEDGE*LCGEDG
118 ** F I N D P A R T O F 1 - S T O B J E C T W H I C H
119 ** L I E O U T S I D E O F 2 - N D O B J E C T
125 CALL CGBSEC(A(J+1),B,BMN,BMX,NMAX-JCSAV,C(JCSAV+1),IREP)
126 IF (IREP .LT. 0) GOTO 997
128 CALL CGBSUB(IFB,A(J+1),C(JCSAV+1),NMAX-JC,C(JC+1),IREP)
129 IF (IREP .LT. 0) GOTO 997
131 IF (IREP .GT. 0) NC = NC + 1
133 J = J + LCGFAC + NEDGE*LCGEDG
136 ** F I N D P A R T O F 2 - N D O B J E C T W H I C H
137 ** L I E O U T S I D E O F 1 - S T O B J E C T
143 CALL CGBSEC(B(J+1),A,AMN,AMX,NMAX-JCSAV,C(JCSAV+1),IREP)
144 IF (IREP .LT. 0) GOTO 997
146 CALL CGBSUB(IFA,B(J+1),C(JCSAV+1),NMAX-JC,C(JC+1),IREP)
147 IF (IREP .LT. 0) GOTO 997
149 IF (IREP .GT. 0) NC = NC + 1
151 J = J + LCGFAC + NEDGE*LCGEDG
157 IF (IFA.NE.0 .OR. IFB.NE.0) CALL CGINVE(C)
159 997 IF (IFA .NE. 0) CALL CGINVE(A)
160 IF (IFB .NE. 0) CALL CGINVE(B)
161 IF (IREP .GE. 0) GOTO 999