! *********************************************** ! ** (c) Interactive Software Services Ltd and ** ! ** Lahey Computer Systems Inc. 1997-2002 ** ! ** ----------------------------------------- ** ! ** This demonstration program source may be ** ! ** modified for training and for product ** ! ** familiarisation. ** ! ** ----------------------------------------- ** ! ** Purpose : Draw simple graphs ** ! *********************************************** ! ! Graphs demo for WINTERACTER Starter Kit ! PROGRAM GRAPH ! USE WINTERACTER ! IMPLICIT NONE ! INTEGER, PARAMETER :: IDR_MENU1 = 30001 INTEGER, PARAMETER :: ID_LINE = 40001 INTEGER, PARAMETER :: ID_SCAT = 40002 INTEGER, PARAMETER :: ID_EXIT = 40003 ! INTEGER :: IPICTURE,ITYPE TYPE(WIN_STYLE) :: WINDOW TYPE(WIN_MESSAGE) :: MESSAGE ! INTERFACE SUBROUTINE DrawGraph() IMPLICIT NONE END SUBROUTINE DrawGraph SUBROUTINE DrawScatterPlot() IMPLICIT NONE END SUBROUTINE DrawScatterPlot END INTERFACE ! ! Initialise WiSK ! CALL WInitialise() IPICTURE = 1 ! ! Open root window and put initial data in it ! CALL WindowOpen(FLAGS =SysMenuOn + MinButton + MaxButton, & MENUID=IDR_MENU1, & TITLE ='WiSK Graph Plotting') CALL DrawGraph() ! ! Loop forever until user terminates ! DO CALL WMessage(ITYPE, MESSAGE) SELECT CASE (ITYPE) ! ! Menu item message ! CASE (MenuSelect) CALL WindowClear() SELECT CASE (MESSAGE%VALUE1) CASE (ID_LINE) ! Draw line graph CALL DrawGraph() IPICTURE = 1 CASE (ID_SCAT) ! Draw scatter plot CALL DrawScatterPlot() IPICTURE = 2 CASE (ID_EXIT) ! Exit program EXIT END SELECT ! ! Redisplay data if we get an expose or resize event ! CASE (Expose,Resize) IF (IPICTURE==1) THEN CALL DrawGraph() ELSE IF (IPICTURE==2) THEN CALL DrawScatterPlot() END IF ! ! Close window ! CASE (CloseRequest) EXIT END SELECT END DO ! STOP END PROGRAM GRAPH ! SUBROUTINE DrawGraph() ! ! Draw a simple line graph ! USE WINTERACTER ! IMPLICIT NONE ! REAL, DIMENSION(10) :: X=(/ 5.0,15.0,25.0,30.0,35.0, & 50.0,55.0,75.0,80.0,95.0/) REAL, DIMENSION(10) :: Y=(/ 7.0,10.0,20.0,30.0,40.0, & 50.0,60.0,70.0,80.0,90.0/) INTEGER :: IX ! INTERFACE SUBROUTINE IAxes(X1,X2,XSTEP,Y1,Y2,YSTEP,TITLE) IMPLICIT NONE REAL , INTENT (IN) :: X1,X2,XSTEP,Y1,Y2,YSTEP CHARACTER (LEN=*), INTENT(IN) :: TITLE END SUBROUTINE IAxes END INTERFACE ! ! Clear window ! CALL WindowClear() ! ! Draw axes ! CALL IAxes(0.,100.,20.,0.,100.,20.,'Line Plot') ! ! Draw graph lines ! CALL IGrLineType(SolidLine) CALL IGrColourN(191) CALL IGrMoveTo(0.0,0.0) DO IX = 1,10 CALL IGrLineTo(X(IX),Y(IX)) END DO ! ! Change the line type to Dots ! CALL IGrLineType(Dotted) CALL IGrColourN(31) CALL IGrMoveTo(0.0,0.0) DO IX = 1,10 CALL IGrLineTo(SQRT(X(IX)),Y(IX)) END DO ! ! Change the line type to Dashes ! CALL IGrLineType(Dashed) CALL IGrColourN(159) CALL IGrMoveTo(0.0,0.0) DO IX = 1,10 CALL IGrLineTo(X(IX),SQRT(Y(IX))) END DO RETURN END SUBROUTINE DrawGraph ! SUBROUTINE DrawScatterPlot() ! ! Draw a scatter plot ! USE WINTERACTER ! IMPLICIT NONE ! INTEGER, PARAMETER :: NPOINTS = 100 INTEGER :: IPOINT REAL :: RAND,XPOS,YPOS,XMAX,YMAX ! INTERFACE SUBROUTINE IAxes(X1,X2,XSTEP,Y1,Y2,YSTEP,TITLE) IMPLICIT NONE REAL , INTENT (IN) :: X1,X2,XSTEP,Y1,Y2,YSTEP CHARACTER (LEN=*), INTENT(IN) :: TITLE END SUBROUTINE IAxes END INTERFACE ! ! Clear window ! CALL WindowClear() ! ! Draw axes ! XMAX = 100.0 YMAX = 10. CALL IAxes(0.0,XMAX,20.,0.0,YMAX,1.0,'Scatter Plot') ! CALL WGrTextFont(FFCourier,WIDTH=.0066,HEIGHT=.02) ! ! Draw a scatter plot ! DO IPOINT = 1,NPOINTS ! ! Cluster of points towards top left ! CALL random_number(RAND) XPOS = RAND*XMAX*0.6 CALL random_number(RAND) YPOS = YMAX*0.4 + RAND*YMAX*0.6 CALL IGrColourN(160) CALL WGrTextString(XPOS,YPOS,'x') ! ! Cluster of points towards lower right ! CALL random_number(RAND) XPOS = XMAX*0.4 + RAND*XMAX*0.6 CALL random_number(RAND) YPOS = RAND*YMAX*0.6 CALL IGrColourN(30) CALL WGrTextString(XPOS,YPOS,'o') END DO RETURN END SUBROUTINE DrawScatterPlot ! SUBROUTINE IAxes(X1,X2,XSTEP,Y1,Y2,YSTEP,TITLE) ! ! Draw and annotate axes ! USE WINTERACTER ! IMPLICIT NONE ! REAL, INTENT (IN) :: X1,X2,XSTEP,Y1,Y2,YSTEP CHARACTER (LEN=*), INTENT(IN) :: TITLE ! CHARACTER(LEN=4) :: STRING REAL :: XBORDER,YBORDER,XTICK,YTICK ! ! Set up user defined co-ordinate system ! XBORDER = (X2 - X1)*0.1 YBORDER = (Y2 - Y1)*0.1 CALL IGrUnits(X1-XBORDER,Y1-YBORDER,X2+XBORDER,Y2+YBORDER) ! ! Draw axis lines ! CALL IGrLineType(SolidLine) CALL IGrColourN(223) CALL IGrMoveTo(X1,Y2) CALL IGrLineTo(X1,Y1) CALL IGrLineTo(X2,Y1) ! ! Select font (size is independent of user units) ! CALL WGrTextFont(FFHelvetica,WIDTH=0.017,HEIGHT=.048) ! ! Draw some annotation on the X-axis ! CALL WGrTextOrientation(AlignCentre) XTICK = X1 + XSTEP DO WHILE (XTICK