c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########        XSCATTER        ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c

      Subroutine Xscatter (x, y, n, itype, diameter) 11,34
      Implicit None
      Integer	n, itype, i
      Real	x(n), y(n), dx, dy
      Real	pi,size,deg2rad,radius,diameter, c22,s22,
     >  xx,x1,x2,x3,x4, yy,y1,y2,y3,y4
      Parameter (pi=3.14159265, deg2rad=pi/180.)
c
      radius	= .5 * diameter
      Call Xfull
      Call Plt2Wrld (0.,0.,x1,y1)
      Call Plt2Wrld (radius,radius,x2,y2)
      dx	= Abs (x2 - x1)
      dy	= Abs (y2 - y1)
c  
c...dot
c
      If (itype.EQ.0) Then
c       Call Xpntsz (0.002)
        Do i=1,n
        Call Xpoint (x(i), y(i))
        End Do
c       Call Xpntsz (0.0005)
c  
c...X
c
      Else If (itype.EQ.1) Then
        Do i=1,n
        Call Xpenup (x(i)+dx, y(i)+dy)
        Call Xpendn (x(i)-dx, y(i)-dy)
        Call Xpenup (x(i)-dx, y(i)+dy)
        Call Xpendn (x(i)+dx, y(i)-dy)
        End Do
c  
c...crosshair
c
      Else If (itype.EQ.2) Then
        Do i=1,n
        Call Xpenup (x(i)+dx, y(i))
        Call Xpendn (x(i)-dx, y(i))
        Call Xpenup (x(i), y(i)+dy)
        Call Xpendn (x(i), y(i)-dy)
        End Do
c  
c...triangle
c
      Else If (itype.EQ.3) Then
	xx	= dx * Cos(30.*deg2rad)
	yy	= dy * Cos(60.*deg2rad)
        Do i=1,n
        Call Xpenup (x(i), y(i)+dy)
        Call Xpendn (x(i)+xx, y(i)-yy)
        Call Xpendn (x(i)-xx, y(i)-yy)
        Call Xpendn (x(i), y(i)+dy)
        End Do
c  
c...square
c
      Else If (itype.EQ.4) Then
        Do i=1,n
        Call Xpenup (x(i)+dx, y(i)+dy)
        Call Xpendn (x(i)+dx, y(i)-dy)
        Call Xpendn (x(i)-dx, y(i)-dy)
        Call Xpendn (x(i)-dx, y(i)+dy)
        Call Xpendn (x(i)+dx, y(i)+dy)
        End Do
c  
c...diamond
c
      Else If (itype.EQ.5) Then
        Do i=1,n
        Call Xpenup (x(i)+dx, y(i))
        Call Xpendn (x(i), y(i)-dy)
        Call Xpendn (x(i)-dx, y(i))
        Call Xpendn (x(i), y(i)+dy)
        Call Xpendn (x(i)+dx, y(i))
        End Do
c  
c...octagon
c
      Else If (itype.EQ.8) Then
        c22	= Cos (22.5*deg2rad)
        s22	= Sin (22.5*deg2rad)
        xx	= x2 - x1
        yy	= y2 - y1
c
        Do i=1,n
          x4	= x(i) + xx * c22
          x3	= x(i) + xx * s22
          x2	= x(i) - xx * s22
          x1	= x(i) - xx * c22
          y4	= y(i) + yy * c22
          y3	= y(i) + yy * s22
          y2	= y(i) - yy * s22
          y1	= y(i) - yy * c22
c
          Call Xpenup (x3,y4)
          Call Xpendn (x4,y3)
          Call Xpendn (x4,y2)
          Call Xpendn (x3,y1)
          Call Xpendn (x2,y1)
          Call Xpendn (x1,y2)
          Call Xpendn (x1,y3)
          Call Xpendn (x2,y4)
          Call Xpendn (x3,y4)
        End Do
c  
      Else 
	Print *, 'Xscatter: no such line type: ', itype
      End If
c  
      End
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########        PLT2WRLD        ########
c                   ########        WRLD2PLT        ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c

      Subroutine Plt2wrld (px,py,x,y) 50,1
      Implicit None
      Real x,y,px,py
      x = px
      y = py
      Call Xlinvt (x,y)
      End
