10 REM Dragon curve 20 REM SIN, COS in arrays for PI/4 multipl. 30 DIM S(7), C(7) 40 QPI=ATN(1):SQ=SQR(2) 50 FOR I=0 TO 7 60 S(I)=SIN(I*QPI):C(I)=COS(I*QPI) 70 NEXT I 80 LEVEL=15 90 INSIZE=32:REM 2^WHOLE_NUM (looks better) 100 X=34:Y=16 110 ROTQPI=0:RQ=1 120 DIM R(LEVEL) 130 CLS 140 GOSUB 160 150 END 160 REM ** Dragon 170 ROTQPI=ROTQPI AND 7 180 IF LEVEL>1 THEN GOTO 240 190 YN=S(ROTQPI)*INSIZE+Y 200 XN=C(ROTQPI)*INSIZE+X 210 GOSUB 370 220 X=XN:Y=YN 230 RETURN 240 INSIZE=INSIZE*SQ/2 250 ROTQPI=(ROTQPI+RQ)AND 7 260 LEVEL=LEVEL-1 270 R(LEVEL)=RQ:RQ=1 280 GOSUB 160 290 ROTQPI=(ROTQPI-R(LEVEL)*2)AND 7 300 RQ=-1 310 GOSUB 160 320 RQ=R(LEVEL) 330 ROTQPI=(ROTQPI+RQ)AND 7 340 LEVEL=LEVEL+1 350 INSIZE=INSIZE*SQ 360 RETURN 370 REM ** Draw a line from (X, Y) to (XN, YN) 380 IF ABS(XN-X)>1 OR ABS(YN-Y)>1 THEN 400 390 SET(X,Y):SET(XN,YN):RETURN 400 IF ABS(XN-X)>ABS(YN-Y) THEN 480 410 REM More vertical line 420 A=(XN-X)/(YN-Y) 430 IF YN>Y THEN D=1 ELSE D=-1 440 FOR YC=Y TO YN STEP D 450 SET(X+A*(YC-Y),YC) 460 NEXT YC 470 RETURN 480 REM More horizontal line 490 A=(YN-Y)/(XN-X) 500 IF XN>X THEN D=1 ELSE D=-1 510 FOR XC=X TO XN STEP D 520 SET(XC,Y+A*(XC-X)) 530 NEXT XC 540 RETURN