10DIM d(64, 32)
12HOME:VTAB 7:? TAB(4); "Fractal Landscape Plotter"
14FOR i=1 TO 2000:NEXT
20HOME
30? " Number of levels (1-6; 4 and 5 are best)? "; :GET le
34IF le>6 OR le<1 THEN GOTO 20
40 ds=2:FOR n=1 TO le: ds=ds+2^(n-1):NEXT n
50 mx=ds-1: my=mx/2: pi=3.1416: rh=pi*30/180: vt=rh*1.2
60FOR n=1 TO le: l=10000/1.8^n
65HOME
70? " Working on level "; n; "."
80 ib=mx/2^n: sk=ib*2
90GOSUB 150
100GOSUB 220
110GOSUB 290
120NEXT n
130GOTO 640
140REM       
150FOR ye=0 TO mx-1 STEP sk
160FOR xe=ib+ye TO mx STEP sk
170 ax=xe-ib: ay=ye:GOSUB 370: d1=d: ax=xe+ib:GOSUB 370: d2=d
180 d=(d1+d2)/2+RND(1)*l/2-l/4: ax=xe: ay=ye:GOSUB 420
190NEXT xe
200NEXT ye:RETURN
210REM       
220FOR xe=mx TO 1 STEP -sk
230FOR ye=ib TO xe STEP sk
240 ax=xe: ay=ye+ib:GOSUB 370: d1=d: ay=ye-ib:GOSUB 370: d2=d
250 d=(d1+d2)/2+RND(1)*l/2-l/4: ax=xe: ay=ye:GOSUB 420
260NEXT ye
270NEXT xe:RETURN
280REM       
290FOR xe=0 TO mx-1 STEP sk
300FOR ye=ib TO mx-xe STEP sk
310 ax=xe+ye-ib: ay=ye-ib:GOSUB 370: d1=d
320 ax=xe+ye+ib: ay=ye+ib:GOSUB 370: d2=d
330 ax=xe+ye: ay=ye: d=(d1+d2)/2+RND(1)*l/2-l/4:GOSUB 420
340NEXT ye
350NEXT xe:RETURN
360REM       
370IF ay>my THEN 390
380 by=ay: bx=ax:GOTO 400
390 by=mx+1-ay: bx=mx-ay
400 d=d(bx, by):RETURN
410REM       
420IF ay>my THEN 440
430 by=ay: bx=ax:GOTO 450
440 by=mx+1-ay: bx=mx-ax
450 d(bx, by)=d:RETURN
460REM       
470REM  
475IF xo<>-999 THEN 500
480IF zz<0 THEN GOSUB 1070: z2=zz: zz=0:GOTO 620
490GOSUB 1090:GOTO 610
500IF z2>0 AND zz>0 THEN 610
510IF z2<0 AND zz<0 THEN  z2=zz: zz=0:GOTO 620
520 w3=zz/(zz-z2): x3=(x2-xx)*w3+xx: y3=(y2-yy)*w3+yy: z3=0
530 zt=zz: yt=yy: xt=xx
540IF zz>0 THEN 590
550REM       
560 zz=z3: yy=y3: xx=x3:GOSUB 950
570GOSUB 1070: zz=0: yy=yt: xx=xt: z2=zt:GOTO 620
580REM       
590 zz=z3: yy=y3: xx=x3:GOSUB 950
600GOSUB 1090: zz=zt: yy=yt: xx=xt
610 z2=zz
620 x2=xx: y2=yy:RETURN
630REM       
640GOSUB 1110:REM       
650 xs=.0365: ys=.0365: zs=.037
660FOR ax=0 TO mx: xo=-999:FOR ay=0 TO ax
670GOSUB 370: zz=d: yy=ay/mx*10000: xx=ax/mx*10000-yy/2
680GOSUB 940:NEXT ay:NEXT ax
690FOR ay=0 TO mx: xo=-999:FOR ax=ay TO mx
700GOSUB 370: zz=d: yy=ay/mx*10000: xx=ax/mx*10000-yy/2
710GOSUB 940:NEXT ax:NEXT ay
720FOR ex=0 TO mx: xo=-999:FOR ey=0 TO mx-ex
730 ax=ex+ey: ay=ey:GOSUB 370: zz=d: yy=ay/mx*10000
740 xx=ax/mx*10000-yy/2:GOSUB 940:NEXT ey:NEXT ex
750GOTO 1130:REM      
760REM      
770IF xx<>0 THEN 800
780IF yy<=0 THEN  ra=-pi/2:GOTO 820
790 ra=pi/2:GOTO 820
800 ra=ATN(yy/xx)
810IF xx<0 THEN  ra=ra+pi
820 r1=ra+rh: rd=SQR(xx*xx+yy*yy)
830 xx=rd*COS(r1): yy=rd*SIN(r1)
840RETURN
850REM      
860 rd=SQR(zz*zz+xx*xx)
870IF xx=0 THEN  ra=pi/2:GOTO 900
880 ra=ATN(zz/xx)
890IF xx<0 THEN  ra=ra+pi
900 r1=ra-vt
910 xx=rd*COS(r1)+xx: zz=rd*SIN(r1)
920RETURN
930REM      
940GOSUB 470
950 xx=xx*xs: yy=yy*ys: zz=zz*zs
960GOSUB 770:REM      
970GOSUB 860:REM      
980IF xo=-999 THEN  pk$="M"
985IF xo<>-999 THEN  pk$="D"
990 xp=INT(yy)+cx: yp=INT(zz)
1000GOSUB 1030
1010RETURN
1020REM      
1030 xp=xp*.625: yp=33.14-.663*yp
1040IF pk$="M" THEN  x8=xp: y8=yp: xo=x
1045IF y8>191 OR y8<0 OR yp>191 OR yp<0 THEN RETURN
1047IF x8>255 OR x8<0 OR xp>255 OR xp<0 THEN RETURN
1050HPLOT x8, y8 TO xp, yp: x8=xp: y8=yp:RETURN
1060REM       sea color
1070HCOLOR =6:RETURN
1080REM       land color
1090HCOLOR =5:RETURN
1100REM      
1110HGR:RETURN
1120REM      
1130? " Would you like to plot"
1140? " another fractal landscape? "; :GET a$
1160IF a$="Y" OR a$="y" THEN GOTO 20
1165TEXT
1170END