c
c

      Subroutine Wrld2Plt (x,y,px,py) 2,1
      Implicit None
      Real x,y,px,py
      px        = x
      py        = y
      Call Xtrans (px,py)       !input:x,y in world coords. output: plot coords
      End

c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c		    ########         BOXER 	    ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c

      Subroutine Boxer (nbracket,xl,xr,yl,yr,dx,dy),13
      Implicit None
      Integer	nbracket
      Real	xl,yl,xr,yr,dx,dy
c
      If (nbracket.EQ.1) Then
	Call Xpenup (xl,yl+dy)
	Call Xpendn (xl,yl)
	Call Xpendn (xl+dx,yl)
c
	Call Xpenup (xr-dx,yl)
	Call Xpendn (xr,yl)
	Call Xpendn (xr,yl+dy)
c
	Call Xpenup (xr,yr-dy)
	Call Xpendn (xr,yr)
	Call Xpendn (xr-dx,yr)
c
	Call Xpenup (xl+dx,yr)
	Call Xpendn (xl,yr)
	Call Xpendn (xl,yr-dy)
c
      Else
	Call Xbox   (xl,xr,yl,yr)
      End If
      End
c
c
c
c
c
c		    ########################################
c		    ########################################
c		    ########################################
c		    ########			    ########
c		    ########         MYLINE 	    ########
c		    ########			    ########
c		    ########################################
c		    ########################################
c		    ########################################
c
c

      Subroutine MyLine (x1,y1,x2,y2) 13,2
      Implicit None
      Real      x1,y1,x2,y2
      Call Xpenup (x1,y1)
      Call Xpendn (x2,y2)
      End
c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########         PCURVES        ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c

      Subroutine Pcurves (px1,px2,py1,py2, xmin,xmax,ymin,ymax, ifclip, 2,38
     >  labelx,xlabel,fmtxax,xinc, labely,ylabel,fmtyax,yinc,
     >  n,ncurv,x1,y1,y2,y3,y4, l1,l2,l3,l4, lc1,lc2,lc3,lc4)
      Implicit None
c
c  labelx:
c    0: plot/label B, plot T
c    1: plot/label B
c    2: plot B
c    3: plot T
c    4: plot T,B
c
c  labely:
c    0: no y axis
c   -1: plot/label on L
c   -2: plot/label on R
c    1: also plot on R
c    2: also plot on L
c
c  xinc,yinc	= Axis tick intervals. Use 0 for default.
c
c
      Integer	n,ncurv, labelx,labely,ifclip,
     >  l1,l2,l3,l4, n1,n2, i,nn, lc1,lc2,lc3,lc4
      Real	px1,px2,py1,py2, pxc,pyc, 
     >  xmin,xmax,xinc, ymin,ymax,yinc, xx,yy, 
     >  x1(n), y1(n), y2(n), y3(n), y4(n) 
      Character*(*) xlabel,fmtxax,ylabel,fmtyax
c
      Call Xwdwof
      Call Xaxdef
      Call Xaxfmt ('*')
c     Call Xaxtik (1,1)
c     Call Xaxant (-1,-1)
      Call Xthick (1)
      Call Xfull
c
c     Print 9001, 'Pcurves: px1,px2,py1,py2: ', px1,px2,py1,py2
c     Print 9001, 'Pcurves: xmin,xmax,ymin,ymax: ', xmin,xmax,ymin,ymax
 9001 Format (1x,a,4g14.4)
      Call Xpspac (px1,px2,py1,py2)
      Call Xmap   (xmin,xmax,ymin,ymax)
c
c  x axis
c
      If ((labelx.GE.0 .AND. labelx.LE.2) .OR. labelx.EQ.4) Then
	Call Xaxdef
        Call Xaxant (0,1)
        Call Xaxfmt (fmtxax)
	If (labelx.LE.1) Then
          pxc	= px1 + .5 * (px2-px1)
	  pyc	= Max (0., py1-0.06)
          Call Xaxant (-1,1)
          Call Plt2Wrld (pxc,pyc,xx,yy)
          Call Xcharc (xx,yy,xlabel)
	End If
        Call Xaxisx (xmin, ymin, xinc)	!label bot
      End If
