Thursday, June 16, 2022

Sierpinski Triangle

Another quick BASIC conversion

Original Atari code:

10 DIM PT(3,2)
20 PT(1,0)=25:PT(1,1)=100*SQR(3)
30 PT(2,0)=133*2+25:PT(2,1)=PT(1,1)
40 PT(0,0)=(PT(1,0)+PT(2,0))/2:PT(0,1)=25
99 GRAPHICS 8+16:COLOR 1:PLOT PT(0,0),PT(0,1):OX=PT(0,0):OY=PT(0,1)
100 P=INT(RND(0)*3)
110 NX=(PT(P,0)+OX)/2:NY=(PT(P,1)+OY)/2
120 PLOT NX,NY:OX=NX:OY=NY:GOTO 100

Changes for the Color Computer:

0 POKE65495,0

30 PT(2,0)=230:PT(2,1)=PT(1,1)

99 PMODE4,1:SCREEN1,1:PCLS:PSET(PT(0,0),PT(0,1),1):OX=PT(0,0):OY=PT(0,1)
120 PSET(NX,NY,1):OX=NX:OY=NY:GOTO 100


 

Tuesday, May 31, 2022

More ray tracing in BASIC

More ray tracing

5  POKE65495,0:PMODE 4,1:PCLS:SCREEN1,1
10 SP = 2:O = 0:P = 0.5: DIM C(SP,3),R(SP),Q(SP)
20  FOR K = 1 TO SP: READ C(K,1),C(K,2),C(K,3),T:R(K) = T:Q(K) = T * T: NEXT K
30  DATA -0.3,-0.8,3,0.6
40  DATA 0.9,-1.1,2,0.2
50  FOR I = 0 TO 191: FOR J = 0 TO 255
70 X = 0.3:Y =  - 0.5:Z = 0:DX = J - 128:DY = I - 96
72 DZ = 300:DD = DX * DX + DY * DY + DZ * DZ
100 N =  - 1: IF Y <  = O AND DY > O THEN N = 0:S =  - Y / DY
110  FOR K = 1 TO SP:PX = C(K,1) - X:PY = C(K,2) - Y:PZ = C(K,3) - Z
140 SC = PX * DX + PY * DY + PZ * DZ
150  IF SC <  = O GOTO 200
155 PP = PX * PX + PY * PY + PZ * PZ
160 BB = SC * SC / DD:AA = Q(K) - PP + BB
180  IF AA <  = O GOTO 200
190 SC = ( SQR (BB) -  SQR (AA)) /  SQR (DD): IF SC < S OR N < O THEN N = K:S = SC
200  NEXT K: IF N < 0 GOTO 350
220 DX = DX * S:DY = DY * S:DZ = DZ * S:DD = DD * S * S:X = X + DX:Y = Y + DY:Z = Z + DZ
240  IF N = O GOTO 300
250 NX = X - C(N,1):NY = Y - C(N,2):NZ = Z - C(N,3)
270 L = 2 * (DX * NX + DY * NY + DZ * NZ) / Q(N)
280 DX = DX - NX * L:DY = DY - NY * L:DZ = DZ - NZ * L: GOTO 100
300  FOR K = 1 TO SP:U = C(K,1) - X:V = C(K,3) - Z: IF U * U + V * V <  = Q(K) GOTO 350
320  NEXT K
330  IF ((X -  INT (X)) > P) <  > ((Z -  INT (Z)) > P) THEN  PSET(J,I)
350  NEXT J,I
360  GOTO 360

 

 

 

More BASIC

Version for all Color Computers:
0 POKE65495,0:PCLEAR4:PMODE 4,1:PCLS1:SCREEN 1,0
1 B=0:A=0:I=0:PI=3.141592
10 FOR I=0 TO 2*PI STEP PI/180
20 FOR A=0 TO 7:FOR B=0 TO 7
30 PRESET(44+21*A+10*SIN((A+1)*I),175-(14+21*B-10*COS((B+1)*I)))
40 NEXT B:NEXT A:NEXT I
50 GOTO 50


CoCo 3 version with math patch and a few optimizations:

0 POKE65497,0:PCLEAR4:PMODE 4,1:PCLS1:SCREEN 1,0
1 AD=VAL("&HFA0C")
2 FORI=0 TO 64:READ B$:A=VAL("&H"+B$)
3 POKE AD+I,A:NEXT
REM $BB00 JMP $FA0C
4 POKE VAL("&HBB02"),VAL("&H7E"):POKE VAL("&HBB03"),VAL("&HFA"):POKE VAL("&HBB04"),VAL("&H0C")
5 B=0:A=0:I=0:PI=3.141592
10 FOR I=0 TO 2*PI STEP PI/180
20 FOR A=0 TO 7:FOR B=0 TO 7
30 PRESET(44+21*A+10*SIN((A+1)*I),175-(14+21*B-10*COS((B+1)*I)))
40 NEXT B:NEXT A:NEXT I
50 GOTO 50
1000 DATA 32,79,E7,60,96,60,3D,ED,63,E6,60,96,5E,3D,ED,61,E6,60,96,5D
1001 DATA 3D,ED,65,E6,60,96,5F,3D,E3,62,ED,62,EC,65,E9,61,89,00,ED,60
1002 DATA EC,63,D3,15,97,16,D7,63,EC,61,D9,14,99,13,DD,14,A6,60,89,00
1003 DATA 97,13,32,67,39