54 lines
1.2 KiB
Text
54 lines
1.2 KiB
Text
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
|