c
      If (labelx.EQ.0 .OR. labelx.EQ.3 .OR. labelx.EQ.4) Then
        Call Xaxtik (-1,1)
        Call Xaxant (0,1)
        Call Xaxisx (xmin, ymax, xinc)	!label top
      End If
c
c  y axis
c
      Call Xaxdef
c
c     yinc	= 0.
c     If (py2-py1.LE.0.15) Then
cIf (ymax-ymin.LE.5.01) Then
c  yinc = 1.
cElse If (ymax-ymin.LE.10.01) Then
c  yinc = 2.
c       End If
c     End If
c     If (yinc.NE.0.) Print *, '% Pcurves: yaxis inc: ', yinc
c
      If (Abs(labely).EQ.1) Then
        Call Xaxfmt (fmtyax)
        Call Xaxisy (xmin, ymin, yinc)
        pyc	= py1 + .5 * (py2-py1)
	pxc	= Max (0., px1-0.06)
        Call Plt2Wrld (px1-0.06,pyc,xx,yy)
        Call Xchori (90.)
        Call Xcharc (xx,yy,ylabel)
        Call Xchori (0.)
c
	If (labely.GT.0) Then
        Call Xaxtik (1,-1)
        Call Xaxant (1,0)
        Call Xaxisy (xmax, ymin, yinc)
	End If
      Else If (Abs(labely).EQ.2) Then
        pyc	= py1 + .5 * (py2-py1)
	pxc	= Min (1., px2+0.06)
        Call Xaxfmt (fmtyax)
        Call Xaxtik (1,-1)
        Call Xaxant (1,1)
        Call Xaxisy (xmax, ymin, yinc)
        pyc	= py1 + .5 * (py2-py1)
        Call Plt2Wrld (pxc,pyc,xx,yy)
        Call Xchori (-90.)
        Call Xcharc (xx,yy,ylabel)
        Call Xchori (0.)
c
	If (labely.GT.0) Then
        Call Xaxtik (1,1)
        Call Xaxant (1,0)
        Call Xaxisy (xmin, ymin, yinc)
	End If
      End If
c
c  clip
c  always clip the x axis
c
      If (ifclip.NE.0) Call Xwindw (xmin,xmax,ymin,ymax)
      n1	= 1
      n2	= n
      Do i=1,n
      If (xmin.LE.x1(i)) Then 
      n1	= i
      Go To 1001
      End If
      End Do
 1001 Continue
c
      Do i=n,1,-1
      If (xmax.GE.x1(i)) Then
      n2	= i
      Go To 1002
      End If
      End Do
 1002 Continue
c
      nn	= n2 - n1 + 1
      If (nn.NE.n) 
     >  Print '(1p,2(1x,a,i4,g12.4))', 
     >  'Pcurves: plotting points ', n1,x1(n1), 'through ', n2,x1(n2)
c
c  Plot curves
c
      If (ncurv.LT.1) Go To 1000
c     print *, '...curve 1'
      Call Lintyp (l1)
      Call Color (lc1)
      Call Xcurve (x1(n1), y1(n1), nn, 0)
c 
      If (ncurv.LT.2) Go To 1000
c     print *, '...curve 2'
      Call Lintyp (l2)
      Call Color (lc2)
      Call Xcurve (x1(n1), y2(n1), nn, 0)
c 
      If (ncurv.LT.3) Go To 1000
c     print *, '...curve 3'
      Call Lintyp (l3)
      Call Color (lc3)
      Call Xcurve (x1(n1), y3(n1), nn, 0)
c 
      If (ncurv.LT.4) Go To 1000
c     print *, '...curve 4'
      Call Lintyp (l4)
      Call Color (lc4)
      Call Xcurve (x1(n1), y4(n1), nn, 0)
c
 1000 Continue
      Call Xwdwof
      Call Color (0)
      Call Lintyp (0)
c
      End 
c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########         LINTYP         ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c

      Subroutine Lintyp (l) 8,5
      Implicit None
      Integer l, ll
