C ********************************************************************** C C CCONECT.FOR -- CREATED OCT 90 C ********************************************************************** C * AUTHOR: ArDean Leith C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C C CCONECT(NSAM,NROW,LUNOUT,SLICE1,SLICE2,LASTSLI, C IEQUIV,NEQUIV,NEQMAX,LASTCLUS,MAXTAB,IRTFLG) C C PURPOSE: DETERMINES 3-D CONNECTIVITY USING 2 SLICES AT A TIME C C PARAMETERS: C C CALLED BY: CONINT C C CALLS: C C23456789012345678901234567890123456789012345678901234567890123456789012 C--******************************************************************** SUBROUTINE CCONECT(NSAM,NROW,LUNOUT,SLICE1,SLICE2,LASTSLI, & IEQUIV,NEQUIV,NEQMAX,LASTCLUS,MAXTAB,IRTFLG) COMMON /UNITS/LUN,NIN,NOUT,NECHO,IFOUND,NPROC,NDAT INTEGER * 2 SLICE1(*),SLICE2(*) DIMENSION IEQUIV(2,NEQMAX) LOGICAL INCLUS,LASTSLI IRTFLG = 0 INCLUS = .FALSE. DO IROW = 1, NROW IPTR0 = (IROW-1) * NSAM DO ICOL = 1, NSAM IPTR1 = IPTR0 + ICOL NOW = SLICE1(IPTR1) IF (NOW .EQ. 0) THEN C EMPTY VOXEL INCLUS = .FALSE. ELSEIF (NOW .GT. 0) THEN C HAVE ALREADY VISITED THIS VOXEL FROM LAST ROW OR SLICE IF (.NOT. INCLUS) THEN C PREVIOUSLY IN BACKGROUND REGION ON THIS ROW NCLUS = NOW INCLUS = .TRUE. LASCON = 0 ELSEIF (INCLUS .AND. NOW .NE. NCLUS .AND. & NOW .NE. LASCON) THEN C Y SHAPED CLUSTER BRANCH FROM PREVIOUS SLICE CALL GOTBRANCH(NCLUS,NOW,IEQUIV,NEQUIV,NEQMAX,IRTFLG) IF (IRTFLG .NE. 0) RETURN ENDIF SLICE1(IPTR1) = NCLUS ELSEIF (NOW .LT. 0) THEN C VOXEL OCCUPIED AND NOT VISITED YET IF (.NOT. INCLUS) THEN C PREVIOUSLY IN A BACKGROUND AREA ON THIS LINE NCLUS = LASTCLUS + 1 LASTCLUS = NCLUS IF (LASTCLUS .GT. MAXTAB) THEN C OVERFLOW FOR LOOK-UP-TABLE WRITE(NOUT,*) '*** TABLE LIMIT:',MAXTAB IRTFLG = 1 RETURN ENDIF LASCON = 0 INCLUS = .TRUE. ENDIF C OCCUPY THE VOXEL WITH THE CLUSTER NUMBER SLICE1(IPTR1) = NCLUS ENDIF IF (INCLUS) THEN C HAVE AN OCCUPIED VOXEL ON THIS ROW IF (IROW .LT. NROW) THEN C CHECK THE NEXT ROW DOWN FROM THIS OCCUPIED VOXEL IPTR2 = IPTR1 + NSAM NOW2 = SLICE1(IPTR2) IF (NOW2 .NE. 0) THEN C VOXEL ON NEXT ROW DOWN IS ALSO IN THIS CLUSTER IF (NOW2 .GT. 0 .AND. NOW2 .NE. NCLUS) THEN C HAVE A VISITED VOXEL FROM A BRANCH CONNECTION CALL GOTBRANCH(NCLUS,NOW2,IEQUIV,NEQUIV, & NEQMAX,IRTFLG) IF (IRTFLG .NE. 0) RETURN ENDIF C OCCUPY THE VOXEL ON THIS SECOND ROW SLICE1(IPTR2) = NCLUS IF (ICOL .GT. 1) THEN C GO BACKWARDS ALONG SECOND ROW OCCUPYING THIS CLUSTER DO IPTRB = IPTR2-1,IPTR0+NSAM+1,-1 NOWB = SLICE1(IPTRB) IF (NOWB .LT. 0) THEN C THIS IS A CLUSTER VOXEL SLICE1(IPTRB) = NCLUS ELSE C END OF CLUSTER ON SECOND ROW LEFT GOTO 12 ENDIF ENDDO c10 CONTINUE ENDIF ENDIF 12 CONTINUE ENDIF IF (.NOT. LASTSLI) THEN NOWD = SLICE2(IPTR1) IF (NOWD .LT. 0) THEN C UNVISITED VOXEL FROM THIS CLUSTER ON NEXT SLICE DOWN SLICE2(IPTR1) = NCLUS IF (ICOL .GT. 1) THEN C GO BACKWARDS ALONG 2ND SLICE ROW OCCUPYING THIS CLUSTER DO IPTRDB = IPTR1-1,IPTR0+1,-1 NOWDB = SLICE2(IPTRDB) IF (NOWDB .LT. 0) THEN C THIS IS A CLUSTER VOXEL SLICE2(IPTRDB) = NCLUS ELSE C END OF CLUSTER ON THIS ROW OF SECOND SLICE GOTO 32 ENDIF END DO 32 CONTINUE ENDIF ENDIF ENDIF ENDIF 21 CONTINUE ENDDO ENDDO END