Compucolor.org – Virtual Media

Listing of file='PLTDEM.BAS;01' on disk='vmedia/ncc_21-sector.ccvf'

1 REM  ** PLOTTING DEMO - COPYRIGHT (C) 1979 BY TREVOR TAYLOR **
2 REM
3 REM  THIS PROGRAM DEMONSTRATES THE USE OF A SET OF SUBROUTINES
4 REM  THAT ARE DESIGNED FOR PLOTTING GRAPHS ON THE CCII.
5 REM
6 REM  FIVE DIFFERENT EXAMPLES ARE INCLUDED. NUMBER 4 CAN BE
7 REM  USED TO PLOT A SET OF X-Y DATA ENTERED BY THE USER.
8 REM  NUMBER 5 COULD BE USED TO PLOT ANY FUNCTION OF THE
9 REM  USER'S CHOICE BY CHANGING THE FUNCTION IN LINE 5000.
10 C= 3.14159/ 180
20 DIM X(20),Y(20)
30 FG =  1
100 PLOT 12,14,29,18
110 PRINT "X - Y PLOTTING PROGRAM EXAMPLES"
120 PRINT "THIS PROGRAM DEMONSTRATES A FEW WAYS OF USING THE"
130 PRINT "PLOTTING SUBROUTINES WITH VARIOUS FUNCTIONS BASED"
140 PRINT "ON SINE WAVES.":PRINT
150 PRINT "ANY DESIRED FUNCTION CAN BE PLOTTED BY REPLACING"
160 PRINT "THE FUNCTION DEFINITION IN LINE 5000 AND RUNNING"
165 PRINT "THE PROGRAM WITH NUMBER 5."
170 PRINT :INPUT "PICK A NUMBER BETWEEN 1 AND 5 - ";N
180 IF N> 5GOTO 170
190 IF N< 1THEN END
200 ON NGOTO 1000,2000,3000,4000,5000
300 REM
1000 DEF FN Y(X)= SIN (X* 3.14159/ 180)
1005 X1= - 180:X2= 90:Y1= - 1:Y2= 1:XS= 10
1010 GOSUB 50000:REM  INITIALIZE THE PLOT AND CLEAR THE SCREEN
1020 GOSUB 51000:REM  DRAW THE AXES
1030 FOR X= X1TO X2STEP XS
1040 Y= FN Y(X)
1050 GOSUB 52000:REM  PLOT A POINT
1060 NEXT X
1070 GOSUB 50100:REM  RESET THE PLOT, BUT DON'T ERASE THE SCREEN
1080 FOR X= X1TO X2STEP 6
1090 Y= - FN Y(X)
1100 GOSUB 52000
1110 NEXT X
1200 PLOT  8:INPUT  "TYPE <RETURN>";A$
1210 PLOT 12,14
1220 PRINT "THIS EXAMPLE SHOWS THAT MULTIPLE CURVES CAN BE"
1230 PRINT "PLOTTED ON THE SAME SET OF AXES. IN FACT, YOU"
1240 PRINT "CAN EVEN CHANGE THE SCALES BETWEEN DRAWING THE"
1250 PRINT "CURVES, ALTHOUGH THE LABELS WOULD BE WRONG THEN."
1260 PRINT :PRINT "THE BLURRING WHERE THE GRAPH CROSSES THE"
1270 PRINT "AXIS LINES IS A FUNCTION OF THE HARDWARE AND"
1280 PRINT "CANNOT BE FIXED."
1300 GOTO 6000
1500 REM
2000 DEF FN Y(X)= EXP (- X/ 720)* SIN (C* X)
2010 X1= 0:X2= 720:Y1= - 1:Y2= 1
2015 XS= 10
2020 GOSUB 50000:REM  INITIALIZE THE PLOT AND CLEAR SCREEN
2030 FOR X= X1TO X2STEP XS
2040 Y= FN Y(X)
2050 GOSUB 52000:REM  PLOT THE POINTS
2060 NEXT X
2070 GOSUB 51000:REM  NOW DRAW THE AXES OVER THE FINISHED CURVE
2080 PLOT  8:INPUT  "TYPE <RETURN>";A$
2090 PLOT 12,14
2100 PRINT "IN THIS EXAMPLE THE CURVE IS PLOTTED BEFORE THE"
2110 PRINT "AXES. NOTE THAT SOME OF THE POINTS CHANGE COLOR"
2120 PRINT "WHEN THE AXES ARE DRAWN. THIS IS UNAVOIDABLE."
2200 GOTO 6000
2500 REM
3000 DEF FN Y(X)= SIN (C* X)
3010 X1= 0:X2= 180:Y1= - 1:Y2= 1
3015 XS= 10:FG =  0
3020 GOSUB 50000:REM  INITIALIZE
3030 GOSUB 51000:REM  DRAW AXES
3040 FOR X= X1TO X2STEP XS
3050 ST= 1:REM  SET ST=1 (OR GOSUB 50100) FOR POINT-PLOT MODE
3060 Y= FN Y(X)
3070 GOSUB 52000:REM  PLOT THE POINT
3080 Y= - Y
3090 ST= 1
3100 GOSUB 52000:REM  PLOT ANOTHER POINT ON A DIFFERENT CURVE
3110 NEXT X
3120 PLOT  8:INPUT  "TYPE <RETURN>";A$
3150 PLOT 12,14
3160 PRINT "THE CURVES HERE WERE PLOTTED IN POINT-PLOT MODE"
3170 PRINT "(AS OPPOSED TO VECTOR OR LINE MODE). THIS ALLOWS"
3180 PRINT "TWO CURVES TO BE 'INTERLACED'."
3190 PRINT : PRINT "NOTE ALSO THE USE OF THE AXES WITHOUT"
3200 PRINT "DRAWING THE GRID LINES. IN MANY CASES THIS IS"
3210 PRINT "PREFERABLE BECAUSE THE GRID TENDS TO CLUTTER"
3220 PRINT "UP THE SCREEN. IT ALSO AVOIDS THE SPLOTCHES WHERE"
3230 PRINT "THE CURVE CROSSES THE GRID LINES (EXAMPLES 1 AND 2)."
3240 PRINT "THIS CAN BE PARTICULARLY BAD IN POINT-PLOT MODE."
3250 FG =  1
3300 GOTO  6000
3500 REM
4000 PLOT 12,14
4005 FG =  1
4010 PRINT "IN THIS CASE YOU CAN ENTER DATA POINTS WHICH WILL"
4020 PRINT "THEN BE PLOTTED BY THE COMPUTER ON THE LARGEST"
4030 PRINT "SCALE POSSIBLE."
4040 PRINT "YOU HAVE TO ENTER THE DATA AS X-Y PAIRS."
4050 PRINT :INPUT "NUMBER OF DATA POINTS (20 MAXIMUM) = ";M
4060 IF M> 20GOTO 4050
4070 PRINT :PRINT "ENTER EACH POINT AS IT IS REQUESTED:"
4080 FOR I= 1TO M
4090 PRINT "DATA POINT";I;
4100 INPUT " = ";X(I),Y(I)
4110 NEXT I
4115 INPUT "DRAW THE GRID LINES (Y/N) ? ";A$
4120 IF (A$< > "Y") THEN  FG =  0:REM  SET THE FLAG FOR THE GRID
4125 X1= X(1):X2= X(1):Y1= Y(1):Y2= Y(1)
4130 FOR I= 1TO M
4140 IF X(I)> X2THEN X2= X(I)
4150 IF X(I)< X1THEN X1= X(I)
4160 IF Y(I)> Y2THEN Y2= Y(I)
4170 IF Y(I)< Y1THEN Y1= Y(I)
4180 NEXT I
4185 INPUT "JOIN THE POINTS BY A LINE (Y/N) ? ";A$
4190 GOSUB 50000
4200 GOSUB 51000
4210 FOR I= 1TO M
4220 IF A$< > "Y"THEN ST= 1:REM  SET POINT-PLOT MODE IF REQUESTED
4230 X= X(I)
4240 Y= Y(I)
4250 GOSUB 52000
4260 NEXT I
4300 PLOT  8:INPUT  "TYPE <RETURN>";A$
4310 PLOT 12,14
4320 PRINT "THIS COULD BE A VERY HANDY ROUTINE FOR DRAWING UP"
4330 PRINT "GRAPHS TO SEE WHAT THEY LOOK LIKE WITHOUT MUCH"
4340 PRINT "EFFORT."
4350 FG =  1
4400 GOTO 6000
5000 DEF FN Y(X)= SIN (C* X):REM  C CONVERTS TO DEGREES
5010 PLOT 12,14
5020 PRINT "THE FUNCTION TO BE PLOTTED IN THIS CASE IS A"
5030 PRINT "SIMPLE SINE CURVE. YOU HAVE TO ENTER THE"
5040 PRINT "STARTING VALUE AND FINISHING VALUE ON THE"
5050 PRINT "X-AXIS IN DEGREES (SAY 0 TO 360)."
5060 PRINT "YOU ALSO HAVE TO ENTER THE RANGE ON THE"
5070 PRINT "Y-AXIS, WHICH WE KNOW TO BE -1 TO +1, BUT YOU"
5080 PRINT "SHOULD TRY DIFFERENT VALUES TO SEE WHAT HAPPENS."
5100 PRINT "THE LAST THING TO ENTER IS THE INCREMENT"
5110 PRINT "BETWEEN X-VALUES USED IN THE CALCULATIONS,"
5120 PRINT "WHICH WILL AFFECT THE SPEED AND ACCURACY."
5130 PRINT :INPUT "STARTING X-VALUE = ";X1
5140 INPUT "ENDING X-VALUE = ";X2
5150 INPUT "LOWEST Y-VALUE = ";Y1
5160 INPUT "HIGHEST Y-VALUE = ";Y2
5170 INPUT "X-INCREMENT FOR CALCULATIONS AND PLOTTING = ";XS
5200 GOSUB 50000
5210 GOSUB 51000
5230 FOR X= X1TO X2STEP XS
5240 Y= FN Y(X)
5250 GOSUB 52000
5260 NEXT X
5270 PLOT  8:INPUT  "TYPE <RETURN>";A$
5300 PLOT 12,14
5310 PRINT "YOU SHOULD PLAY AROUND WITH THIS EXAMPLE TO GET"
5320 PRINT "A FEELING FOR HOW THINGS WORK. CHANGE THE FUNCTION"
5330 PRINT "IN LINE 5000 IF YOU LIKE."
5340 PRINT "IN PARTICULAR, TRY REDUCING THE Y-RANGE IN SIZE."
5350 PRINT "THIS WILL 'CLIP' THE CURVE OFF AT THE EDGES."
5400 GOTO 6000
6000 PRINT :INPUT "RUN AGAIN (Y/N) ? ";A$
6010 IF A$= "Y"GOTO 100
6020 LOAD  "MENU":RUN
50000 REM  **********************************************
50001 REM
50002 REM  ** INITIALIZATION ROUTINE - SCALES THE AXES **
50003 REM     THE SCREEN GETS ERASED
50004 REM
50005 REM   THE USER MUST SET UP THE X- AND Y-RANGES (X1 TO X2,
50006 REM  Y1 TO Y2) BEFORE CALLING THIS ROUTINE. DATA IS PLOTTED
50007 REM  ON A 100 BY 100 AREA OF THE SCREEN. X3 AND Y3 ARE THE
50008 REM  SCALING FACTORS TO MAKE THE DATA FIT THE SCREEN.
50009 REM
50010 X0 =  10: Y0 =  10: I1 =  100: I2 =  100
50015 REM  ** GX, GY ARE THE LENGTHS OF THE GRID LINES **
50020 GX =  100: GY =  100:
50021 REM
50022 REM  ** THE FLAG, FG, IS USED TO GET THE GRID LINES
50023 REM     DRAWN ON THE AXES. IF FG=0, NO GRID LINES ARE
50024 REM     DRAWN, ONLY TIC MARKS. GRID LINES TEND TO OBSCURE
50025 REM     THE PLOTTED CURVE. FG<>0 SELECTS GRID LINES.
50026 REM     NOTE THAT THE FLAG MUST BE SET BEFORE THE CALL
50027 REM     TO THE INITIALIZATION ROUTINE, NOT THE AXIS
50028 REM     ROUTINE **
50029 REM
50030 IF (FG< > 0) GOTO  50040
50035 GX =  2: GY =  2
50040 X3= I1/ (X2- X1)
50050 Y3= I2/ (Y2- Y1)
50060 PLOT 12,15
50094 REM
50095 REM  ** TO PLOT MULTIPLE CURVES ON THE SAME AXES, CALL HERE
50096 REM     OR SET ST=1 IN THE MAIN ROUTINE. THIS ALLOWS A MOVE
50097 REM     TO THE NEXT POINT, INSTEAD OF A DRAW. **
50100 ST= 1
50110 RETURN
50115 REM
51000 REM  ***********************************************
51001 REM
51002 REM  ** AXIS ROUTINE - DRAWS AXES AND LABELS THEM **
51003 REM     NOTE THAT THIS ROUTINE DOES NOT ERASE THE SCREEN
51004 REM
51005 PLOT 29,17,2,250
51010 PLOT X0,Y0,X0+ I1
51020 PLOT 255,29,22,2,250,X0
51030 FOR  I= 1 TO  10: PLOT  Y0+ I* 10: PLOT  X0+ GX: NEXT  I
51040 PLOT 255,29,17,2
51050 PLOT 246
51060 PLOT Y0,X0,Y0+ I2
51070 PLOT 255,29,22,2,246,Y0
51080 FOR  I= 1 TO  10:PLOT  X0+ I* 10: PLOT  Y0+ GY: NEXT  I
51090 PLOT 255,29,19
51100 PLOT 3,3,30:PRINT X1
51110 PLOT 3,25,30:PRINT "X - AXIS"
51120 PLOT 3,53,30:PRINT X2
51130 PLOT 3,20,31:PRINT "X INCREMENT = ";(X2- X1)/ 10;
51140 PLOT 3,0,29:PRINT Y1
51150 D$ =  STR$ ((Y2- Y1)/ 10)
51160 PLOT 3,0,10,27,10:PRINT "Y - AXIS";
51170 PLOT 3,2,7:PRINT "Y INCREMENT =";D$;:PLOT 27,11
51180 PLOT 3,0,4:PRINT Y2
51190 PLOT 3,25,0:PRINT "X - Y PLOT";
51200 PLOT 8,29,18
51210 RETURN
51215 REM
52000 REM  **********************************************
52001 REM
52002 REM  ** PLOTTING ROUTINE - PLOTS THE POINT (X,Y) **
52003 REM     POINTS JOINED BY A LINE IF ST=0, OTHERWISE NOT
52004 REM
52005 PLOT 2,242
52010 IF ST< > 0THEN PLOT 253
52020 X4= (X- X1)* X3+ X0
52030 IF X4> X0+ I1GOTO 52200
52040 IF X4< X0GOTO 52200
52050 Y4= (Y- Y1)* Y3+ Y0
52060 IF Y4> Y0+ I2GOTO 52200
52070 IF Y4< Y0GOTO 52200
52080 PLOT X4,Y4
52090 ST= 0
52100 PLOT 255
52110 RETURN
52200 ST= 1
52210 GOTO 52100