/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

  1. ;+
  2. ; NAME:
  3. ; sshift2d
  4. ; PURPOSE: (one line)
  5. ; Shift a 2-D array using a damped sinc function for the fractional part.
  6. ; DESCRIPTION:
  7. ;
  8. ; CATEGORY:
  9. ; Mathematical
  10. ; CALLING SEQUENCE:
  11. ; result = sshift2d( array, shiftvec )
  12. ; INPUTS:
  13. ; array : Array to be shifted.
  14. ; shiftvec : Vector of two elements: [ xshift, yshift ].
  15. ; OPTIONAL INPUT PARAMETERS:
  16. ;
  17. ; KEYWORD PARAMETERS:
  18. ;
  19. ; OUTPUTS:
  20. ; The shifted array is returned as the function value.
  21. ; COMMON BLOCKS:
  22. ;
  23. ; SIDE EFFECTS:
  24. ;
  25. ; RESTRICTIONS:
  26. ;
  27. ; PROCEDURE:
  28. ;
  29. ; MODIFICATION HISTORY:
  30. ; February, 1993:
  31. ; Copied from "sincshift.pro" written by John Spencer, Lowell Observatory.
  32. ; Very minor modifications by Doug Loucks, Lowell Observatory.
  33. ;-
  34. ;******************************************************************************
  35. ; Begin support functions.
  36. ; ------------------------------------------------------------------------------
  37. ; Function Padarray
  38. ; Returns original 2-D array padded by margin replication
  39. ; on all sides. x margin = pad( 0 ), y margin=pad( 1 )
  40. ; ------------------------------------------------------------------------------
  41. FUNCTION Padarray, array, pad
  42. sizearr = SIZE( array )
  43. xs = sizearr[ 1 ]
  44. ys = sizearr[ 2 ]
  45. parray = FLTARR( xs+2*pad[ 0 ], ys+2*pad[ 1 ] )
  46. ; Middle:
  47. parray[ pad[ 0 ], pad[ 1 ] ] = array
  48. ; low-x side:
  49. parray[ 0 : pad[0]-1, pad[1] : pad[1]+ys-1 ] = REBIN( array[0,*], pad[0], ys )
  50. ; high-x side:
  51. parray[ pad[0]+xs : *, pad[1] : pad[1]+ys-1 ]= REBIN( array[xs-1,*], pad[0],ys )
  52. ; low-y side:
  53. parray[ *, 0 : pad[1]-1 ] = REBIN( parray[ *, pad[1] ], xs+2*pad[0], pad[1] )
  54. ; high-y side:
  55. parray[*, pad[1]+ys : * ]= REBIN( parray[ *, pad[1]+ys-1 ], xs+2*pad[0],pad[1])
  56. RETURN, parray
  57. END
  58. ; ------------------------------------------------------------------------------
  59. ; Function Shiftrep
  60. ; Shifts an image by integer numbers of pixels, replicating border pixels
  61. ; instead of wrapping around
  62. ; ------------------------------------------------------------------------------
  63. FUNCTION Shiftrep, image, xshift, yshift
  64. imsize = SIZE( image )
  65. xsize = imsize[ 1 ]
  66. ysize = imsize[ 2 ]
  67. ; Nint is the "nearest integer" function found in the Astron_misc
  68. ; library,
  69. ix = Nint( xshift )
  70. iy = Nint( yshift )
  71. temp = SHIFT( image, ix, iy )
  72. IF ix GT 0 THEN temp[ 0 : ix-1, * ] = REBIN( temp[ ix, * ], ix, ysize )
  73. IF ix LT 0 THEN temp[xsize+ix : *, *] = REBIN(temp[ xsize+ix-1, * ], -ix, ysize)
  74. IF iy GT 0 THEN temp[ *, 0 : iy-1 ] = REBIN( temp[ *, iy ], xsize, iy )
  75. IF iy LT 0 THEN temp[*, ysize+iy : *] = REBIN(temp[ *, ysize+iy-1 ], xsize, -iy)
  76. RETURN, temp
  77. END
  78. ; End support functions.
  79. ;******************************************************************************
  80. ; ------------------------------------------------------------------------------
  81. ; Function sshift2d
  82. ; Shifts a 2-D array by shiftvec( 0 ) along x and shiftvec( 1 ) along y,
  83. ; replicating the margins.
  84. ; ------------------------------------------------------------------------------
  85. FUNCTION sshift2d, array, shiftvec
  86. sizearr = SIZE( array )
  87. xs = sizearr[ 1 ]
  88. ys = sizearr[ 2 ]
  89. ; Separate and do integer shift first:
  90. ishift = Nint( shiftvec )
  91. fshift = shiftvec - ishift
  92. sarray = Shiftrep( array, ishift[ 0 ], ishift[ 1 ] )
  93. ; Return if there's no fractional shift:
  94. IF fshift[ 0 ] EQ 0 AND fshift[ 1 ] EQ 0 THEN RETURN, sarray
  95. dampfac = 3.25
  96. sincrad = 10
  97. sincsize = 2 * sincrad + 1
  98. ; Pad the array (replicating margins) in preparation for convolution:
  99. sarray = Padarray( sarray, [sincrad,sincrad] )
  100. ; Generate the x and y sinc functions:
  101. sinc = FLTARR( sincsize, 2 )
  102. kernel = FLTARR( sincsize, sincsize )
  103. FOR iindex = 0, 1 DO BEGIN
  104. IF fshift[ iindex ] NE 0 THEN BEGIN
  105. s = FINDGEN( 2*sincrad+1 ) - sincrad + fshift[ iindex ]
  106. sinc[ *, iindex ] = EXP( -( s/dampfac )^2 ) * SIN( !PI*s )/( !PI*s )
  107. ENDIF ELSE BEGIN
  108. sinc[ *, iindex ] = 0.0
  109. sinc[ sincrad, iindex ] = 1.0
  110. ENDELSE
  111. ENDFOR
  112. ; Multiply the sinc functions to generate 2-D kernel
  113. FOR i = 0, sincsize-1 DO BEGIN
  114. kernel[ *, i ] = sinc[ *, 0 ] * sinc[ i, 1 ]
  115. ENDFOR
  116. sarray = CONVOL( sarray, kernel, CENTER=1 )
  117. ;Trim back to original size:
  118. sarray = sarray[ sincrad : sincrad+xs-1, sincrad : sincrad+ys-1 ]
  119. RETURN, sarray
  120. END