C++********************************************************************* C C REFORM.F CREATED JAN 91 C Y BUG NOV 2003 ArDean Leith C ********************************************************************** 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 REFORMLUNIN,LUNOUT,NSAM,NSAM1,NSAM2,NSAMS, C NROW,NROW1,NROW2,NROWS,NSLICE,NSLICE1,NSLICE2,NSLICES, C AXIS,IANG,IRTFLG) C C PURPOSE: REFORM AN IMAGE STAGE BY ROTATION OF 90, 180 OR 270 C DEGREES AROUND THE X,Y, OR Z AXIS. CENTER OF ROTATION C IS ALWAYS CENTER OF THE RELEVANT SLICE C ROTATIONS ARE CLOCKWISE WHEN LOOKING ALONG AXES. THE C X AXIS + TO RIGHT, Y AXIS + UP THE SCREEN, Z AXIS + OUT C OF THE SCREEN! C C PARAMETERS: C C C23456789012345678901234567890123456789012345678901234567890123456789012 C*********************************************************************** SUBROUTINE REFORM(LUNIN,LUNOUT,NSAM,NSAM1,NSAM2,NSAMS, & NROW,NROW1,NROW2,NROWS,NSLICE,NSLICE1,NSLICE2,NSLICES, & AXIS,IANG,IRTFLG) INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON /IOBUF/ BUF(NBUFSIZ) COMMON BUF2(1) CHARACTER * 1 AXIS IF (AXIS .EQ. 'Z') THEN C ROTATE AROUND Z AXIS IF (IANG .EQ. 90 .OR. IANG .EQ. 270) THEN C ROTATE 90 OR -90 AROUND Z AXIS IT5 = NSAMS * (NROWS + NSAM1 - 1) DO ISLICE1 = NSLICE1, NSLICE2 ISLICE2 = ISLICE1 - NSLICE1 + 1 DO IROW1 = NROW1,NROW2 IREC1 = (ISLICE1 - 1) * NROW + IROW1 CALL REDLIN(LUNIN,BUF,NSAM,IREC1) IF (IANG .EQ. 270) THEN ISAM2 = NSAMS - (IROW1 - NROW1) IT = ISAM2 - (NSAM1 * NSAMS) ELSE ISAM2 = IROW1 - NROW1 + 1 IT3 = IT5 + ISAM2 ENDIF DO ISAM1 = NSAM1,NSAM2 IF (IANG .EQ. 270) THEN C IROW2 = ISAM1 - NSAM1 + 1 C IPT = (IROW2 - 1) * NSAMS + ISAM2 C IPT = (ISAM1 - NSAM1) * NSAMS + ISAM2 C IPT = ISAM1 * NSAMS - NSAM1 * NSAMS + ISAM2 IPT = ISAM1 * NSAMS + IT ELSE C IROW2 = NROWS - (ISAM1 - NSAM1) C IPT = (IROW2 - 1) * NSAMS + ISAM2 C IPT = (NROWS - ISAM1 + NSAM1 - 1) * NSAMS + ISAM2 C IPT = (NROWS + NSAM1 - ISAM1 - 1) * NSAMS + ISAM2 C IPT = NROWS*NSAMS + NSAM1*NSAMS - ISAM1*NSAMS - NSAMS + C ISAM2 C IT3 = NROWS*NSAMS + NSAM1*NSAMS - NSAMS + ISAM2 C IT5 = NSAMS * (NROWS + NSAM1 - 1) C IT3 = IT5 + ISAM2 IPT = IT3 - ISAM1 * NSAMS ENDIF BUF2(IPT) = BUF(ISAM1) ENDDO ENDDO C OUTPUT THE REFORMED SLICE DO IROW2 = 1,NROWS IPT = (IROW2 - 1) * NSAMS + 1 IREC2 = (ISLICE2 - 1) * NROWS + IROW2 CALL WRTLIN(LUNOUT,BUF2(IPT),NSAMS,IREC2) ENDDO ENDDO ELSEIF (IANG .EQ. 180) THEN C ROTATE 180 DEGREES AROUND Z AXIS IT7 = NSAMS + NSAM1 DO ISLICE1 = NSLICE1,NSLICE2 ISLICE2 = ISLICE1 - NSLICE1 + 1 DO IROW1 = NROW1,NROW2 IREC1 = (ISLICE1 -1) * NROW + IROW1 IROW2 = NROWS - (IROW1 - NROW1) IREC2 = (ISLICE2 -1) * NROWS + IROW2 CALL REDLIN(LUNIN,BUF,NSAM,IREC1) C INVERT THE ROW DO ISAM1 = NSAM1,NSAM2 C* ISAM2 = NSAMS - (ISAM1 - NSAM1) C* ISAM2 = NSAMS - ISAM1 + NSAM1 C* IT7 = NSAMS + NSAM1 C* ISAM2 = IT7 - ISAM1 C* BUF2(ISAM2) = BUF(ISAM1) BUF2(IT7 - ISAM1) = BUF(ISAM1) ENDDO CALL WRTLIN(LUNOUT,BUF2,NSAMS,IREC2) ENDDO ENDDO ENDIF ELSEIF (AXIS .EQ. 'X') THEN DO ISLICE1 = NSLICE1,NSLICE2 DO IROW1 = NROW1,NROW2 IREC1 = (ISLICE1-1) * NROW + IROW1 CALL REDLIN(LUNIN,BUF,NSAM,IREC1) IF (IANG .EQ. 90) THEN ISLICE2 = IROW1 - NROW1 + 1 IROW2 = NROWS - (ISLICE1 - NSLICE1) ELSEIF (IANG .EQ. 180) THEN ISLICE2 = NSLICES - (ISLICE1 - NSLICE1) IROW2 = NROWS - (IROW1 - NROW1) ELSEIF (IANG .EQ. 270) THEN ISLICE2 = NSLICES - (IROW1 - NROW1) IROW2 = ISLICE1 - NSLICE1 + 1 ENDIF IREC2 = (ISLICE2 - 1) * NROWS + IROW2 CALL WRTLIN(LUNOUT,BUF(NSAM1),NSAMS,IREC2) ENDDO ENDDO ELSE IF (AXIS .EQ. 'Y') THEN IF (IANG .EQ. 180) THEN IT = NSAMS + NSAM1 DO ISLICE1 = NSLICE1,NSLICE2 C INVERT THE SLICES ISLICE2 = NSLICES - (ISLICE1 - NSLICE1) DO IROW1 = NROW1,NROW2 IROW2 = IROW1 - NROW1 + 1 IREC1 = (ISLICE1 - 1) * NROW + IROW1 CALL REDLIN(LUNIN,BUF,NSAM,IREC1) C MIRROR THE COLUMS ALONG THE ROW DO ISAM1 = NSAM1,NSAM2 BUF2(IT - ISAM1) = BUF(ISAM1) ENDDO IREC2 = (ISLICE2 - 1) * NROWS + IROW2 CALL WRTLIN(LUNOUT,BUF2(NSAM1),NSAMS,IREC2) ENDDO ENDDO ELSEIF (IANG .EQ. 90 .OR. IANG .EQ. 270) THEN C ROTATE AROUND Y AXIS, RELATIVELY SLOW!! DO IROW1 = NROW1,NROW2 C FIND CORRESPONDING CURRENT OUTPUT SLICE IROW2 = IROW1 - NROW1 + 1 DO ISLICE1 = NSLICE1,NSLICE2 C READ ONE RECORD FROM SOURCE FILE IREC1 = (ISLICE1 - 1) * NROW + IROW1 CALL REDLIN(LUNIN,BUF,NSAM,IREC1) IF (IANG .EQ. 270) THEN ISAM2 = ISLICE1 - NSLICE1 + 1 ELSE ISAM2 = NSAMS - (ISLICE1 - NSLICE1) ENDIF ISAMT = ISAM2 IP1 = - NSAMS + ISAMT IP2 = - NSAM1 + 1 DO ISAM1 = NSAM1,NSAM2 C CREATE NEW X-Z IMAGE PLANE C ISLICE2 = ISAM1 - NSAM1 + 1 C ISLICE2 = ISAM1 + IP2 C IROWT = ISLICE2 IROWT = ISAM1 + IP2 C BUF2((IROWT-1) * NSAMS + ISAMT) = BUF(ISAM1) C BUF2((IROWT * NSAMS - NSAMS + ISAMT) = BUF(ISAM1) BUF2(IROWT * NSAMS + IP1) = BUF(ISAM1) ENDDO ENDDO C WRITE OUT THE REFORMED X-Y PLANE IPT = 1 DO ISLICE2 = 1,NSLICES IREC2 = (ISLICE2 - 1) * NROWS + IROW2 CALL WRTLIN(LUNOUT,BUF2(IPT),NSAMS,IREC2) IPT = IPT + NSAMS ENDDO ENDDO ENDIF ENDIF RETURN END