home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol181 / mxplot.bas < prev    next >
Encoding:
BASIC Source File  |  1985-02-10  |  13.3 KB  |  305 lines

  1. 10 REM *************************************************************
  2. 20 REM *               MXPLOT.BAS  AWT 12/26/83                    *
  3. 30 REM *               VERSION 1.0                                 *
  4. 40 REM *               FOR MX-100 OR SIMILAR PRINTER               *
  5. 50 REM *               MAKES DIFFERENT PLOT SIZES                  *
  6. 60 REM *               BE BRAVE, RUN FIRST                         *
  7. 70 REM *               BASED ON BREGOLI'S PROGRAM                  *
  8. 80 REM *************************************************************
  9. 90 REM GET FILE VECTORS TO PLOT
  10. 100 DIM Y(101),X(101):REM         
  11. 110 REM !MACHINE DEPENDENCE!----------------------------------------
  12. 120 MAXWIDTH=233:WIDTH LPRINT MAXWIDTH 'SET MX100 COMPRESSED WIDTH
  13. 130 XTIC=4 :YTIC=2 :XDIV=25:YDIV=50 ' DEFAULT GRAPH SIZE
  14. 140 REM ------------------------------------------------------------
  15. 150 XSPAN=XTIC*XDIV
  16. 160 YSPAN=YTIC*YDIV
  17. 170 INPUT "DO YOU WISH TO CHANGE THE GRAPH SIZE ? (Y/N) ",A$
  18. 180 PRINT
  19. 190 IF NOT A$="Y" THEN GOTO 310
  20. 200    PRINT "CURRENT MAJOR DIVISIONS X AXIS=",XTIC
  21. 210    PRINT "CURRENT MINOR DIVISIONS X AXIS=",XDIV
  22. 220    INPUT "NUMBER OF MAJOR DIVISIONS ON X AXIS? ",XTIC
  23. 230    INPUT "NUMBER OF MINOR DIVISIONS PER MAJOR DIVISION? ",XDIV
  24. 240    XSPAN=XTIC*XDIV:IF XSPAN>MAXWIDTH THEN PRINT "ERROR- EXCEEDED WIDTH":GOTO 220
  25. 250    PRINT "CURRENT MAJOR DIVISIONS Y AXIS=",YTIC
  26. 260    PRINT "CURRENT MINOR DIVISIONS Y AXIS=",YDIV
  27. 270    INPUT "NUMBER OF MAJOR DIVISIONS ON Y AXIS? ",YTIC
  28. 280    INPUT "NUMBER OF MINOR DIVISIONS PER MAJOR DIVISION? ",YDIV
  29. 290 YSPAN=YTIC*YDIV
  30. 300 PRINT
  31. 310 PRINT "SELECT FORM OF DATA INPUT"
  32. 320 PRINT "0. EXIT PROGRAM RETURN TO BASIC"
  33. 330 PRINT "1. FROM EXTERNAL FILE"
  34. 340 PRINT "2. FROM EQUATIONS EMBEDDED IN THE CODE (OR DEMO)"
  35. 350 PRINT "3. FROM TYPED IN DATA SET"
  36. 360 PRINT "4. DATA PREVIOUSLY PLOTTED THIS RUN"
  37. 370 INPUT "SELECTION IS (NUMBER):",SN
  38. 380 IF SN=0 THEN GOTO 410
  39. 390 ON SN GOSUB 420,670,520,830
  40. 400 GOTO 170
  41. 410 END
  42. 420 PRINT:INPUT "ENTER THE DATAFILE (NAME5678.TYP)",A$
  43. 430 OPEN #1,"I",A$
  44. 440 I=0
  45. 450 WHILE NOT EOF
  46. 460   INPUT #1,X(I),Y(I):I=I+1
  47. 470 WEND
  48. 480 NPTS=I
  49. 490 CLOSE #1
  50. 500 GOSUB 830 'PLOT IT
  51. 510 RETURN
  52. 520 PRINT:INPUT "HOW MANY DATA PAIRS ";NPTS
  53. 530 FOR I=0 TO  NPTS-1
  54. 540  INPUT "ENTER X,Y PAIR ",X(I),Y(I)
  55. 550 NEXT I
  56. 560 GOTO 500 ' ARE NOT GOTO'S TERRIBLE
  57. 570 REM **************************************************************
  58. 580 REM *            PLOT PROGRAM FOR MX-80                          *
  59. 590 REM *                      BY                                    *
  60. 600 REM *              LAWRENCE J. BREGOLI                           *
  61. 610 REM *      AS MODIFIED FROM BYTE MAG. MAR '82                    *
  62. 620 REM **************************************************************
  63. 630 REM 
  64. 640 REM **************************************************************
  65. 650 REM *     USE THE FOLLOWING SPACE TO CALCULATE A 101 BY 101      *
  66. 660 REM *     DATA ARRAY IN X(I) AND Y(I).                           *
  67. 670 REM *     ENTER PROGRAM BELOW THIS SECTION IF ARRAY EXISTS       *
  68. 680 REM **************************************************************
  69. 690 REM
  70. 700 REM
  71. 710 REM                             SAMPLE ARRAY->CONCENTRIC CIRCLES
  72. 720 REM
  73. 730 REM DIM Y(101),X(101):REM          MOVE DIM TO MAIN PROGRAM
  74. 740 PI=3.1415928#
  75. 750 FOR I=0 TO 50
  76. 760 X(I)=SIN(I*2*PI/50):Y(I)=COS(I*2*PI/50)
  77. 770 NEXT I
  78. 780 FOR I=51 TO 100
  79. 790 J=I-50
  80. 800 X(I)=.5*SIN(J*6.282/50):Y(I)=.5*COS(J*6.282/50)
  81. 810 NEXT I
  82. 820 NPTS=101  ' NUMBER OF DATA POINTS
  83. 830 REM
  84. 840 REM **************************************************************
  85. 850 REM *     ENTER TITLE OF PLOT AND AXIS LEGENDS                   *
  86. 860 REM **************************************************************
  87. 870 REM
  88. 880 YTITLE$=SPACE$(YSPAN/2+1):XTITLE$=SPACE$(XSPAN+1):PTITLE$=SPACE$(XSPAN/2+1)
  89. 890 LINE INPUT "ENTER TITLE OF PLOT  ";T$
  90. 900 ST=LEN(PTITLE$)-LEN(T$):IF ST<0 THEN PRINT "TOO LONG! BY ";ABS(ST):GOTO 890
  91. 910 LINE INPUT "ENTER Y AXIS TITLE  ";Y$
  92. 920 SY=LEN(YTITLE$)-LEN(Y$):IF SY<0 THEN PRINT "TOO LONG! BY ";ABS(SY):GOTO 910
  93. 930 LINE INPUT "ENTER X AXIS TITLE  ";X$
  94. 940 SX=LEN(XTITLE$)-LEN(X$):IF SX<0 THEN PRINT "TOO LONG! BY ";ABS(SX):GOTO 930
  95. 950 MID$(YTITLE$,SY/2+1)=Y$
  96. 960 MID$(XTITLE$,SX/2+1)=X$
  97. 970 MID$(PTITLE$,ST/2+1)=T$
  98. 980 AUTOFLG=0 'NO AUTOSCALING
  99. 990 INPUT "DO YOU WANT (A)UTO OR (M)ANUAL SCALING ";Y$
  100. 1000 IF Y$="M" THEN 1030
  101. 1010 IF Y$="A" THEN AUTOFLG=-1 ELSE 990
  102. 1020 GOTO  1170
  103. 1030 INPUT "ENTER MAXIMUM VALUE OF Y AXIS";YMAX
  104. 1040 INPUT "ENTER MINIMUM VALUE OF Y AXIS";YMIN
  105. 1050 INPUT "ENTER MAXIMUM VALUE OF X AXIS";XMAX
  106. 1060 INPUT "ENTER MINIMUM VALUE OF X AXIS";XMIN
  107. 1070 REM
  108. 1080 REM **************************************************************
  109. 1090 REM *     MAIN BODY OF PROGRAM STARTS HERE                       *
  110. 1100 REM **************************************************************
  111. 1110 REM
  112. 1120 REM
  113. 1130 REM **************************************************************
  114. 1140 REM *    SPEED UP MODIFICATIONS USING SORT ROUTINE               *
  115. 1150 REM **************************************************************
  116. 1160 REM
  117. 1170 PRINT "*** GOING TO WORK ***":LPRINT:LPRINT:LPRINT TAB(13);PTITLE$'PLOT TITLE
  118. 1180 NM1=NPTS-1   'ARRAY STARTS AT ZERO
  119. 1190 XC$="-":YC$="|"
  120. 1200 TOP=NM1:TEMPTOP=NM1 'POINTER TO TOP OF DATA ARRAYS
  121. 1210 GOSUB 2730:REM                                 SORT DATA
  122. 1220 IF AUTOFLG THEN GOSUB 2400 ' AUTOSCALE
  123. 1230 LPRINT:LPRINT
  124. 1240 GOSUB 1590:REM                       SET COMPRESSED CHAR MODE
  125. 1250 LSPACE=2:GOSUB 1560:REM              SET LINE SPACING
  126. 1260 RSTOP=20:CHAR$=YC$:GOSUB 1630:REM    FORCE CARRIAGE LEFT
  127. 1270 YD=ABS((YMAX-YMIN)/YSPAN):REM           VALUE OF EACH LINE
  128. 1280 XD=ABS((XMAX-XMIN)/XSPAN)
  129. 1290 FOR LNNO=YSPAN TO 0 STEP -1            
  130. 1300 YN=YMAX-(((YMAX-YMIN)/YSPAN)*(YSPAN-LNNO)):REM  NORMALIZED Y VALUE
  131. 1310 GOSUB 2050:REM                       PRINT VERTICAL TITLE
  132. 1320 IF LNNO/2-FIX(LNNO/2)=O THEN GOSUB 1690:REM  PLOT VERTICAL LINES
  133. 1330 GOSUB 1800:REM                       PLOT DATA
  134. 1340 GOSUB 1940:REM                       PRINT HORIZONTAL LINE
  135. 1350 LPRINT
  136. 1360 RSTOP=20:CHAR$=YC$:GOSUB 1630:REM    FORCE CARRIAGE LEFT
  137. 1370 LPRINT
  138. 1380 NEXT LNNO
  139. 1390 GOSUB 2150:REM                       PRINT X SCALE
  140. 1400 GOSUB 2300"REM                       PRINT X AXIS TITLE
  141. 1410 LSPACE=12:GOSUB 1560:REM             SET NORMAL LINE SPACING
  142. 1420 GOSUB 1610:REM                       SET NORMAL CHAR WIDTH
  143. 1430 LPRINT CHR$(12) ' TOP OF NEXT FORM
  144. 1440 PRINT "***** COMPLETE ****";CHR$(7);CHR$(7)
  145. 1450 RETURN
  146. 1460 REM
  147. 1470 REM **************************************************************
  148. 1480 REM *    PLOT  SUPPORT    SUBROUTINES START HERE                 *
  149. 1490 REM **************************************************************
  150. 1500 REM
  151. 1510 REM
  152. 1520 REM **************************************************************
  153. 1530 REM *    PRINTER CONTROL SUBROUTINES !MACHINE DEPENDENCE!       *
  154. 1540 REM **************************************************************
  155. 1550 REM
  156. 1560 LPRINT CHR$(27)"A"CHR$(LSPACE):REM EDIT WITH GRAFTRAX OPTION
  157. 1570 RETURN:REM                                    SET LINE SPACING
  158. 1580 REM
  159. 1590 LPRINT CHR$(15):RETURN:REM                   SET COMPRESSED MODE
  160. 1600 REM
  161. 1610 LPRINT CHR$(18):RETURN:REM                    SET NORMAL MODE
  162. 1620 REM
  163. 1630 LPRINT SPC(RSTOP);CHAR$;:RETURN:REM          PRINT CHAR AT RSTOP
  164. 1640 REM
  165. 1650 REM **************************************************************
  166. 1660 REM *    PLOT VERTICAL LINE SUBROUTINE                           *
  167. 1670 REM **************************************************************
  168. 1680 REM
  169. 1690 CHAR$=YC$:RSTOP=20:LPRINT CHR$(13);:GOSUB 1630
  170. 1700 RSTOP=XDIV-1
  171. 1710 FOR I=1 TO XTIC
  172. 1720 GOSUB 1630
  173. 1730 NEXT I
  174. 1740 RETURN
  175. 1750 REM
  176. 1760 REM **************************************************************
  177. 1770 REM *    PLOT SORTED DATA SUBROUTINE                             *
  178. 1780 REM **************************************************************
  179. 1790 REM
  180. 1800 CHAR$="0"
  181. 1810 FOR I=TOP TO 0 STEP -1
  182. 1820 IF Y(I)>YN+.5*YD THEN 1880
  183. 1830 IF Y(I)<=YN-.5*YD THEN I=0:GOTO 1880
  184. 1840 TEMPTOP=I
  185. 1850 XP=FIX((X(I)-XMIN+.5*XD)*XSPAN/(XMAX-XMIN))
  186. 1860 IF XP<0 OR XP>XSPAN THEN 1880
  187. 1870 LPRINT CHR$(13);:RSTOP=XP+20:GOSUB 1630
  188. 1880 NEXT I:TOP=TEMPTOP:RETURN
  189. 1890 REM
  190. 1900 REM **************************************************************
  191. 1910 REM *       PLOT Y SCALE AND HORIZONTAL LINE SUBROUTINE          *
  192. 1920 REM **************************************************************
  193. 1930 REM
  194. 1940 IF LNNO/YDIV-FIX(LNNO/YDIV)<>0 THEN RETURN
  195. 1950 LPRINT CHR$(13);:RSTOP=10:CHAR$="":GOSUB 1630
  196. 1960 LPRINT USING "######.##";(YMAX-YMIN)*LNNO/YSPAN+YMIN;
  197. 1970 LPRINT CHR$(13);:RSTOP=20:CHAR$=XC$:GOSUB 1630
  198. 1980 LPRINT STRING$(XSPAN,XC$);
  199. 1990 RETURN
  200. 2000 REM
  201. 2010 REM **************************************************************
  202. 2020 REM *      PRINT YAXIS TITLE                                     *
  203. 2030 REM **************************************************************
  204. 2040 REM
  205. 2050 IF LNNO/2-FIX(LNNO/2)<>0 THEN RETURN
  206. 2060 LPRINT CHR$(13);:RSTOP=7
  207. 2070 CHAR$=MID$(YTITLE$,FIX(((YSPAN-LNNO)/2)+1),1)
  208. 2080 GOSUB 1630
  209. 2090 RETURN
  210. 2100 REM
  211. 2110 REM **************************************************************
  212. 2120 REM *      PRINT X SCALE SUBROUTINE                              *
  213. 2130 REM **************************************************************
  214. 2140 REM
  215. 2150 LPRINT:LPRINT
  216. 2160 F$="#######.##"
  217. 2170 F$=RIGHT$(F$,XDIV) ' YOU MIGHT LIKE LEFT$
  218. 2180 RSTOP=20-INSTR(F$,".")+1+(INSTR(F$,".")=0)*LEN(F$):CHAR$="":GOSUB 1630
  219. 2190 FOR I=0 TO XTIC-1
  220. 2200 LPRINT USING F$;(XMAX-XMIN)*I/XTIC+XMIN;
  221. 2210 LPRINT SPC(XDIV-LEN(F$));
  222. 2220 NEXT I
  223. 2230 LPRINT USING F$;(XMAX-XMIN)*I/XTIC+XMIN;
  224. 2240 RETURN
  225. 2250 REM
  226. 2260 REM **************************************************************
  227. 2270 REM *      PRINT X AXIS TITLE                                    *
  228. 2280 REM **************************************************************
  229. 2290 REM
  230. 2300 LPRINT:LPRINT:LPRINT
  231. 2310 LPRINT:LPRINT:LPRINT
  232. 2320 RSTOP=20:CHAR$=XTITLE$:GOSUB 1630
  233. 2330 RETURN
  234. 2340 REM
  235. 2350 REM **************************************************************
  236. 2360 REM *      AUTO SCALING SUBROUTINES                              *
  237. 2370 REM **************************************************************
  238. 2380 REM NOTE THESE SCALING ROUTINES FAIL UNDER CERTAIN CONDITIONS
  239. 2390 REM DUE TO ROUND OFF ERROR (USE MANUAL)
  240. 2400 YMAX=Y(0):XMAX=X(0):YMIN=Y(0):XMIN=X(0)
  241. 2410 PRINT "***** WORKING *****"
  242. 2420 FOR I=1 TO NM1:REM                            FIND XMAX & YMAX
  243. 2430 IF Y(I)>YMAX THEN YMAX=Y(I)
  244. 2440 IF Y(I)<YMIN THEN YMIN=Y(I)
  245. 2450 IF X(I) > XMAX THEN XMAX=X(I)
  246. 2460 IF X(I)<XMIN THEN XMIN=X(I)
  247. 2470 NEXT I
  248. 2480 RESTORE 2670:REM--------------------------------------------------
  249. 2490 MSD=(YMAX-YMIN)/YTIC:REM                 SCALE THE Y AXIS
  250. 2500 YD=(YMAX-YMIN)/YSPAN
  251. 2510 FOR I=-2 TO 4
  252. 2520 FOR K=1 TO 3:READ J
  253. 2530 IF MSD<=J*10^(I)+.5*YD/YTIC THEN MSD=J*10^(I):GOTO 2550 
  254. 2540 NEXT K:RESTORE 2670:NEXT I
  255. 2550 YMAX=SGN(YMAX)*CINT(ABS(YMAX/MSD))*MSD
  256. 2560 YMIN=YMAX-YTIC*MSD
  257. 2570 RESTORE 2670:REM--------------------------------------------------
  258. 2580 MSD=(XMAX-XMIN)/XTIC:REM                        SCALE THE X AXIS
  259. 2590 XD=(XMAX-XMIN)/XSPAN
  260. 2600 FOR I=-2 TO 4
  261. 2610 FOR K=1 TO 3:READ J
  262. 2620 IF MSD<=J*10^(I)+.5*XD/XTIC THEN MSD=J*10^(I):GOTO 2640
  263. 2630 NEXT K:RESTORE 2670:NEXT I
  264. 2640 XMAX=SGN(XMAX)*CINT(ABS(XMAX/MSD))*MSD
  265. 2650 XMIN=XMAX-XTIC*MSD
  266. 2660 RETURN
  267. 2670 DATA 1,2,5
  268. 2680 REM
  269. 2690 REM **************************************************************
  270. 2700 REM *      SHELL SORT OF DATA                                    *
  271. 2710 REM **************************************************************
  272. 2720 REM
  273. 2730 M=NM1
  274. 2740 REM    X(I)         X AXIS DATA ARRAY
  275. 2750 M=INT(M/2):IF M=0 THEN RETURN
  276. 2760 J=0:K=NM1-M
  277. 2770 I=J
  278. 2780 L=I+M:IF Y(I)<Y(L) THEN 2810
  279. 2790 T=Y(I):T1=X(I):Y(I)=Y(L):X(I)=X(L):Y(L)=T:X(L)=T1:I=I-M
  280. 2800 IF I<0 THEN 2810 ELSE 2780
  281. 2810 J=J+1:IF J<=K THEN 2770 ELSE 2750
  282. 2820 REM
  283. 2830 REM    YD           DELTA VALUE FOR EACH Y AXIS LINE          
  284. 2840 REM    XP           CHARACTER POSITION ON X AXIS              
  285. 2850 REM    MSD          MINIMUM SCALE DELTA (MAJOR DIVISION)                     
  286. 2860 REM    K            INDEX COUNTER                              
  287. 2870 REM    I            INDEX COUNTER                              
  288. 2880 REM    T$           PLOT TITLE                                
  289. 2890 REM    PTITLE$      PLOT TITLE CENTERED IN 50 SPACES     
  290. 2900 REM    Y$           Y AXIS TITLE                              
  291. 2910 REM    YTITLE$      Y AXIS TITLE CENTERED IN 50 SPACES   
  292. 2920 REM    X$           X AXIS TITLE                              
  293. 2930 REM    XTITLE$      X AXIS TITLE CENTERED IN 50 SPACES   
  294. 2940 REM    CHAR$        STRING PRINTED AT RSTOP                
  295. 2950 REM    XTIC         X AXIS MAJOR DIVISIONS    
  296. 2960 REM    YTIC         Y AXIS MAJOR DIVISIONS
  297. 2970 REM    XDIV         X AXIS MINOR DIVISIONS PER MAJOR
  298. 2980 REM    YDIV         Y AXIS MINOR DIVISIONS PER MAJOR
  299. 2990 REM    NPTS          NUMBER OF DATA POINTS
  300. 3000 REM    NM1           NUMBER OF POINTS -1
  301. 3010 REM    AWT          ALLAN W. TOMALESKY
  302. 3020 REM                 32 MARY LYNN LANE 
  303. 3030 REM                 SOMERVILLE,NJ 08876
  304.    AWT          ALLAN W. TOMALESKY
  305. 3020 REM                 32 MARY LYNN LANE