C++********************************************************************* C C ROT2QS.F 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 ROT2QS.F C C C--********************************************************************* SUBROUTINE ROT2QS(X,OUT,NSAM,NROW, & THETA,SCLI,SHXI,SHYI,LUN2,LB) DIMENSION X(NSAM,NROW),OUT(NSAM) PARAMETER (QUADPI = 3.141592653589793238462643383279502884197) PARAMETER (DGR_TO_RAD = (QUADPI/180)) SHX = AMOD(SHXI,FLOAT(NSAM)) SHY = AMOD(SHYI,FLOAT(NROW)) ICENT = NROW/2+1 KCENT = NSAM/2+1 RN2 = -NROW/2 SN2 = -NSAM/2 RW2 = -RN2 RS2 = -SN2 IF (MOD(NSAM,2).EQ.0) RW2 = RW2-1.0 IF (MOD(NROW,2).EQ.0) RS2 = RS2-1.0 COD = COS(THETA*DGR_TO_RAD) SID = SIN(THETA*DGR_TO_RAD) DO I=1,NROW YI = I - ICENT - SHY IF (YI.LT.RN2) YI = AMIN1(RW2+YI-RN2+1.0,RW2) IF (YI.GT.RW2) YI = AMAX1(RN2+YI-RW2-1.0,RN2) YCOD = YI * COD / SCLI + ICENT YSID = -YI * SID / SCLI + KCENT c$omp parallel do private(k,xi,xold,yold) DO K=1,NSAM XI = K - KCENT - SHX IF (XI.LT.SN2) XI = AMIN1(RS2+XI-SN2+1.0,RS2) IF (XI.GT.RS2) XI = AMAX1(SN2+XI-RS2-1.0,SN2) YOLD = XI * SID / SCLI + YCOD XOLD = XI * COD / SCLI + YSID OUT(K) = QUADRI(XOLD, YOLD, NSAM, NROW, X) ENDDO CALL WRTLIN(LUN2,OUT,NSAM,LB+I) ENDDO END C++********************************************************************* C C ROT2QS_DL.F BUFOUT RETURN ADDED, SPEEDED UP 12/28/06 ArDean Leith C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2007 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 ROT2QS_DL(XIMG,BUFOUT,NSAM,NROW,THETA,SCLI,SHXI,SHYI,IREC1,LUN) C C PURPOSE: ROTATES AND SHIFTS A SLICE OF AN IMAGE, ROW BY ROW C C PARAMETERS: XIMG INPUT IMAGE (INPUT) C BUFOUT OUTPUT IMAGE OR LINE BUFFER (OUTPUT) C NSAM,NROW IMAGE SIZE (INPUT) C THETA,SCLI ROTATION AND SCALE (INPUT) C SHXI,SHYI SHIFTS (INPUT) C IREC1 IMAGE STARTING RECORD (INPUT) C LUN LUN FOR OUTPUT (0 IS NO FILE OUT) (INPUT) C C--********************************************************************* SUBROUTINE ROT2QS_DL(XIMG,BUFOUT, NSAM,NROW, & THETA,SCLI,SHXI,SHYI, IREC1,LUN) REAL :: XIMG(NSAM,NROW) REAL :: BUFOUT(NSAM,*) REAL, PARAMETER :: QUADPI = 3.14159265358979323846 REAL, PARAMETER :: DGR_TO_RAD = (QUADPI/180) SHX = AMOD(SHXI,FLOAT(NSAM)) SHY = AMOD(SHYI,FLOAT(NROW)) ICENT = NROW/2+1 KCENT = NSAM/2+1 RN2 = -NROW/2 SN2 = -NSAM/2 RW2 = -RN2 RS2 = -SN2 IF (MOD(NSAM,2).EQ.0) RW2 = RW2 - 1.0 IF (MOD(NROW,2).EQ.0) RS2 = RS2 - 1.0 COD = COS(THETA * DGR_TO_RAD) SID = SIN(THETA * DGR_TO_RAD) CODDSCLI = COD / SCLI SIDDSCLI = SID / SCLI FKCENTMSHX = -KCENT - SHX FICENTMSHY = -ICENT - SHY RE1 = RW2 - RN2 + 1.0 RE2 = RN2 - RW2 - 1.0 RF1 = RS2 - SN2 + 1.0 RF2 = SN2 - RS2 - 1.0 IT = 1 DO I=1,NROW IF (LUN .LE. 0) IT = I YI = I + FICENTMSHY IF (YI.LT.RN2) YI = MIN(YI+RE1, RW2) IF (YI.GT.RW2) YI = MAX(YI+RE2, RN2) YCOD = YI * CODDSCLI + ICENT YSID = -YI * SIDDSCLI + KCENT c$omp parallel do private(k,xi,xold,yold) DO K=1,NSAM XI = K + FKCENTMSHX IF (XI .LT. SN2) XI = MIN(XI+RF1, RS2) IF (XI .GT. RS2) XI = MAX(XI+RF2, SN2) YOLD = XI * SIDDSCLI + YCOD XOLD = XI * CODDSCLI + YSID BUFOUT(K,IT) = QUADRI(XOLD, YOLD, NSAM, NROW, XIMG) ENDDO IF (LUN .GT. 0) THEN C WRITE CURRENT LINE TO FILE CALL WRTLIN(LUN,BUFOUT,NSAM,IREC1+I) ENDIF ENDDO END