program moocow
dimension a(20000)
integer*4 jwg_create_handle
parameter (ix=101,iy=101,iw=150,icolor=1,width=0.0)
jx=ix/2
jy=iy/2
sx=5.0/(1.0*jx)
sy=5.0/(1.0*jy)
do j=1,iy
y=(j-jy)*sy
k=iw*(j-1)
do i=1,ix
x=(i-jx)*sx
a(k+i)=sinc(r(x,y))
end do
end do
C Create a handle
C Args are format and filename
C format may currently be
C 0 for xfig files
C 1 for CGM files
C 2 for writing directly to the screen in portrait
C 3 for writing directly to the screen in landscape
C NB: These two are required as adding a matrix rotates the vectors
C which you would rotate back on the peice of paper using your hands
C monitors tend to be heavier.
C
ihandle=jwg_create_handle(0,'ex1.xfig')
C Pass data
C ix is the width
C iy is the height
C The offset into the array of (x,y) is calculated
C as x+iw*(y-1)
C
call jwg_pass_data(ihandle,a,ix,iy,iw)
C Set the transformation matrix to
C jwg_set_xform(handle,a,b,c,d,e,f) and
C jwg_add_xform(handle,a,b,c,d,e,f)
C
C Set the transformat matrix to, or
C conctenate the transform matrix with the matrix
C
C /c d a\
C M = |e f b|
C \0 0 1/
C
C (acts on vectors of the form (x,y,1))
C
C NB if the device is left handed it is safer to use
C jwg_add_xfrom as the initial matrix may not be the
C indentity matrix
C
C jwg_def_xform(handle) will reset the transfomration
C matrix to the default which gives a right handed user space.
C which (for an A4) extends from (0,0) to (1000,1414.21)
C use a rotation (-90 degres) to get landscape mode
C
C note also that push and pop can be used to store previous
C transform spaces.
C
C Transforms are concatenated from the right eg
C T_new=T_old M
C
call jwg_def_xform(ihandle)
C want landscape
call jwg_add_xform(ihandle,0.0,1414.2,0.0,1.0,-1.0,0.0)
C
C since the distance between elements of the array is 1
C and the contor plot will fill the space (1,1)-(101,101)
C te-he [don't you wish you had zero bassed arrays!]
C
C and we want to fit our contour plot into a fixed space (100,100)-(900,900)
C we need to adjust the transform matrix before we contour
C first we save the existing xform matrix using push then we scale
C by 800/(ix-1) and 800/(iy-1)
C and then fix the offset
C pushes the current state of the handle (colors,widths,densities,
C transformat matrix data etc..) onto a stack (unique to the
C particual handle) from which it can later be popped
C also pushes the current line onto a stack so we may
C start a new one...
sx=800.0/(1.0*(ix-1))
sy=800.0/(1.0*(iy-1))
call jwg_push_state(ihandle)
call jwg_add_xform(ihandle,101.0,101.0,sx,0.0,0.0,sy)
C now fix offset of one
call jwg_add_xform(ihandle,-1.0,-1.0,1.0,0,0,1.0)
C set pen attributes the pen is used to render lines
C jwg_set_pen(handle,red,green,blue,width)
C red,green,blue real*4 color intensity 0,0,0=black 1,1,1=white
C width is the width which will scale according to the determinant
C of the transform matrix. if the width is 0 this will produce the
C finest line that the format is capable of supporting.
C
C saturated green - thin lines
red=0.0
green=1.0
blue=0.0
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_pen(ihandle,red,green,blue,width)
C Draw in the 0 level contour
C
C jwg_contour(handle,level,side,line)
C
C level is the level of the contour.
C
C side (integer*4) controls how the contour is closed
C If side is 0 the contour is made of disjoint polylines.
C If |side|=1 then the contour is made of connected polygons which
C go clockwise for side=-1 and and anticlockwise for side=1 following
C the convention that points to the left of the lines are enclosed.
C [it's easier to try this both ways and see which works than to
C think about it.] Note that side doesn't control wheter polygons
C or lines are drawn.
C
C (for polygons) if side is +1 then the (shaded) inside of the
C contor encloses vales greater than level, if side is -1 then the
C inside of the contor encloses values less than level.
C
C line (integer*4) is non zero to draw lines and zero to draw polygons
C [which will neccessarily be closed]
C
C jwg_contour assumes that your data is small compared with 1.0e20
C near the boundaries of the box your are contouring. If this is not
C true - worry.
C Start from the most negative end and head upwards
C
do i=1,10
clevel=1*((11-i)*0.1)
red=1.0
green=(i*0.1)-0.1
blue=(i*0.1)-0.1
C obviously we get grey if we have equal ammounts of red green and blue
C by convention to get the grey version (luminance of a color) we use
C the following formula from the NTSC. This is irrelavant you could.
C use anything you liked.
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_brush(ihandle,red,green,blue,0.0)
call jwg_contour(ihandle,clevel,1,0)
red=1.0
green=0.0
blue=0.0
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_pen(ihandle,red,green,blue,width)
call jwg_contour(ihandle,clevel,0,1)
end do
do i=1,10
clevel=(-i*0.1)*1
red=1.0-i*0.2
green=1.0-i*0.2
blue=1.0
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_brush(ihandle,red,green,blue,0.0)
call jwg_contour(ihandle,clevel,1,0)
red=0.0
green=0.0
blue=1.0
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_pen(ihandle,red,green,blue,width)
call jwg_contour(ihandle,clevel,0,1)
end do
red=0.0
green=1.0
blue=0.0
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_pen(ihandle,red,green,blue,width)
call jwg_contour(ihandle,0.0,0,1)
C empty the stack - this restores the previous transform matrix.
call jwg_pop_state(ihandle)
C Now draw a nice box round the countor plot - but in a pervese
C way to show pushing/poping of current lines
C
C jwg_add_point(handle,x,y) adds a point to the current path
C whose length is limited only by available memory
C jwg_reset_point(handle) may be used to remove all points
C from the current path
C jwg_close_line(handle) turns the path into a line and
C resets the path. (line drawn in current pen)
C jwg_close_polygon(handle) (what do you think?)
C
C NB: jwg_push_state pushes the current path - but gives
C a new empty path in the new state. This is not what happens
C to other things like pen color.
C
C black pen
call jwg_set_pen(ihandle,0.0,0.0,0.0,width)
C for the paranoid
call jwg_reset_point(ihandle)
call jwg_add_point(ihandle,100.0,100.0)
call jwg_add_point(ihandle,100.0,900.0)
C
C Halfway trough drawing this box were going to draw
C another box arround the first one
C
call jwg_push_state(ihandle)
C make this a red line
red=1.0
green=0.0
blue=0.0
if (icolor.eq.0) then
gray=red*0.35+0.54*green+0.11*blue
red=gray
green=gray
blue=gray
endif
call jwg_set_pen(ihandle,red,green,blue,width)
call jwg_add_point(ihandle,90.0,90.0)
call jwg_add_point(ihandle,90.0,910.0)
call jwg_add_point(ihandle,910.0,910.0)
call jwg_add_point(ihandle,910.0,90.0)
call jwg_add_point(ihandle,90.0,90.0)
call jwg_close_line(ihandle)
call jwg_pop_state(ihandle)
C
C Now we'll finish off the box. which is black
C
call jwg_add_point(ihandle,900.0,900.0)
call jwg_add_point(ihandle,900.0,100.0)
call jwg_add_point(ihandle,100.0,100.0)
call jwg_close_line(ihandle)
C now draw a box round the whole page
call jwg_add_point(ihandle,0.0,0.0)
call jwg_add_point(ihandle,1414.21,0.0)
call jwg_add_point(ihandle,1414.21,1000.0)
call jwg_add_point(ihandle,0.0,1000.0)
call jwg_add_point(ihandle,0.0,0.0)
call jwg_close_line(ihandle)
C and a slash across the middle
widthmy=100.0
call jwg_set_pen(ihandle,red,green,blue,widthmy)
call jwg_add_point(ihandle,500.0,1000.0)
call jwg_add_point(ihandle,500.0,0.0)
call jwg_close_line(ihandle)
C check scaling
call jwg_add_xform(ihandle,0.0,0.0,10.0,0,0,10.0)
widthmy=10.0
call jwg_set_pen(ihandle,red,green,blue,widthmy)
call jwg_add_point(ihandle,80.0,100.0)
call jwg_add_point(ihandle,80.0,0.0)
call jwg_close_line(ihandle)
C check text
call jwg_set_textcolor(ihandle,0.0,0.0,0.0)
call jwg_set_textheight(ihandle,10.0)
call jwg_draw_text(ihandle,30.0,0.0,"MOOCOW ")
call jwg_add_xform(ihandle,0.0,0.0,0.1,0,0,0.1)
call jwg_set_textcolor(ihandle,0.0,0.0,0.0)
C call jwg_set_textheight(ihandle,100.0)
call jwg_draw_text(ihandle,300.0,300.0,"MOOCOW ")
call jwg_set_textcolor(ihandle,0.0,0.0,0.0)
call jwg_set_textheight(ihandle,100.0)
call jwg_draw_text_matrix(ihandle,300.0,600.0,0.0,1.0,
C -1.0,0.0,"MOOCOW ")
C deallocate the resources associated with the data
C NB this needs to be done at the same level of push/pop where the
C the data resources were allocated - (otherwise nasty things might
C happen)
call jwg_destroy_data(ihandle)
call jwg_destroy_handle(ihandle)
end
function r(x,y)
r=sqrt((x*x)+(y*y))
return
end
function sinc(a)
if(a.ne.0.)then
sinc=sin(a)/a
else
sinc=1.0
endif
return
end