C++********************************************************************* C C $$ ROTS3.FOR C 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 C IMAGE_PROCESSING_ROUTINE C23456789012345678901234567890123456789012345678901234567890123456789012 C--********************************************************************* SUBROUTINE ROTS3(LUN2,Q1,KLX,KNX,KLY,KNY,KLZ,KNZ,PSI,THETA,PHI) DIMENSION Q1(KLX:KNX,KLY:KNY,KLZ:KNZ),Q2(KLX:KNX) DIMENSION IM(3) DOUBLE PRECISION AV,RM(3,3),QR(3),DX,DY,DZ C EQUIVALENCE (IM(1),IX),(IM(2),IY),(IM(3),IZ) LEX=KNX-KLX+1 IF (THETA.EQ.0.0.AND.PHI.EQ.0.0.AND.PSI.EQ.0.0) THEN IBUF=0 DO IZ=KLZ,KNZ DO IY=KLY,KNY IBUF = IBUF + 1 CALL WRTLIN(LUN2,Q1(KLX,IY,IZ),LEX,IBUF) ENDDO ENDDO RETURN ENDIF C AV=0.0 C DO 1 IZ=KLZ,KNZ C DO 1 IY=KLY,KNY C DO 1 IX=KLX,KNX C1 AV=AV+Q1(IX,IY,IZ) C AV=AV/FLOAT(KNX-KLX+1)/FLOAT(KNY-KLY+1)/FLOAT(KNZ-KLZ+1) CALL BLDR(RM,PSI,THETA,PHI) IBUF=0 DO IZ=KLZ,KNZ DO IY=KLY,KNY QR(1)=RM(1,1)*KLX+RM(2,1)*IY+RM(3,1)*IZ QR(2)=RM(1,2)*KLX+RM(2,2)*IY+RM(3,2)*IZ QR(3)=RM(1,3)*KLX+RM(2,3)*IY+RM(3,3)*IZ DO IX=KLX,KNX C DO 3 I3=1,3 C QR(I3)=0.0 C DO 3 I2=1,3 C3 QR(I3)=QR(I3)+RM(I2,I3)*IM(I2) IOX=QR(1)+FLOAT(1-KLX) DX=QR(1)+FLOAT(1-KLX)-IOX DX=DMAX1(DX,1.0D-5) IOX=IOX+KLX-1 IOY=QR(2)+FLOAT(1-KLY) DY=QR(2)+FLOAT(1-KLY)-IOY DY=DMAX1(DY,1.0D-5) IOY=IOY+KLY-1 IOZ=QR(3)+FLOAT(1-KLZ) DZ=QR(3)+FLOAT(1-KLZ)-IOZ DZ=DMAX1(DZ,1.0D-5) IOZ=IOZ+KLZ-1 IF(IOX.GE.KLX.AND.IOX.LT.KNX) THEN IF(IOY.GE.KLY.AND.IOY.LT.KNY) THEN IF(IOZ.GE.KLZ.AND.IOZ.LT.KNZ) THEN C Q2(IX)= C & +(1-DX)*(1-DY)*(1-DZ)*Q1(IOX,IOY,IOZ) C & + DX *(1-DY)*(1-DZ)*Q1(IOX+1,IOY,IOZ) C & +(1-DX)* DY *(1-DZ)*Q1(IOX,IOY+1,IOZ) C & +(1-DX)*(1-DY)* DZ *Q1(IOX,IOY,IOZ+1) C & + DX * DY *(1-DZ)*Q1(IOX+1,IOY+1,IOZ) C & + DX *(1-DY)* DZ *Q1(IOX+1,IOY,IOZ+1) C & +(1-DX)* DY * DZ *Q1(IOX,IOY+1,IOZ+1) C & + DX * DY * DZ *Q1(IOX+1,IOY+1,IOZ+1) C C faster version : A1 = Q1(IOX,IOY,IOZ) A2 = Q1(IOX+1,IOY,IOZ) - A1 A3 = Q1(IOX,IOY+1,IOZ) - A1 A4 = Q1(IOX,IOY,IOZ+1) - A1 A5 = -A2 - Q1(IOX,IOY+1,IOZ) + Q1(IOX+1,IOY+1,IOZ) A6 = -A2 - Q1(IOX,IOY,IOZ+1) + Q1(IOX+1,IOY,IOZ+1) A7 = -A3 - Q1(IOX,IOY,IOZ+1) + Q1(IOX,IOY+1,IOZ+1) A8 = -A5 + Q1(IOX,IOY,IOZ+1) - Q1(IOX+1,IOY,IOZ+1) & - Q1(IOX,IOY+1,IOZ+1) + Q1(IOX+1,IOY+1,IOZ+1) Q2(IX)= A1 + DZ*(A4 + A6*DX + (A7 + A8*DX)*DY) + A3*DY & + DX*(A2 + A5*DY) GOTO 5 ENDIF ENDIF ENDIF C Q2(IX)=AV Q2(IX)=Q1(IX,IY,IZ) 5 CONTINUE QR(1) = QR(1) + RM(1,1) QR(2) = QR(2) + RM(1,2) QR(3) = QR(3) + RM(1,3) ENDDO IBUF=IBUF+1 CALL WRTLIN(LUN2,Q2,LEX,IBUF) ENDDO ENDDO END