home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / plot / splot57.arc / SURFGEN.BAS < prev   
BASIC Source File  |  1989-08-15  |  4KB  |  99 lines

  1. 10 REM  PROGRAM SURFGEN GENERATES VALUES OF A FUNCTION OF TWO VARIABLES.
  2. 20 REM  THE PROGRAM WRITES THE VALUES ALONG WITH PLOT COMMANDS TO A FILE
  3. 30 REM  NAMED SURFDATA.PLT; THE VALUES ARE THEN PLOTTED BY USING THE SHELL
  4. 40 REM  COMMAND TO RUN THE SPLOT PROGRAM.
  5. 50 REM
  6. 60 REM  COPYRIGHT 1988, 1989 BY WILLIAM G. HOOD
  7. 70 REM
  8. 80 REM  WARNING: DO NOT RENUMBER!
  9. 90 REM
  10. 100 CLS: KEY OFF
  11. 105 DIM Z.(201), X.(201)
  12. 110 PRINT"This program plots a function of two variables defined by a"
  13. 120 PRINT"subroutine which follows the main program.  The subroutine must"
  14. 130 PRINT"set dependent variable Y equal to a function evaluated at the"
  15. 140 PRINT"current value of the independent variables X and Z."
  16. 150 PRINT
  17. 160 INPUT"Do you want to see current function (N/Y)"; A$: A$=LEFT$(A$,1)
  18. 170 IF A$="Y" OR A$="y" THEN CLS: LIST 1000-1999: END
  19. 180 REM
  20. 190 OPEN "SURFDATA.PLT" FOR OUTPUT AS #2
  21. 200 PRINT: LINE INPUT"Title? "; TITLE$: PRINT#2,"TITLE "+TITLE$
  22. 205 PRINT: LINE INPUT"Z-Axis Label? ";LZ$: PRINT#2,"ZLABEL "+LZ$
  23. 215 LINE INPUT"X-Axis Label? ";LX$: PRINT#2,"XLABEL "+LX$
  24. 220 LINE INPUT"Y-Axis Label? ";LY$: PRINT#2,"YLABEL "+LY$
  25. 222 PRINT: INPUT"Log Z-Axis (N/Y)"; A$: A$=LEFT$(A$,1)
  26. 224 IF A$="Y" OR A$="y" THEN PRINT#2,"LOGZ"
  27. 230 INPUT"Log X-Axis (N/Y)"; A$: A$=LEFT$(A$,1)
  28. 240 IF A$="Y" OR A$="y" THEN PRINT#2,"LOGX"
  29. 250 INPUT"Log Y-Axis (N/Y)"; A$: A$=LEFT$(A$,1)
  30. 260 IF A$="Y" OR A$="y" THEN PRINT#2,"LOGY"
  31. 290 REM
  32. 300 PRINT: PRINT"Enter initial value, final value & step size of ";
  33. 305 PRINT"independent variable Z"
  34. 310 INPUT V$: IF V$ <> "" GOTO 320
  35. 315     INPUT"Initial Value, Final Value, Step Size"; V$: IF V$="" GOTO 315
  36. 320   P=1: GOSUB 680: ZI. = V: GOSUB 680: ZF. = V: GOSUB 680: ZS. = V
  37. 325   IF ZS. <= 0 THEN PRINT"ERROR: INVALID STEP SIZE": GOTO 315
  38. 330   NZ. = INT( (ZF.-ZI.)/ZS. + 1.5 )
  39. 335   IF NZ. < 2 THEN PRINT"ERROR: INVALID RANGE": GOTO 315
  40. 340   IF NZ. > 201 THEN PRINT"ERROR: TOO MANY POINTS - MAX OF 201": GOTO 315
  41. 350 PRINT: PRINT"Enter initial value, final value & step size of ";
  42. 355 PRINT"independent variable X"
  43. 360 INPUT V$: IF V$ <> "" GOTO 370
  44. 365     INPUT"Initial Value, Final Value, Step Size"; V$: IF V$="" GOTO 365
  45. 370   P=1: GOSUB 680: XI. = V: GOSUB 680: XF. = V: GOSUB 680: XS. = V
  46. 375   IF XS. <= 0 THEN PRINT"ERROR: INVALID STEP SIZE": GOTO 365
  47. 380   NX. = INT( (XF.-XI.)/XS. + 1.5 )
  48. 385   IF NX. < 2 THEN PRINT"ERROR: INVALID RANGE": GOTO 365
  49. 390   IF NX. > 201 THEN PRINT"ERROR: TOO MANY POINTS - MAX OF 201": GOTO 365
  50. 395 REM
  51. 470 PRINT:PRINT"Calculating ... Please wait ..."
  52. 475 PRINT#2,"READZ ";NZ.
  53. 480 FOR I.=1 TO NX. : X.(I.) = XI. + (I.-1)*XS. : NEXT I.
  54. 482 FOR I.=1 TO NZ. : Z.(I.) = ZI. + (I.-1)*ZS. : PRINT#2, Z.(I.) : NEXT I.
  55. 484 PRINT#2,"READTAB ";NZ.;" ";NX.
  56. 490 FOR I.=1 TO NX.
  57. 500   X = X.(I.)
  58. 505   PRINT#2, X.(I.);
  59. 510   FOR J.=1 TO NZ.
  60. 512     Z = Z.(J.): GOSUB 1100: PRINT#2," ";Y;
  61. 514     IF ( J. AND 3 ) = 0 OR J. = NZ. THEN PRINT#2,""
  62. 516   NEXT J.
  63. 520 NEXT I.
  64. 545 PRINT#2,"PLOT3D"; : IF NZ. > 20 THEN PRINT#2," SURFACE";
  65. 546 PRINT#2,"" : PRINT#2,"KEYBOARD"
  66. 550 CLOSE#2
  67. 560 REM
  68. 570 PRINT:PRINT"Press the ENTER key to display the plot";
  69. 580 PRINT" - press the ESC key to clear the plot."
  70. 590 A$=INKEY$: IF A$<>"" GOTO 590
  71. 600 A$=INKEY$: IF A$="" GOTO 600
  72. 610 IF ASC(A$)<>13 GOTO 600
  73. 620 SHELL( "SPLOT SURFDATA.PLT" )
  74. 630 END
  75. 670 REM EXTRACTS V FROM V$ STARTING AT POSITION P
  76. 680 P2=LEN(V$)
  77. 690 IF MID$(V$,P,1)=" " AND P<=P2 THEN P=P+1: GOTO 690
  78. 700 P0=P: IF P0>P2 THEN V=0: RETURN
  79. 710 IF MID$(V$,P,1)<>" " AND P<=P2 THEN P=P+1: GOTO 710
  80. 720 V = VAL( MID$( V$, P0, P-P0 ) )
  81. 730 RETURN
  82. 1000 REM
  83. 1010 REM NOTE: To avoid conflict with main program variables,
  84. 1020 REM       do not use variable names that contain a period.
  85. 1030 REM
  86. 1100 REM Subroutine must set variable Y = function(X,Z) after this line #
  87. 1110 REM Insert here GOTO 1210 to plot another functions
  88. 1120 REM Let X and Z vary from -12.5 to 12.5 with a step of .5 or .25
  89. 1130 R = SQR( X*X + Z*Z ): GOSUB 1160: Y = S
  90. 1140 RETURN
  91. 1150 REM S = SINC( R )
  92. 1160 IF R <> 0 THEN S = SIN(R) / R ELSE S = 1
  93. 1170 RETURN
  94. 1200 REM Let X and Z vary from -90 to +90 with a step of 6 or 3
  95. 1210 R = 9 * SIN( 1.745329E-02 * Z ): GOSUB 1160: YZ = S
  96. 1220 R = 6 * SIN( 1.745329E-02 * X ): GOSUB 1160: YX = S
  97. 1230 Y = YZ * YX
  98. 1240 RETURN
  99.