Dragon curve: Difference between revisions

Content deleted Content added
Laurence (talk | contribs)
→‎{{header|BASIC}}: In the direct and indirect translations of BASIC256, removed the unnecessary variable ITER (in BASIC256 it serves for colors). In Commodore BASIC and its translations, replaced num MOD 8 (previously realized by nested IFs) by bitwise num AND 7.
Line 669: Line 669:
90 x = 224 : y = 140
90 x = 224 : y = 140
100 sq = sqr(2)
100 sq = sqr(2)
110 rotqpi = 0 : iter = 0 : rq = 1
110 rotqpi = 0 : rq = 1
120 dim r(level)
120 dim r(level)
130 graphics 0 : graphics cls
130 graphics 0 : graphics cls
Line 675: Line 675:
150 end
150 end
160 rem Dragon
160 rem Dragon
170 if rotqpi < 0 then
170 rotqpi = rotqpi and 7
180 rotqpi = rotqpi+8
180 if level <= 1 then
190 yn = s(rotqpi)*insize+y
190 else
200 if rotqpi > 7 then rotqpi = rotqpi-8
200 xn = c(rotqpi)*insize+x
210 graphics moveto x,y : graphics lineto xn,yn
210 endif
220 if level > 1 then goto 290
220 x = xn : y = yn
230 else
230 yn = s(rotqpi)*insize+y
240 xn = c(rotqpi)*insize+x
240 insize = insize*sq/2
250 rotqpi = (rotqpi+rq) and 7
250 graphics moveto x,y : graphics lineto xn,yn
260 iter = iter+1
260 level = level-1
270 x = xn : y = yn
270 r(level) = rq : rq = 1
280 return
280 gosub 160
290 insize = insize*sq/2
290 rotqpi = (rotqpi-r(level)*2) and 7
300 rotqpi = rotqpi+rq
300 rq = -1
310 if rotqpi < 0 then
310 gosub 160
320 rotqpi = rotqpi+8
320 rq = r(level)
330 rotqpi = (rotqpi+rq) and 7
330 else
340 if rotqpi > 7 then rotqpi = rotqpi-8
340 level = level+1
350 insize = insize*sq
350 endif
360 level = level-1
360 endif
370 return
370 r(level) = rq : rq = 1
380 gosub 160
390 rotqpi = rotqpi-r(level)*2
400 if rotqpi < 0 then
410 rotqpi = rotqpi+8
420 else
430 if rotqpi > 7 then rotqpi = rotqpi-8
440 endif
450 rq = -1
460 gosub 160
470 rq = r(level)
480 rotqpi = rotqpi+rq
490 if rotqpi < 0 then
500 rotqpi = rotqpi+8
510 else
520 if rotqpi > 7 then rotqpi = rotqpi-8
530 endif
540 level = level+1
550 insize = insize*sq
560 return
</syntaxhighlight>
</syntaxhighlight>


