;+
; NAME:
; cgetrng
; PURPOSE: (one line)
; How to integrate over a circle.
; DESCRIPTION:
; This procedure is called to determine how to iterate when integrating
; over a circle. The circle's center is at (xc,yc), and its radius is r.
; For pixels with x-coordinate x, those in the intervals [y0,y1) and [y2,y3)
; are on or near the circle. Those in the interval [y1,y2) are definitely
; inside; all others are definitely outside.
; Of course, the routine can be called to determine an interval for fixed
; y by calling it as cgetrng,yc,xc,r,y,x0,x1,x2,x3.
; The appropriate way to integrate over a circle is therefore as follows:
; cgetrng,xc,yc,r,Round(xc),y0,y1,y2,y3
; for (y = y0; y <= y3-1; y=y+1) {
; cgetrng, yc, xc, r, y, x0, x1, x2, x3;
; for (x = x0; x <= x1-1; x=x+1) sum = sum + value(x,y)*pixwt(xc,yc,r,x,y);
; for (x = x1; x <= x2-1; x=x+1) sum = sum + value(x,y);
; for (x = x2; x <= x3-1; x=x+1) sum = sum + value(x,y)*pixwt(xc,yc,r,x,y);
; }
; CATEGORY:
; CCD data processing
; CALLING SEQUENCE:
; cgetrng, xc, yc, r, x, y0, y1, y2, y3
; INPUTS:
; xc, yc : Center of the circle.
; r : Radius of the circle.
; x : X coordinate for the intervals to be determined.
; OPTIONAL INPUT PARAMETERS:
; None.
; KEYWORD PARAMETERS:
; None.
; OUTPUTS:
; y0, y1, y2, y3 : The endpoints of the three intervals of interest.
; COMMON BLOCKS:
; None.
; SIDE EFFECTS:
; RESTRICTIONS:
; None.
; PROCEDURE:
; Determine three intervals along the x input coordinate: The
; intervals [y0,y1), [y1,y2), and [y2,y3).
; MODIFICATION HISTORY:
; Ported by Doug Loucks, Lowell Observatory, 1992 Sep, from the
; routine cgetrng in pixwt.c, by Marc Buie.
; 4/1/93, DWL, Added argument validation (badpar).
;-
PRO cgetrng, xc, yc, r, x, y0, y1, y2, y3
; Validate the number of arguments.
;IF N_PARAMS() NE 8 THEN BEGIN
; MESSAGE, 'cgetrng,xc,yc,r,x,y0,y1,y2,y3', /INFO
; RETURN
;ENDIF
; Validate input argument types.
;IF badpar( xc, [1,2,3,4,5], 0, CALLER='cgetrng' ) THEN RETURN
;IF badpar( yc, [1,2,3,4,5], 0, CALLER='cgetrng' ) THEN RETURN
;IF badpar( r, [1,2,3,4,5], 0, CALLER='cgetrng' ) THEN RETURN
;IF badpar( x, [1,2,3,4,5], 0, CALLER='cgetrng' ) THEN RETURN
sqrt2 = 1.414213563D0 ; Rounded up to increase size of uncertain areas.
IF r LE 0.0 THEN BEGIN ; it misses completely
outdsq = -1.0
ENDIF ELSE BEGIN
a = r * r + 0.5 - ( x - xc ) * ( x - xc )
b = sqrt2 * r
outdsq = a + b
IF b LT 1.0 THEN BEGIN ; indsq would be invalid--say no interior
indsq = -1.0
ENDIF ELSE BEGIN
indsq = a - b
ENDELSE
ENDELSE
IF outdsq LT 0.0 THEN BEGIN ; complete miss
y0 = Round( yc )
y1 = y0
y2 = y0
y3 = y0
ENDIF ELSE BEGIN ; there is some intersection
outd = SQRT( outdsq )
y0 = Ceil( yc - outd )
y3 = Floor( yc + outd ) + 1
IF indsq LT 0.0 THEN BEGIN ; no interior
y1 = Round( yc )
y2 = y1
ENDIF ELSE BEGIN ; there is a certain interior
ind = SQRT( indsq )
y1 = Ceil( yc - ind )
y2 = Floor( yc + ind ) + 1
ENDELSE
ENDELSE
END