Part 2.
integer function pl_cb()
character(len=30) cb_reason
integer i,j,k, x1p, y1p, jj, kk
real(kind=dp) x1r,y1r, x1rr, y1rr
character(len=30) output_string(4)
character(len=20), parameter :: fmt1='(SP,F7.3,1A,F7.3) ', fmt2='(SP,2X,A2,1X,F7.3) '
cb_reason = clearwin_string@('callback_reason')
if (cb_reason .eq. 'PLOT_ADJUST') i = COPY_GRAPHICS_REGION@(handle_internal_gr, 1, 1, gw, gh, handle_pl, 1, 1, gw, gh, 13369376 )
if (cb_reason .eq. 'MOUSE_MOVE' ) then
x1p = CLEARWIN_INFO@('GRAPHICS_MOUSE_X') ; y1p = CLEARWIN_INFO@('GRAPHICS_MOUSE_Y')
i = GET_PLOT_DATA@(x1p,y1p,x1r,y1r)
write(output_string(1),fmt1) x1r,',',y1r
j = minloc(abs(x_array - x1r), 1) ; k = minloc(abs(y_array - y1r), 1)
write(output_string(2),fmt1) x_array(j),',',y_array(k)
i = COPY_GRAPHICS_REGION@(handle_pl, 1, 1, gw, gh, handle_internal_gr, 1, 1, gw, gh, 13369376 )
i = GET_PLOT_POINT@(x_array(j),y_array(k),x1r,y1r) !returns real*8 not integer
x1p = nint(x1r) ; y1p = nint(y1r)
call draw_grid_point(x1p,y1p,16,rgb@(255,0,0),1)
do jj = j - 1, j + 1, 1
do kk = k - 1, k + 1, 1
if (jj .lt. 1) then ; cycle
else if (kk .lt. 1) then ; cycle
else if (kk .gt. size(x_array)) then ; cycle
else if (jj .gt. size(y_array)) then ; cycle
else if (jj .eq. j .and. kk .eq. k) then ; cycle
else
i = GET_PLOT_POINT@(x_array(jj),y_array(kk),x1rr,y1rr)
call draw_grid_point(nint(x1rr),nint(y1rr),8,rgb@(200,200,200),0)
end if
end do
end do
i = xy(j,k)
write(output_string(3),fmt2) 'dx',dx(i)
write(output_string(4),fmt2) 'dy',dy(i)
call draw_filled_rectangle@(x1p+10, y1p+10, x1p+150+10, y1p+20+60, rgb@(255,255,0))
call draw_rectangle@(x1p+10, y1p+10, x1p+150+10, y1p+20+60, rgb@(125,125,125))
call draw_characters@(output_string(1), x1p+10, y1p+15, rgb@(0,0,0))
call draw_characters@(output_string(2), x1p+10, y1p+30, rgb@(255,0,0))
call draw_characters@(output_string(3), x1p+10, y1p+45, rgb@(0,0,255))
call draw_characters@(output_string(4), x1p+10, y1p+60, rgb@(0,0,255))
end if
pl_cb = 2
end function pl_cb
subroutine draw_grid_point(x,y,size,colour,flag)
integer, intent(in):: x,y,size,colour,flag
integer k
call set_line_width@(2)
call draw_line_between@(x-size,y,x+size,y,colour) ; call draw_line_between@(x,y-size,x,y+size,colour)
if (flag .eq. 1) then ; k = nint(dble(size)/2.d0) ; call draw_ellipse@(x,y,k,k,colour) ; end if
end subroutine draw_grid_point
end module example
program main
use example
implicit none
integer i
i = generate_data() ; i = plot()
end program main