/idl/heiles_all/idlutils/pro/math/sshift2d.pro
http://github.com/charleshull6/c_soft · IDL · 136 lines · 120 code · 16 blank · 0 comment · 3 complexity · 6b990dfed74a829f436a80a1ce523909 MD5 · raw file
- ;+
- ; NAME:
- ; sshift2d
- ; PURPOSE: (one line)
- ; Shift a 2-D array using a damped sinc function for the fractional part.
- ; DESCRIPTION:
- ;
- ; CATEGORY:
- ; Mathematical
- ; CALLING SEQUENCE:
- ; result = sshift2d( array, shiftvec )
- ; INPUTS:
- ; array : Array to be shifted.
- ; shiftvec : Vector of two elements: [ xshift, yshift ].
- ; OPTIONAL INPUT PARAMETERS:
- ;
- ; KEYWORD PARAMETERS:
- ;
- ; OUTPUTS:
- ; The shifted array is returned as the function value.
- ; COMMON BLOCKS:
- ;
- ; SIDE EFFECTS:
- ;
- ; RESTRICTIONS:
- ;
- ; PROCEDURE:
- ;
- ; MODIFICATION HISTORY:
- ; February, 1993:
- ; Copied from "sincshift.pro" written by John Spencer, Lowell Observatory.
- ; Very minor modifications by Doug Loucks, Lowell Observatory.
- ;-
- ;******************************************************************************
- ; Begin support functions.
- ; ------------------------------------------------------------------------------
- ; Function Padarray
- ; Returns original 2-D array padded by margin replication
- ; on all sides. x margin = pad( 0 ), y margin=pad( 1 )
- ; ------------------------------------------------------------------------------
- FUNCTION Padarray, array, pad
- sizearr = SIZE( array )
- xs = sizearr[ 1 ]
- ys = sizearr[ 2 ]
- parray = FLTARR( xs+2*pad[ 0 ], ys+2*pad[ 1 ] )
- ; Middle:
- parray[ pad[ 0 ], pad[ 1 ] ] = array
- ; low-x side:
- parray[ 0 : pad[0]-1, pad[1] : pad[1]+ys-1 ] = REBIN( array[0,*], pad[0], ys )
- ; high-x side:
- parray[ pad[0]+xs : *, pad[1] : pad[1]+ys-1 ]= REBIN( array[xs-1,*], pad[0],ys )
- ; low-y side:
- parray[ *, 0 : pad[1]-1 ] = REBIN( parray[ *, pad[1] ], xs+2*pad[0], pad[1] )
- ; high-y side:
- parray[*, pad[1]+ys : * ]= REBIN( parray[ *, pad[1]+ys-1 ], xs+2*pad[0],pad[1])
- RETURN, parray
- END
- ; ------------------------------------------------------------------------------
- ; Function Shiftrep
- ; Shifts an image by integer numbers of pixels, replicating border pixels
- ; instead of wrapping around
- ; ------------------------------------------------------------------------------
- FUNCTION Shiftrep, image, xshift, yshift
- imsize = SIZE( image )
- xsize = imsize[ 1 ]
- ysize = imsize[ 2 ]
- ; Nint is the "nearest integer" function found in the Astron_misc
- ; library,
- ix = Nint( xshift )
- iy = Nint( yshift )
- temp = SHIFT( image, ix, iy )
- IF ix GT 0 THEN temp[ 0 : ix-1, * ] = REBIN( temp[ ix, * ], ix, ysize )
- IF ix LT 0 THEN temp[xsize+ix : *, *] = REBIN(temp[ xsize+ix-1, * ], -ix, ysize)
- IF iy GT 0 THEN temp[ *, 0 : iy-1 ] = REBIN( temp[ *, iy ], xsize, iy )
- IF iy LT 0 THEN temp[*, ysize+iy : *] = REBIN(temp[ *, ysize+iy-1 ], xsize, -iy)
- RETURN, temp
- END
- ; End support functions.
- ;******************************************************************************
- ; ------------------------------------------------------------------------------
- ; Function sshift2d
- ; Shifts a 2-D array by shiftvec( 0 ) along x and shiftvec( 1 ) along y,
- ; replicating the margins.
- ; ------------------------------------------------------------------------------
- FUNCTION sshift2d, array, shiftvec
- sizearr = SIZE( array )
- xs = sizearr[ 1 ]
- ys = sizearr[ 2 ]
- ; Separate and do integer shift first:
- ishift = Nint( shiftvec )
- fshift = shiftvec - ishift
- sarray = Shiftrep( array, ishift[ 0 ], ishift[ 1 ] )
- ; Return if there's no fractional shift:
- IF fshift[ 0 ] EQ 0 AND fshift[ 1 ] EQ 0 THEN RETURN, sarray
- dampfac = 3.25
- sincrad = 10
- sincsize = 2 * sincrad + 1
- ; Pad the array (replicating margins) in preparation for convolution:
- sarray = Padarray( sarray, [sincrad,sincrad] )
- ; Generate the x and y sinc functions:
- sinc = FLTARR( sincsize, 2 )
- kernel = FLTARR( sincsize, sincsize )
- FOR iindex = 0, 1 DO BEGIN
- IF fshift[ iindex ] NE 0 THEN BEGIN
- s = FINDGEN( 2*sincrad+1 ) - sincrad + fshift[ iindex ]
- sinc[ *, iindex ] = EXP( -( s/dampfac )^2 ) * SIN( !PI*s )/( !PI*s )
- ENDIF ELSE BEGIN
- sinc[ *, iindex ] = 0.0
- sinc[ sincrad, iindex ] = 1.0
- ENDELSE
- ENDFOR
- ; Multiply the sinc functions to generate 2-D kernel
- FOR i = 0, sincsize-1 DO BEGIN
- kernel[ *, i ] = sinc[ *, 0 ] * sinc[ i, 1 ]
- ENDFOR
- sarray = CONVOL( sarray, kernel, CENTER=1 )
- ;Trim back to original size:
- sarray = sarray[ sincrad : sincrad+xs-1, sincrad : sincrad+ys-1 ]
- RETURN, sarray
- END