Line 725: Line 706:
20 REM SIN, COS IN ARRAYS FOR PI/4 MULTIPL.
20 REM SIN, COS IN ARRAYS FOR PI/4 MULTIPL.
30 DIM S(7),C(7)
30 DIM S(7),C(7)
40 QPI=ATN(1)
40 QPI=ATN(1):SQ=SQR(2)
50 FOR I=0 TO 7
50 FOR I=0 TO 7
60 S(I)=SIN(I*QPI)
60 S(I)=SIN(I*QPI):C(I)=COS(I*QPI)
70 NEXT I
70 C(I)=COS(I*QPI)
80 NEXT I
80 LEVEL=15
90 INSIZE=128:REM 2^WHOLE_NUM (LOOKS BETTER)
90 LEVEL=15
100 X=112:Y=70
100 INSIZE=128:REM 2^WHOLE_NUM (LOOKS BETTER)
110 X=112
110 ROTQPI=0:RQ=1
120 Y=70
120 DIM R(LEVEL)
130 SQ=SQR(2)
130 GRAPHIC 2,1
140 GOSUB 160
140 ROTQPI=0:ITER=0:RQ=1
150 DIM R(LEVEL)
150 END
160 GRAPHIC 2,1
160 REM DRAGON
170 GOSUB 190
170 ROTQPI=ROTQPI AND 7
180 IF LEVEL>1 THEN GO TO 240
180 END
190 YN=S(ROTQPI)*INSIZE+Y
190 REM DRAGON
200 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 220
200 XN=C(ROTQPI)*INSIZE+X
210 DRAW ,X,Y TO XN,YN
210 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
220 X=XN:Y=YN
220 IF LEVEL>1 THEN GO TO 290
230 RETURN
230 YN=S(ROTQPI)*INSIZE+Y
240 XN=C(ROTQPI)*INSIZE+X
240 INSIZE=INSIZE*SQ/2
250 ROTQPI=(ROTQPI+RQ)AND 7
250 DRAW ,X,Y TO XN,YN
260 ITER=ITER+1
260 LEVEL=LEVEL-1
270 X=XN:Y=YN
270 R(LEVEL)=RQ:RQ=1
280 RETURN
280 GOSUB 160
290 ROTQPI=(ROTQPI-R(LEVEL)*2)AND 7
290 INSIZE=INSIZE*SQ/2
300 ROTQPI=ROTQPI+RQ
300 RQ=-1
310 GOSUB 160
310 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 330
320 RQ=R(LEVEL)
320 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
330 ROTQPI=(ROTQPI+RQ)AND 7
330 LEVEL=LEVEL-1
340 R(LEVEL)=RQ:RQ=1
340 LEVEL=LEVEL+1
350 INSIZE=INSIZE*SQ
350 GOSUB 190
360 RETURN
360 ROTQPI=ROTQPI-R(LEVEL)*2
370 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 390
380 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
390 RQ=-1
400 GOSUB 190
410 RQ=R(LEVEL)
420 ROTQPI=ROTQPI+RQ
430 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 450
440 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
450 LEVEL=LEVEL+1
460 INSIZE=INSIZE*SQ
470 RETURN
</syntaxhighlight>
</syntaxhighlight>


