home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_21_1988_Transactor_Publishing.d64
/
projector64
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
5KB
|
252 lines
1000 printchr$(147)" 64 projector
1010 [153]" perspective plotter
1020 print" with hidden lines
1030 [153]" by ian adam
1040 print" vancouver bc
1050 [153]" december 1985
1060 :
1070 rem requires hires plotting routines
1080 rem the transactor vol 5 issue 6
1090 rem with extensions by ia
1100 :
1110 if peek(38912)=1 then a=2
1120 poke 53281,2-a
1130 on a goto 1150,1190
1140 a=1: load"hiprnt1.ml",8,1
1150 poke 56,152 : clr
1160 load"hiprnt2.ml",8,1
1170 :
1180 rem start here!
1190 gosub1990, constants
1200 gosub2650, choose
1210 gosub2090, config'n
1220 gosub2170, viewing angle
1230 gosub2390, get data
1240 gosub1390, scale
1250 gosub1580, plot
1260 gosub2550, message
1270 :
1280 poke198,0:wait198,1:getb$
1290 if b$="r" then gosub2170:goto1240
1300 if b$="p" then sys hi,0: sys du,0,0: sys te:goto1260: dump to printer
1310 if b$="a" then 1250
1320 if b$="n" then if dd then run
1330 if b$="n" then gosub2650:goto1220
1340 if b$="v" then v=1-v
1350 if b$="h" then h=1-h
1360 if b$<>"q" then 1260
1370 end
1380 :
1390 rem vertical scaling
1400 print:print"scaling data...
1410 vscalar[178]9e9
1420 [129] y[178]0 [164] n
1430 a[178]z(0,y):[129] x[178]1 [164] m
1440 [139] z(x,y)[177]a [167] a[178]z(x,y)
1450 [130]:[143] find highest point on line
1460 [139] a [167] tmp[178](199[171]yv(y))[173]a : [139] vs[177]tm [167] vs[178]tm
1470 [130]:[143] select best feasible scale
1480 :
1490 [143] calculate rise
1500 [153]"...still scaling!
1510 for y=0 to n
1520 tm=yv(y)
1530 for x=0 to m
1540 r(x,y)=z(x,y)*vs+tm
1550 nextx,y
1560 return
1570 :
1580 rem set up screen
1590 syshi,0,0,13
1600 sysdm,1
1610 :
1620 rem plot horizontal lines
1630 sysmo,10,r(0,0)
1640 d1=dr:if h then d1=hd
1650 for y=0 to n
1660 tm=yh(y)
1670 for x=1 to m
1680 sysd1,tm+xh(x),r(x,y)
1690 nextx
1700 if y=n then 1800
1710 :
1720 rem plot vertical lines
1730 sysdr,yh(y+1)+xh(m),r(m,y+1)
1740 sysd1,yh(y)+xh(m),r(m,y)
1750 for x=m-1 to 0 step-1
1760 if v then x=0
1770 sysmo,tm+xh(x),r(x,y)
1780 sysd1,yh(y+1)+xh(x),r(x,y+1)
1790 next x,y
1800 :
1810 rem draw box
1820 sysmo,10,r(0,0)
1830 sysdr,10,10
1840 sysdr,xh(m),10
1850 sysdr,xh(m),r(m,0)
1860 sysmo,xh(m),10
1870 sysdr,xh(m)+yh(n),yv(n)
1880 sysdr,xh(m)+yh(n),r(m,n)
1890 :
1900 rem title
1910 sysco,8:syspr,1,24,a$
1920 :
1930 rem wait for human
1940 wait198,3:poke198,0
1950 syste:print chr$(147)
1960 return
1970 :
1980 rem constants
1990 hi=49152:dr=49155:mo=49161
2000 dm=49167:co=49173:te=49179
2010 pr=49182:hd=49191:du=49194
2020 m=20:rem x-dimension
2030 n=16:rem y-dimension
2040 sp=96:rem vertical separation
2050 th=-1
2060 ms$(0)="hide":ms$(1)="show
2070 [142]
2080 :
2090 [133]"hidden lines to be shown (y/n)";b$
2100 h[178][182](b$[178]"n")
2110 [133]"vertical lines to be shown (y/n)";b$
2120 v[178][182](b$[178]"n")
2130 [134] z(m,n),r(m,n)
2140 [134] xh(m),yh(n),yv(n)
2150 [142]
2160 :
2170 [143] view angle
2180 [139] theta[179]0 [167] theta[178]60:[143] default angle
2190 [153]:[153]"enter viewing angle, or press return
2200 print"for"th"degrees:
2210 [133]th :[139] th[179]0 [176] th[177]90 [167] 2180
2220 an[178]th[172][255][173]180
2230 tmp[178]120[172][190](an)
2240 xgrid[178][181]((309[171]tm)[173]m)
2250 ygrid[178][181](sp[172][191](an)[173]n)
2260 ystp[178][181](tm[173]n)
2270 :
2280 [143] calculate offsets
2290 [129] x[178]0 [164] m
2300 xhriz(x)[178]10[170]x[172]xg
2310 [130]
2320 [129] y[178]0 [164] n
2330 yhriz(y)[178]y[172]ys
2340 yvert(y)[178]10[170]y[172]yg
2350 [130]
2360 [142]
2370 :
2380 [143] data to plot
2390 [153]:[153]"creating data...
2400 if dd then 2480
2410 for x=0 to m
2420 for y=0 to n
2430 if e then r=fnr(x):s=fns(y)
2440 z(x,y)=fnz(x)
2450 nexty:printx;:nextx:return
2460 :
2470 rem read empirical results from data
2480 for y=0 to n
2490 for x=0 to m
2500 read z(x,y)
2510 nextx:printy;:nexty
2520 return
2530 :
2540 rem *** menus: ***
2550 print chr$(19)chr$(18);" press:": print
2560 print"r review from another angle
2570 [153]"p send projection to printer
2580 print"h: "ms$(1-h)" hidden lines
2590 [153]"v: "ms$(1[171]v)" vertical lines
2600 print"a plot again
2610 [153]"n for a new shape
2620 print"q quit
2630 [142]
2640 :
2650 [153]:[153] [199](18);" press:": [153]
2660 [153]"1. stetson
2670 print"2. inverse waves
2680 [153]"3. furrows
2690 print"4. cascade
2700 [153]"5. twin peaks
2710 print"6. crater
2720 [153]"7. radial
2730 print"8. read data
2740 :
2750 [146]198,1:[161]a$
2760 e[178]0:a[178][197](a$):[139] a[179]1 [176] a[177]8 [167] [138]
2770 [145] a [141] 2890,2940,2980,3020,3070,3130,3180,2800
2780 [153]a$:[142]
2790 :
2800 [153]:[153] [199](18);" press:": [153]
2810 [153]"1. rainfall
2820 print"2. more data
2830 [153]:[153]"0. first menu
2840 wait198,1:geta:if a=0 or a>2 then run
2850 on a gosub 3230,3470
2860 read a$,m,n,sp
2870 dd=1:return
2880 :
2890 a=m/2:b=5:c=n/2:d=2:e=.2
2900 deffnr(x)=(x-a)/b:deffns(y)=(y-c)/b
2910 deffnz(x)=sin(r*r*d+s*s)*exp(-r*r-s*s)+e
2920 a$="stetson":return
2930 :
2940 a=5
2950 deffnz(x)=sin(x*y/m)+a
2960 a$="inverse waves":return
2970 :
2980 a=m/2:b=n/2:c=4:d=1
2990 deffnz(x)=sin((x-a)*(y-b)/b)+y/c+d
3000 a$="furrows":return
3010 :
3020 a=6:b=2:c=.1:e=-1.2
3030 deffnr(x)=y/n-x/m:deffns(y)=r+r
3040 deffnz(x)=(c+exp(s+r))*cos(a*r*r-a*s+e)+b
3050 a$="cascade":return
3060 :
3070 a=int(m/3):b=m-a:c=n/2:d=3:e=.1:f=.4
3080 deffnr(x)=(x-a)*(x-a)+(y-c)*(y-c)
3090 deffns(y)=(x-b)*(x-b)+(y-c)*(y-c)
3100 deffnz(x)=cos(sqr(r))*(exp(-r/d)+e)+cos(sqr(s))*(exp(-s/d)+e)+f
3110 a$="twin peaks":return
3120 :
3130 a=m/2:b=n/2:c=45:e=5
3140 deffnr(x)=abs((x-a)*(x-a)+(y-b)*(y-b)-c)+e:deffns(y)=.
3150 deffnz(x)=e/r+e
3160 a$="crater":return
3170 :
3180 a=m/2:b=n/2:c=.001:d=40
3190 deffnz(x)=(abs(x-a)+abs(y-b))*sin(4*atn((y-b)/(x-a+c)))+d
3200 a$="radial":return
3210 :
3220 :
3230 poke 65,peek(61): poke 66,peek(62): rem set data ptr
3240 return
3250 :
3260 data rainfall in mm vancouver 1975-1985,11,10,160
3270 :
3280 data 30, 94, 83, 90, 44, 31, 7, 29
3290 data 95, 266, 0, 0: rem 1985
3300 data 268, 176, 132, 140, 109, 80, 1, 17
3310 data 60, 167, 225, 170, 186, 239, 122, 98
3320 data 40, 84, 102, 30, 99, 97, 325, 77
3330 data 247, 229, 68, 116, 18, 28, 74, 44
3340 data 46, 131, 173, 131, 57, 106, 124, 173
3350 data 130, 138, 17, 59, 89, 125, 274, 157
3360 data 96, 165, 120, 71, 54, 100, 74, 35
3370 data 104, 40, 319, 218: rem 1980
3380 data 57, 162, 61, 57, 49, 33, 32, 19
3390 data 74, 76, 65, 294, 113, 95, 77, 84
3400 data 65, 23, 9, 104, 96, 42, 124, 88
3410 data 102, 87, 84, 52, 98, 18, 51, 53
3420 data 82, 98, 20, 140, 167, 159, 112, 87
3430 data 95, 67, 24, 84, 53, 81, 64, 135
3440 data 162, 126, 118, 30, 49, 31, 19, 106
3450 data 1, 300, 210, 268: rem 1975
3460 :
3470 poke 65,peek(61): poke 66,peek(62): rem set data ptr
3480 return
3490 :
3500 data none entered,1,1,100