|
25 Years of Programming
An open source source for C, C++, OWL, BASIC, MDB, XLS, DOT, and more... |
Home Projects Up Sitemap Search Blog Forum+Chat About Us Privacy Terms of Use Feedback FAQ Images Services Payments Humor Music |
High-resolution data graphing program for the Heathkit H-100 computer, GWBASICThe AUTOHIRE.BAS program reads data from files you specify and creates a graph. It is called "auto" because it automatically scales the axes to fit on the screen. It would need some modifications for use with IBM BASICA, to accommodate the different screen resolution of a PC. The likely graphics mode to use is SCREEN 12. |
10 'AUTOHIRE 11-24-85 11 '(C)COPYRIGHT 1985 STEVEN WHITNEY. 12 'Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY. 13 'Initially published by http://25yearsofprogramming.com. 20 'AutoHiResGraph. Auto because it can automatically scale the axes to fit on the screen. 30 'Plots the points from data files to an on-screen graph in graphics mode (640 x 225). 40 VIEW PRINT: CLS 50 SCL = 6 60 'HIGH RESOLUTION (PIXEL-LEVEL) GRAPHING PROGRAM 70 OPEN "O", 1, "SCOLOR": PRINT #1, SCL: CLOSE #1 80 '9-19-85 MAJOR REVISIONS TO ACCOMODATE WINDOWS (I.E. VIEWPORTS). 90 'PRINT CHR$(27)"F" : REM H-100, Z-100 GRAPHICS MODE 100 CLEAR 110 OPEN "I", 1, "SCOLOR": INPUT #1, SCL: CLOSE #1 120 SCL = (SCL + 1) MOD 8: IF SCL = 0 THEN SCL = 1 ELSE IF SCL = 3 THEN SCL = 4 130 ON ERROR GOTO 2100 140 Q$ = STRING$(75, "=") 150 DIM X(1000), Y(1000): 'MAXIMUM NUMBER OF POINTS TO PLOT 160 VIEW PRINT 24 TO 25 170 CLS 180 REM GOTO 400 : 'ENABLE TO SKIP INSTRUCTIONS 190 PRINT "AUTOHIRE.BAS" 200 PRINT "(C)COPYRIGHT 1985 STEVEN WHITNEY" 201 PRINT "Published under GNU GPL (General Public License) Version 3," 202 PRINT "with ABSOLUTELY NO WARRANTY." 210 PRINT 220 REM lines left in, in case any were entry points. 230 REM 240 REM 250 REM 260 REM 270 REM 280 REM 290 REM 300 REM 310 REM 320 REM 330 REM 340 REM 350 REM 360 REM 370 CLS : PRINT Q$: PRINT "This program will plot in graph form a series of points.": PRINT "The points are referred to in the form (X,Y), where X is the ": PRINT "horizontal value, and Y is the vertical." 380 PRINT : PRINT "The values for X must already be stored in a disk file." 390 PRINT "The corresponding values for Y must be stored in a separate disk file,": PRINT "in the same order as the X values.": PRINT 400 PRINT "That is, the program will read the first value stored in the X file,": PRINT "and match it up with the first value stored in the Y file to make" 410 PRINT "the first ordered pair (X1,Y1). The second numbers from each file will be": PRINT "paired to make the second ordered pair (X2,Y2), and so on." 420 PRINT Q$: PRINT 430 PRINT "If you use manual scaling of the Y axis, interpolation is made" 440 PRINT "easiest if the range is a number divisible by 16, 8, or 4, in" 450 PRINT "decreasing order of preference." 460 PRINT "Examples would be 0-4,0-16,32-64, etc.": PRINT STRING$(75, "-") 470 PRINT "If the X-axis numbers overprint each other, see the REM line" 480 PRINT "in the 'PRINT X-AXIS NUMBERS' program section to shorten labels" 490 PRINT Q$ 500 N$ = "#####.##" 510 PRINT : PRINT "Do you want a (P)oint graph or (L)ine graph (P/L)"; : PL$ = INPUT$(1): PRINT PL$ 520 IF PL$ = "p" THEN PL$ = "P" 530 IF PL$ = "l" THEN PL$ = "L" 540 IF PL$ <> "P" AND PL$ <> "L" THEN 510 550 PRINT "Do you want horizontal grid lines? (Y/N) "; : HORIZ$ = INPUT$(1): IF HORIZ$ = "n" THEN HORIZ$ = "N" 560 PRINT : PRINT "For vertical grid lines," 570 PRINT "Do you want (A)ll grids, (C)oarse only, or (N)o grids (A/C/N)"; : GRIDF$ = INPUT$(1): PRINT GRIDF$ 580 IF GRIDF$ = "a" THEN GRIDF$ = "A" 590 IF GRIDF$ = "c" THEN GRIDF$ = "C" 600 IF GRIDF$ = "n" THEN GRIDF$ = "N" 610 IF GRIDF$ <> "A" AND GRIDF$ <> "C" AND GRIDF$ <> "N" THEN 570 620 PRINT : INPUT "What file holds the X axis values (or AUTO)"; F$ 630 IF F$ = "auto" THEN F$ = "AUTO" 640 INPUT " What will its title be"; X$ 650 PRINT 660 PRINT "Do you want to scale the X axis manually? (Y/N)"; : S1$ = INPUT$(1): PRINT S1$ 670 IF S1$ = "y" THEN S1$ = "Y" 680 IF S1$ = "n" THEN S1$ = "N" 690 IF S1$ <> "N" AND S1$ <> "Y" THEN 660 700 IF S1$ <> "Y" THEN 740 710 PRINT 720 INPUT "What will the LOW value be"; LX 730 INPUT "What will the HIGH value be"; HX 740 PRINT Q$: PRINT 750 INPUT "What file holds the Y axis values (or AUTO)"; G$ 760 IF G$ = "auto" THEN G$ = "AUTO" 770 INPUT " What will its title be"; Y$ 780 IF LEN(Y$) > 20 THEN PRINT : PRINT , "==> Please limit title to 20 characters": GOTO 770 790 PRINT 800 PRINT "Scale Y axis manually? (Y/N)"; : S2$ = INPUT$(1): PRINT S2$ 810 IF S2$ = "y" THEN S2$ = "Y" 820 IF S2$ = "n" THEN S2$ = "N" 830 IF S2$ <> "Y" AND S2$ <> "N" THEN 800 840 IF S2$ <> "Y" THEN 900 850 PRINT 860 INPUT "What will the LOW value be"; LY 870 INPUT "What will the HIGH value be"; HY 880 SWAP LY, HY: REM Y AXIS INVERTED 890 LY = -LY: HY = -HY: REM Y AXIS & VALUES INVERTED 900 IF F$ = "AUTO" THEN XN = -1: GOTO 1000 910 IF G$ = "AUTO" THEN YN = -1 920 OPEN "I", 1, F$ 930 XN = -1 940 WHILE NOT EOF(1) 950 XN = XN + 1 960 IF G$ = "AUTO" THEN YN = YN + 1: Y(YN) = -XN 970 INPUT #1, X(XN) 980 WEND 990 CLOSE 1000 IF G$ = "AUTO" THEN GOTO 1100 1010 OPEN "I", 1, G$ 1020 YN = -1 1030 WHILE NOT EOF(1) 1040 YN = YN + 1 1050 IF F$ = "AUTO" THEN XN = XN + 1: X(XN) = YN 1060 INPUT #1, Y(YN) 1070 Y(YN) = -Y(YN): REM INVERT FOR LATER PLOTTING HIGH MUST BE LOWEST! 1080 WEND 1090 CLOSE 1100 IF XN = YN THEN GOTO 1150 1110 CLS : PRINT CHR$(7): PRINT Q$: PRINT "==>WARNING: The two data files do not contain the same # of points." 1120 PRINT "I will try to plot points for which there are X values, but the" 1130 PRINT "graphing may be erratic or erroneous.": PRINT Q$ 1140 PRINT "Press any key to acknowledge and continue": Z$ = INPUT$(1) 1150 PRINT "Calculating..." 1160 REM ----------------------------------- 1170 IF S1$ = "Y" THEN 1300 1180 REM FIND HIGH X VALUE 1190 HX = -1.70141E+38 1200 FOR I = 0 TO XN 1210 IF X(I) >= HX THEN HX = X(I) 1220 NEXT I 1230 REM --------------------------------- 1240 REM FIND LOW X VALUE 1250 LX = 1.70141E+38 1260 FOR I = 0 TO XN 1270 IF X(I) <= LX THEN LX = X(I) 1280 NEXT I 1290 REM FIND HIGH Y VALUE ------------------ 1300 IF S2$ = "Y" THEN 1410 1310 HY = -1.70141E+38 1320 FOR I = 0 TO YN 1330 IF Y(I) >= HY THEN HY = Y(I) 1340 NEXT I 1350 REM FIND LOW Y VALUE -------------------- 1360 LY = 1.70141E+38 1370 FOR I = 0 TO YN 1380 IF Y(I) <= LY THEN LY = Y(I) 1390 NEXT I 1400 REM ------------------------------ 1410 REM SCALE X VALUES TO THE EXACT VALUES TO BE PLOTTED (76 TO 635 GOING UP) 1420 FOR I = 0 TO XN 1430 X(I) = ((X(I) - LX) * (559 / (HX - LX))) + 76 1440 NEXT I 1450 REM SCALE Y VALUES TO THE EXACT VALUES TO BE PLOTTED (148 TO 4 GOING UP) 1460 FOR I = 0 TO YN 1470 Y(I) = ((Y(I) - LY) * (144 / (HY - LY))) + 4 1480 NEXT I 1490 REM PRINT GRAPH SKELETON--------------------- 1500 CLS 1510 REM 1520 VIEW PRINT 1530 LOCATE 23, (10 + ((80 - LEN(X$)) / 2)): PRINT X$; : REM PRINT X LABEL 1540 'PRINT 1550 IF HORIZ$ = "N" THEN GOTO 1590 1560 FOR I = 0 TO 16: LINE (76, I * 9 + 4)-(635, I * 9 + 4), 4: NEXT I: REM PRINT Y AXIS 1570 'PRINT 1580 REM PRINT X AXIS 1590 LOCATE 17, 10 1600 IF GRIDF$ = "N" THEN 1720 1610 'UNDER SOME CONDITIONS, GRID LINES AREN'T ALIGNED WITH NUMBERS OR 1620 'MAJOR GRID LINES ARE INCORRECT. USUALLY, IT CAN BE RECTIFIED BY 1630 'MANUAL SCALING. 1640 'UNDER OTHER CONDITIONS, DISPLAY GOES *WAY* OUT OF BOUNDS AND NO 1650 'GRAPH PRINTS AT ALL. NOT SURE WHY, AND IT REQUIRES UNUSUAL CONDITIONS. 1660 LCOUNT = -1 1670 FOR I = LX + 76 TO 639 STEP 559 / (HX - LX): 'WAS LX+75 IN A PREVIOUS VERSION? 1680 LCOUNT = LCOUNT + 1 1690 IF LCOUNT MOD 5 = 0 THEN LINE (I, 17 * 9 - 2)-(I, 4), 4 ELSE IF GRIDF$ = "A" THEN LINE (I, 17 * 9 - 5)-(I, 4), 4: 'THIS LINE SHOULD BE WHERE THE POINT ACTUALLY FALLS 1700 IF LCOUNT MOD 5 = 0 THEN LINE (I + 1, 17 * 9 - 5)-(I + 1, 4), 4 1710 NEXT I 1720 REM PRINT Y LABEL------------- 1730 FOR I = 1 TO LEN(Y$) 1740 LOCATE (11 - LEN(Y$) / 2 + I), 1: PRINT MID$(Y$, I, 1); 1750 NEXT I 1760 REM PRINT Y AXIS NUMBERS---------------------------- 1770 FOR I = 1 TO 17 1780 LOCATE I, 2: PRINT MID$(STR$(-(LY + (I - 1) * (HY - LY) / 16)), 1, 8) 1790 NEXT I 1800 REM PRINT X AXIS NUMBERS ---------------------------------- 1810 LOCATE 18, 5 1820 ' 1830 FOR I = 0 TO (HX - LX) / 10 1840 TB = (LX + I * 10): 'IF OVERPRINTING IS A PROBLEM, USE INT(LX+I*10) 1850 'IF OVERPRINTING STILL A PROBLEM, DISABLE THE NUMBER PRINTING ENTIRELY 1860 'IF LEN(STR$(TB))/2>=5 THEN 1580 :'DON'T PRINT IF STRING TOO LONG 1870 IF ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2 > 75 THEN GOTO 1890: 'DON'T PRINT IF TOO CLOSE TO RIGHT MARGIN 1880 LOCATE 18, ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2: PRINT TB; 1890 NEXT I 1900 LOCATE 19, 5 1910 FOR I = .5 TO (HX - LX) / 10 1920 TB = (LX + I * 10): 'IF OVERPRINTING OCCURS, USE INT(LX+I*10) 1930 'IF OVERPRINTING STILL A PROBLEM, BYPASS THIS LOOP ENTIRELY 1940 'IF LEN(STR$(TB))/2>=5 THEN 1650:'DON'T PRINT IF STRING TOO LONG 1950 IF ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2 > 75 THEN GOTO 1970: 'DON'T PRINT IF TOO CLOSE TO RIGHT MARGIN 1960 LOCATE 19, ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2: PRINT TB; 1970 NEXT I 1980 LOCATE 1, 1 1990 REM PLOT POINTS ------------------------------------------ 2000 FOR I = 0 TO XN 2010 IF PL$ = "P" THEN PSET (X(I), Y(I)), SCL: GOTO 2030 2020 IF LINEF = 0 THEN LINEF = 1: PSET (X(I), Y(I)), SCL: GOTO 2030 ELSE LINE -(X(I), Y(I)), SCL 2030 NEXT I 2040 'PRINT CHR$(27)"G" : REM EXIT GRAPHICS 2050 VIEW PRINT 24 TO 25 2060 LOCATE 25, 1 2070 PAUSE$ = INPUT$(1) 2080 GOTO 60 2090 END 2100 IF ERR = 53 AND (ERL = 900 OR ERL = 1000) THEN PRINT CHR$(7): PRINT STRING$(75, "="): PRINT "ONLY THESE FILES ARE AVAILABLE: ": PRINT : FILES: PRINT STRING$(75, "="): PRINT ELSE GOTO 2130 2110 IF ERL = 900 THEN RESUME 620 2120 IF ERL = 1000 THEN RESUME 750 2130 ON ERROR GOTO 0
|
|
|
|
|
|
|
Copyright ©2012 Steven Whitney. Last modified Sun 07/29/2012 11:39:39 -0700. |
||