Line 803: Line 773:
{{works with|BASICA}}
{{works with|BASICA}}
{{works with|QBasic}}
{{works with|QBasic}}
{{trans|Commodore BASIC}}
{{trans|Commodore BASIC|<code>... MOD 8</code> (originally realized by nested <code>IF</code>s) replaced by bitwise operations (<code>... AND 7</code>).}}
<syntaxhighlight lang="qbasic">10 REM Dragon curve
<syntaxhighlight lang="qbasic">10 REM Dragon curve
20 REM SIN, COS in arrays for PI/4 multipl.
20 REM SIN, COS in arrays for PI/4 multipl.
30 DIM S(7), C(7)
30 DIM S(7), C(7)
40 QPI = ATN(1)
40 QPI = ATN(1): SQ = SQR(2)
50 FOR I = 0 TO 7
50 FOR I = 0 TO 7
60 S(I) = SIN(I * QPI)
60 S(I) = SIN(I * QPI): C(I) = COS(I * QPI)
70 C(I) = COS(I * QPI)
70 NEXT I
80 NEXT I
80 LEVEL% = 15
90 INSIZE = 128: REM 2^WHOLE_NUM (looks better)
90 LEVEL% = 15
100 INSIZE = 128: REM 2^WHOLE_NUM (looks better)
100 X = 112: Y = 70
110 X = 112
110 ROTQPI% = 0: RQ% = 1
120 Y = 70
120 DIM R%(LEVEL%)
130 SQ = SQR(2)
130 SCREEN 2: CLS
140 GOSUB 160
140 ROTQPI% = 0: ITER% = 0: RQ% = 1
150 DIM R%(LEVEL%)
150 END
160 SCREEN 2: CLS
160 REM ** Dragon
170 ROTQPI% = ROTQPI% AND 7
170 GOSUB 190
180 IF LEVEL% > 1 THEN GOTO 240
180 END
190 REM ** Dragon
190 YN = S(ROTQPI%) * INSIZE + Y
200 ROTQPI% = ROTQPI% AND 7
200 XN = C(ROTQPI%) * INSIZE + X
210 LINE (2 * X, Y)-(2 * XN, YN): REM For SCREEN 2 doubled x-coords
210 IF LEVEL% > 1 THEN GOTO 280
220 YN = S(ROTQPI%) * INSIZE + Y
220 X = XN: Y = YN
230 RETURN
230 XN = C(ROTQPI%) * INSIZE + X
240 INSIZE = INSIZE * SQ / 2
240 LINE (2 * X, Y)-(2 * XN, YN): REM For SCREEN 2 doubled x-coords
250 ITER% = ITER% + 1
250 ROTQPI% = (ROTQPI% + RQ%) AND 7
260 X = XN: Y = YN
260 LEVEL% = LEVEL% - 1
270 R%(LEVEL%) = RQ%: RQ% = 1
270 RETURN
280 GOSUB 160
280 INSIZE = INSIZE * SQ / 2
290 ROTQPI% = (ROTQPI% + RQ%) AND 7
290 ROTQPI% = (ROTQPI% - R%(LEVEL%) * 2) AND 7
300 LEVEL% = LEVEL% - 1
300 RQ% = -1
310 GOSUB 160
310 R%(LEVEL%) = RQ%: RQ% = 1
320 GOSUB 190
320 RQ% = R%(LEVEL%)
330 ROTQPI% = (ROTQPI% - R%(LEVEL%) * 2) AND 7
330 ROTQPI% = (ROTQPI% + RQ%) AND 7
340 RQ% = -1
340 LEVEL% = LEVEL% + 1
350 GOSUB 190
350 INSIZE = INSIZE * SQ
360 RETURN</syntaxhighlight>
360 RQ% = R%(LEVEL%)
370 ROTQPI% = (ROTQPI% + RQ%) AND 7
380 LEVEL% = LEVEL% + 1
390 INSIZE = INSIZE * SQ
400 RETURN</syntaxhighlight>


==={{header|IS-BASIC}}===
==={{header|IS-BASIC}}===
Line 930: Line 896:
20 REM SIN, COS in arrays for PI/4 multipl.
20 REM SIN, COS in arrays for PI/4 multipl.
30 DIM S(7),C(7)
30 DIM S(7),C(7)
40 QPI=ATN(1)
40 QPI=ATN(1):SQ=SQR(2)
50 FOR I=0 TO 7
50 FOR I=0 TO 7
60 S(I)=SIN(I*QPI)
60 S(I)=SIN(I*QPI):C(I)=COS(I*QPI)
70 NEXT I
70 C(I)=COS(I*QPI)
80 NEXT I
80 LEVEL=15
90 INSIZE=128:REM 2^WHOLE_NUM (looks better)
90 LEVEL=15
100 X=80:Y=70
100 INSIZE=128:REM 2^WHOLE_NUM (looks better)
110 X=80
110 ROTQPI=0:RQ=1
120 Y=70
120 DIM R(LEVEL)
130 SQ=SQR(2)
130 SCREEN 2
140 GOSUB 200
140 ROTQPI=0:ITER=0:RQ=1
150 OPEN "GRP:" FOR OUTPUT AS #1
150 DIM R(LEVEL)
160 DRAW "BM 0,184":PRINT #1,"Hit any key to exit."
160 SCREEN 2
170 IF INKEY$="" THEN 170
170 GOSUB 230
180 OPEN "GRP:" FOR OUTPUT AS #1
180 CLOSE #1
190 END
190 DRAW "BM 0,184":PRINT #1,"Hit any key to exit."
200 REM Dragon
200 IF INKEY$="" THEN 200
210 CLOSE #1
210 ROTQPI=ROTQPI AND 7
220 IF LEVEL>1 THEN GOTO 280
220 END
230 YN=S(ROTQPI)*INSIZE+Y
230 REM Dragon
240 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 260
240 XN=C(ROTQPI)*INSIZE+X
250 LINE (X,Y)-(XN,YN)
250 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
260 X=XN:Y=YN
260 IF LEVEL>1 THEN GOTO 330
270 RETURN
270 YN=S(ROTQPI)*INSIZE+Y
280 XN=C(ROTQPI)*INSIZE+X
280 INSIZE=INSIZE*SQ/2
290 LINE (X,Y)-(XN,YN)
290 ROTQPI=(ROTQPI+RQ)AND 7
300 ITER=ITER+1
300 LEVEL=LEVEL-1
310 X=XN:Y=YN
310 R(LEVEL)=RQ:RQ=1
320 RETURN
320 GOSUB 200
330 ROTQPI=(ROTQPI-R(LEVEL)*2)AND 7
330 INSIZE=INSIZE*SQ/2
340 ROTQPI=ROTQPI+RQ
340 RQ=-1
350 GOSUB 200
350 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 370
360 RQ=R(LEVEL)
360 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
370 ROTQPI=(ROTQPI+RQ)AND 7
370 LEVEL=LEVEL-1
380 R(LEVEL)=RQ:RQ=1
380 LEVEL=LEVEL+1
390 INSIZE=INSIZE*SQ
390 GOSUB 230
400 RETURN
400 ROTQPI=ROTQPI-R(LEVEL)*2
410 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 430
420 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
430 RQ=-1
440 GOSUB 230
450 RQ=R(LEVEL)
460 ROTQPI=ROTQPI+RQ
470 IF ROTQPI<0 THEN ROTQPI=ROTQPI+8:GOTO 490
480 IF ROTQPI>7 THEN ROTQPI=ROTQPI-8
490 LEVEL=LEVEL+1
500 INSIZE=INSIZE*SQ
510 RETURN
</syntaxhighlight>
</syntaxhighlight>