c
c
c  LINE TYPES:
c    (negative: bold)
c    0 default
c    1 full
c    2 dash
c    3 dot
c    4 my dot
c    5 my dash
c    6 my dash-dot
c
c
      If (l.GE.0) Then
	Call Xthick (1)
      Else
	Call Xthick (2)
      End If
c
      ll	= Abs (l)
      If (ll.LE.1) Then
        Call Xfull
      Else If (ll.EQ.2) Then
        Call Xdash
      Else If (ll.EQ.3) Then
        Call Xdot
      Else If (ll.EQ.4) Then
        Call Xbrokn (1,6,1,6)
      Else If (ll.EQ.5) Then
        Call Xbrokn (4,4,4,4)
      Else If (ll.EQ.6) Then
        Call Xbrokn (1,6,4,6)
      Else
	Call Xfull
      End If
c
      End
c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########          INC           ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c  Useful for setting max/min for plotting.
c

      Subroutine Inc (a, b, d, n)
c
      If (d.GT.0.) Then
        Do i=1,n
        If (b.GT.a) a = a + d
        End Do
      Else 
        Do i=1,n
        If (b.LT.a) a = a + d
        End Do
      End If
      End
c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########         LEGEND         ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c
c

      Subroutine Legend (nitems,strings,ltypes,lcolors, 3,12
     >  px1,py2,ibox,siz)
      Implicit None
c
      Integer nitems, ltypes(nitems), lcolors(nitems),
     >  ibox, i, lnb, Lnblnk
      Real	py1,py2,py3,py4, px1,px2,px3,px4, yy,y1,y2, dpx,dpy, 
     >  py,px, xx,x1,x2,x3,x4,x5, siz0,siz, pyl,yyl
      Character*(*) strings(nitems)
c
c  px1 = left edge, px2 = start of line, px3 = end of line, px4 = start of str
c
c     siz	= 0.02
      Call Xqchsz(siz0) !siz0 in mathematical space
      Call Xchmag(siz)	!siz in plotter space
c
      px	= px1
      dpy	= 1.2 * siz
      dpx	= 1.5 * siz
      px2	= px1 + dpx
      px3	= px2 + 3. * dpx
      px4	= px3 + 0.5 * dpx
      Call Plt2Wrld (px1,yy,x1,yy)
      Call Plt2Wrld (px2,yy,x2,yy)
      Call Plt2Wrld (px3,yy,x3,yy)
      Call Plt2Wrld (px4,yy,x4,yy)
      py	= py2 - 0.5 * dpy
c
      Do i=1,nitems
      py	= py - dpy
      pyl	= py + 0.3 * siz
      Call Lintyp (ltypes(i))
      Call Color (lcolors(i))
      Call Plt2Wrld (xx,py,xx,yy)
      Call Plt2Wrld (xx,pyl,xx,yyl)
      Call MyLine (x2,yyl,x3,yyl)
      lnb	= Lnblnk(strings(i))
      Call Xcharl (x4,yy,strings(i)(:lnb))
      End Do
c
      Call Xchsiz(siz0)	!siz0 in mathematical space
      Call Color (0)
      End
c
c
c
c
c                   ########################################
c                   ########################################
c                   ########################################
c                   ########                        ########
c                   ########        LABELER         ########
c                   ########                        ########
c                   ########################################
c                   ########################################
c                   ########################################
c
c

      Subroutine Labeler (xx,yy,zz,n, lftrgt,fmt,siz,ang) 1,3
      Implicit None
      Integer	n,k,Lnblnk,lftrgt,i_format
      Real	xx(n),yy(n),zz(n), siz,ang
      Character*(*) fmt
      Character*8 string
c
      Call Xchmag (siz)
      Call Xchori (ang)
c
c...Plot as integer or real, depending on format string
c
      i_format	= Index(fmt,'I') + Index(fmt,'i')
c
      Do k=1,n
      If (i_format.EQ.0) Then
        Write (string,fmt) zz(k)
      Else
        Write (string,fmt) Int(zz(k))
      End If
c
      If (lftrgt.EQ.0) Then
        Call Xcharr (xx(k),yy(k),string(:Lnblnk(string)+1))
      Else 
        Call Xcharl (xx(k),yy(k),string(:Lnblnk(string)))
      End If
      End Do
c
      Call Xchori (0.)
      End