Viewing contents of file '../idllib/jhuapls1r/usr/arrow2.pro'
;-------------------------------------------------------------
;+
; NAME:
;       ARROW2
; PURPOSE:
;       Draw arrows on screen.
; CATEGORY:
; CALLING SEQUENCE:
;       arrow2, xt, yt, xh, yh
; INPUTS:
;       xt, yt = x,y of arrow tail.     in
;       xh, yh = x,y of arrow head.     in
; KEYWORD PARAMETERS:
;       Keywords:
;         /DATA means use data coordinates (def).
;         /NORM means use normalized coordinates.
;         /DEVICE means use device coordinates.
;         COLOR=c arrow outline color (def=255).
;           Make same as FILL for no outline.
;         THICK=t arrow outline thickness (def=0).
;         LINESTYLE=s arrow outline line style (def=0).
;         FILL=f set arrow fill color (0-255, def = -1 = no fill).
;         LENGTH=l  Arrow head length in % plot width (def = 3).
;         WIDTH=w  Arrow head width in % plot width (def = 2).
;         SHAFT=s  Arrow shaft width in % plot width (def = 1).
; OUTPUTS:
; COMMON BLOCKS:
; NOTES:
; MODIFICATION HISTORY:
;       R. Sterner, 21 Sep, 1990
;       R. Sterner, 11 Nov, 1993 --- renamed from arrow.
;
; Copyright (C) 1990, 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 arrow2, xt, yt, xh, yh, device=device, data=data, norm=norm, $
          help=hlp, color=color, linestyle=linestyle, thick=thick, $
	  fill=fill, length=alen0, width=awid0, shaft=ash0
 
	if (n_params(0) lt 4) or keyword_set(hlp) then begin
	  print,' Draw arrows on screen.'
	  print,' arrow2, xt, yt, xh, yh'
	  print,'   xt, yt = x,y of arrow tail.     in'
	  print,'   xh, yh = x,y of arrow head.     in'
	  print,' Keywords:'
	  print,'   /DATA means use data coordinates (def).'
	  print,'   /NORM means use normalized coordinates.'
	  print,'   /DEVICE means use device coordinates.'
	  print,'   COLOR=c arrow outline color (def=255).'
	  print,'     Make same as FILL for no outline.'
	  print,'   THICK=t arrow outline thickness (def=0).'
	  print,'   LINESTYLE=s arrow outline line style (def=0).'
	  print,'   FILL=f set arrow fill color (0-255, def = -1 = no fill).'
	  print,'   LENGTH=l  Arrow head length in % plot width (def = 3).'
	  print,'   WIDTH=w  Arrow head width in % plot width (def = 2).'
	  print,'   SHAFT=s  Arrow shaft width in % plot width (def = 1).'
	  return
	endif
 
	;---------  Make sure parameters set  ---------
	if n_elements(device) eq 0 then device = 0
	if n_elements(data) eq 0 then data = 0
	if n_elements(norm) eq 0 then norm = 0
	if (device+data+norm) eq 0 then data = 1
	if n_elements(alen0) eq 0 then alen0 = 3.0
	if n_elements(awid0) eq 0 then awid0 = 2.0
	if n_elements(ash0) eq 0 then ash0 = 1.0
	if n_elements(color) eq 0 then color = !p.color
	if n_elements(linestyle) eq 0 then linestyle = !p.linestyle
	if n_elements(thick) eq 0 then thick = !p.thick
	if n_elements(fill) eq 0 then fill = -1
 
	alen = alen0/100.
	awid2 = awid0/100./2.
	ash2 = ash0/100./2.
	;  Arrows have a problem in normalized coordinates.  A length of 1 unit
	;  will in general be different in X and Y.  This may be handled easily
	;  by converting to an isotropic coordinate system, computing the arrow,
	;  then converted back to norm. to plot.  The factor ff is the x to y
	;  shape ratio that does this conversion.
	ff = float(!d.x_size)/float(!d.y_size)	; Fudge fact to cor norm coord.
 
 
	;---------  Convert arrow to normalized coordinates  --------
	if keyword_set(data) then begin
	  t = convert_coord([xt,xh],[yt,yh],/data,/to_norm)
	  x1 = (t(0,*))(0)
	  x2 = (t(0,*))(1)
	  y1 = (t(1,*))(0)
	  y2 = (t(1,*))(1)
	endif
	if keyword_set(device) then begin
	  t = convert_coord([xt,xh],[yt,yh],/dev,/to_norm)
	  x1 = (t(0,*))(0)
	  x2 = (t(0,*))(1)
	  y1 = (t(1,*))(0)
	  y2 = (t(1,*))(1)
	endif
	if keyword_set(norm) then begin
	  x1 = xt
	  x2 = xh
	  y1 = yt
	  y2 = yh
	endif
	x1 = x1*ff
	x2 = x2*ff
 
	plots, [x1,x1]/ff, [y1,y1], /norm	; Plot one.
	dx = x2 - x1  & dy = y2 - y1	; Set up arrow.
	m1 = sqrt(dx^2 + dy^2)>.1
	u1x = dx/m1  & u1y = dy/m1		; Unit vector along arrow.
	u2x = -u1y  & u2y = u1x		; Unit vector across arrow.
	x2b = x2 - alen*u1x  & y2b = y2 - alen*u1y	  ; Midpt back of head.
	hx1 = x2b + ash2*u2x  & hy1 = y2b + ash2*u2y     ; ARROW HEAD BACK.
	hx2 = x2b - ash2*u2x  & hy2 = y2b - ash2*u2y     ; ARROW HEAD BACK.
	hx3 = x2b + awid2*u2x  & hy3 = y2b + awid2*u2y   ; ARROW HEAD BACK.
	hx4 = x2b - awid2*u2x  & hy4 = y2b - awid2*u2y   ; ARROW HEAD BACK.
	tx1 = x1 + ash2*u2x  & ty1 = y1 + ash2*u2y	     ; ARROW TAIL.
	tx2 = x1 - ash2*u2x  & ty2 = y1 - ash2*u2y	     ; ARROW TAIL.
	xp = [tx1, hx1, hx3, x2, hx4, hx2, tx2, tx1]
	yp = [ty1, hy1, hy3, y2, hy4, hy2, ty2, ty1]
	plots, xp/ff, yp, /norm		; Plot temp arrow.
 
	if fill ne -1 then polyfill, /norm, xp/ff, yp, color=fill
	plots, xp/ff, yp, /norm, color=color, linestyle=linestyle, $
	  thick=thick
 
	end