C ++******************************************************************** 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 SUBROUTINE MAKES A CIRCLE WITHIN A FILE C C MCIRCL(LUN,NSAM,NROW,RP,IDIM) C C LUN : LOGICAL UNIT NUMBER C C NSAM,NROW : FILE DIMENSIONS C C RP : VALUE TO BE CORRECTED C C IDIM : 1 = CIRCLE LINE C 2 = CIRCLE AREA C IDIM < 0 : ENTER COOS OF 3 POINTS TO DETERMINE CIRCLE C IDIM > 0 : ENTER CENTER COOS AND RADIUS TO DETERMINE CIRCLE C C ********************************************************************** SUBROUTINE MCIRCL(LUN,NSAM,NROW,RP,IDIM) COMMON ADUM(80),BUF(1) COMMON /UNITS/LUNC,NIN,NOUT IF (IDIM .LT .0)THEN C ENTER 3 POINTS TO DETERMINE CIRCLE IDIM=IABS(IDIM) CALL RDPRMI(IX1,IY1,NOT_USED,'ENTER COOS OF 1. POINT') CALL RDPRMI(IX2,IY2,NOT_USED,'ENTER COOS OF 2. POINT') CALL RDPRMI(IX3,IY3,NOT_USED,'ENTER COOS OF 3. POINT') IF(IY1.EQ.IY2.AND.IY2.EQ.IY3) GOTO 9000 X1=FLOAT(IX2-IX1) Y1=FLOAT(IY2-IY1) X2=FLOAT(IX3-IX1) Y2=FLOAT(IY3-IY1) XM1=FLOAT(IX1)+X1/2. YM1=FLOAT(IY1)+Y1/2. XM2=FLOAT(IX1)+X2/2. YM2=FLOAT(IY1)+Y2/2. WRITE(NOUT,9999) XM1,YM1,XM2,YM2 9999 FORMAT(5X,'(',F5.1,',',F5.1,')',5X,'(',F5.1,',',F5.1,')') IF(IY1.EQ.IY2) GOTO 111 IF(IY1.EQ.IY3) GOTO 112 AM11=-X1/Y1 AM22=-X2/Y2 WRITE(NOUT,9998) AM11,AM22 9998 FORMAT(' AM11 = ',F6.2,5X,' AM22 = ',F6.2) IF(AM11.EQ.AM22) GOTO 9000 X=(YM2-YM1+AM11*XM1-AM22*XM2)/(AM11-AM22) Y=AM11*(X-XM1)+YM1 GOTO 113 111 AM22=-X2/Y2 X=XM1 Y=AM22*(X-XM2)+YM2 GOTO 113 112 X=XM2 AM11=-X1/Y1 Y=AM11*(X-XM1)+YM1 113 IX=IFIX(X+.5) IY=IFIX(Y+.5) WRITE(NOUT,9997) X,Y,IX,IY 9997 FORMAT(1X,' X = ',F5.1,2X,' Y = ',F5.1,2X,' (',I2,',',I2,')') R=SQRT((X-FLOAT(IX1))**2.+(Y-FLOAT(IY1))**2.) WRITE(NOUT,9996) R 9996 FORMAT(' RADIUS = ',F12.2) ELSE CALL RDPRMI(IX,IY,NOT_USED,'ENTER CENTER COORDINATES') CALL RDPRM(R,NOT_USED,'ENTER RADIUS') IF (R .LE. 0.) GOTO 9000 ENDIF 9 CONTINUE IR=IFIX(R+0.5) I0=IY-IR I1=IY+IR IYSTRT=MAX0(1,I0) IYEND=MIN0(NROW,I1) IF(IYSTRT.GT.NROW.OR.IYEND.LE.0) GOTO 9000 I0=IX-IR I1=IX+IR IXSTRT=MAX0(1,I0) IXEND=MIN0(NSAM,I1) IF(IXSTRT.GT.NSAM.OR.IXEND.LE.0) GOTO 9000 DO I=IYSTRT,IYEND CALL REDLIN(LUN,BUF,NSAM,I) DO J=IXSTRT,IXEND T=FLOAT(J-IX)**2+FLOAT(I-IY)**2 IT=IFIX(SQRT(T)) IF(IDIM.EQ.2.AND.IT.LE.IR) BUF(J)=RP IF(IDIM.EQ.1.AND.IT.EQ.IR) BUF(J)=RP ENDDO CALL WRTLIN(LUN,BUF,NSAM,I) ENDDO RETURN 9000 CALL ERRT(14,'MCIRCL',NF) RETURN END