Viewing contents of file '../idllib/jhuapls1r/usr/ellfit.pro'
;-------------------------------------------------------------
;+
; NAME:
;       ELLFIT
; PURPOSE:
;       Fit an ellipse to a 2-d probability distribution.
; CATEGORY:
; CALLING SEQUENCE:
;       ellfit, pd, xm, ym, ang, ecc, a, b
; INPUTS:
;       pd = 2-d probability distribution.                  in
; KEYWORD PARAMETERS:
; OUTPUTS:
;       xm, ym = Mean X and Y coordinates (array indices).  out
;       ang = angle of major axis (deg).                    out
;       ecc = eccentricity of fitted ellipse.               out
;       a, b = semimajor, semiminor axis of fitted ellipse. out
; COMMON BLOCKS:
; NOTES:
;       Notes: An ellipse is fit by matching its moment of inertia
;         to the given array.  A threshold image should be
;         normalized to 1 before doing the fit, otherwise the
;         ellipse will not be the correct size.
;         See also genellipse.
;         Here is a simple example:
;           loadct,13
;           d = rebin(shift(dist(200),100,100),200,400)
;           z = rot(d,30) lt 50
;           tvscl,z
;           ellfit,z,xm,ym,ang,ecc,a,b
;           genellipse,xm,ym,ang,a,b,x,y
;           plots,x,y,/dev,color=!d.n_colors/2
; MODIFICATION HISTORY:
;       R. Sterner.  10 June, 1986.
;
; Copyright (C) 1986, Johns Hopkins University/Applied Physics Laboratory
; This software may be used, copied, or redistributed as long as it is not
; sold and this copyright notice is reproduced on each copy made.  This
; routine is provided as is without any express or implied warranties
; whatsoever.  Other limitations apply as described in the file disclaimer.txt.
;-
;-------------------------------------------------------------
	pro ellfit, pd, xm, ym, ang, ecc, a, b, help=hlp
 
	if (n_params(0) lt 7) or keyword_set(hlp) then begin
	  print,' Fit an ellipse to a 2-d probability distribution.'
	  print,' ellfit, pd, xm, ym, ang, ecc, a, b'
	  print,'   pd = 2-d probability distribution.                  in'
	  print,'   xm, ym = Mean X and Y coordinates (array indices).  out'
	  print,'   ang = angle of major axis (deg).                    out'
	  print,'   ecc = eccentricity of fitted ellipse.               out'
	  print,'   a, b = semimajor, semiminor axis of fitted ellipse. out'
	  print,' Notes: An ellipse is fit by matching its moment of inertia'
	  print,'   to the given array.  A threshold image should be'
	  print,'   normalized to 1 before doing the fit, otherwise the'
	  print,'   ellipse will not be the correct size.'
	  print,'   See also genellipse.'
	  print,'   Here is a simple example:'
	  print,'     loadct,13'
	  print,'     d = rebin(shift(dist(200),100,100),200,400)'  
          print,'     z = rot(d,30) lt 50'  
          print,'     tvscl,z'  
          print,'     ellfit,z,xm,ym,ang,ecc,a,b'  
          print,'     genellipse,xm,ym,ang,a,b,x,y'  
          print,'     plots,x,y,/dev,color=!d.n_colors/2'
	  return
	endif
 
	pi2 = !dpi^2
 
	s = size(pd)
 
	;-----  X and Y coordinates for each element in the data array  -------
	makexy, 0, s(1)-1, 1, 0, s(2)-1, 1, xa, ya
 
	;-----  Compute moments to find the principal axes angle.
	m00 = total(pd)
	m10 = total(xa*pd)
	m01 = total(ya*pd)
 
	xm = m10/m00	; Mean X.
	ym = m01/m00	; Mean Y.
 
	;------  Central moments  ------------
	u20 = total(xa^2*pd) - xm*m10
	u02 = total(ya^2*pd) - ym*m01
	u11 = total(xa*ya*pd) - ym*m10
 
	;-----  Angle of principal axes  -------
	tn2 = 2*u11/(u20-u02)
	ang = !radeg*atan(tn2)/2.0
	if u02 gt u20 then ang = ang + 90.0
 
	;-----  Now, rotate data array and re-compute moments  ----
	t = rot( pd, ang)	; ROT rotates by -ANG.
 
	;-----  Compute moments to find the principal axes angle.
	m00 = total(t)
	m10 = total(xa*t)
	m01 = total(ya*t)
 
	xm2 = m10/m00	; Mean X.
	ym2 = m01/m00	; Mean Y.
 
	;------  Central moments  ------------
	u20 = total(xa^2*t) - xm2*m10
	u02 = total(ya^2*t) - ym2*m01
	u11 = total(xa*ya*t) - ym2*m10
 
	;------  Find axes of ellipse with same 2nd moments -------
	aa = ((16.0*u20^3)/(pi2*u02))^(1./8.)
	bb = ((16.0*u02^3)/(pi2*u20))^(1./8.)
 
	a = aa > bb  ; Make sure major axis is the larger of the two.
	b = aa < bb
 
	ecc = sqrt(a^2 - b^2)/a  ; Eccentricity of the ellipse.
 
	return
	end