Line 1,406: Line 1,361:
<syntaxhighlight lang="zxbasic">10 LET level=15: LET insize=120
<syntaxhighlight lang="zxbasic">10 LET level=15: LET insize=120
20 LET x=80: LET y=70
20 LET x=80: LET y=70
30 LET iters=2^level
30 LET sq=SQR (2): LET qpi=PI/4
40 LET qiter=256/iters
40 LET rotation=0: LET rq=1
50 DIM r(level)
50 LET sq=SQR (2): LET qpi=PI/4
60 GO SUB 70: STOP
60 LET rotation=0: LET iter=0: LET rq=1
70 DIM r(level)
70 REM Dragon
80 IF level>1 THEN GO TO 140
75 GO SUB 80: STOP
90 LET yn=SIN (rotation)*insize+y
80 REM Dragon
100 LET xn=COS (rotation)*insize+x
90 IF level>1 THEN GO TO 200
110 PLOT x,y: DRAW xn-x,yn-y
100 LET yn=SIN (rotation)*insize+y
110 LET xn=COS (rotation)*insize+x
120 LET x=xn: LET y=yn
130 RETURN
120 PLOT x,y: DRAW xn-x,yn-y
130 LET iter=iter+1
140 LET insize=insize/sq
150 LET rotation=rotation+rq*qpi
140 LET x=xn: LET y=yn
160 LET level=level-1
150 RETURN
200 LET insize=insize/sq
170 LET r(level)=rq: LET rq=1
180 GO SUB 70
210 LET rotation=rotation+rq*qpi
220 LET level=level-1
190 LET rotation=rotation-r(level)*qpi*2
230 LET r(level)=rq: LET rq=1
200 LET rq=-1
240 GO SUB 80
210 GO SUB 70
250 LET rotation=rotation-r(level)*qpi*2
220 LET rq=r(level)
230 LET rotation=rotation+rq*qpi
260 LET rq=-1
240 LET level=level+1
270 GO SUB 80
280 LET rq=r(level)
250 LET insize=insize*sq
260 RETURN </syntaxhighlight>
290 LET rotation=rotation+rq*qpi
300 LET level=level+1
310 LET insize=insize*sq
320 RETURN </syntaxhighlight>


=={{header|Befunge}}==
=={{header|Befunge}}==