RosettaCodeData/Task/Dragon-curve/Nascom-BASIC/dragon-curve.basic
2025-02-27 18:35:13 -05:00

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