String Art

10 REM Attempt at 'string art' by Richard Russell, 06-Nov-2025
20 REM Needs 'BBC BASIC for Windows' or 'BBC BASIC for SDL 2.0'
30
40 VDU 23,22,512;512;8,16,16,0 : OFF
50 INSTALL @lib$ + "aagfxlib"
60 PROC_aaellipsefill(512, 512, 480, 480, 0, &FFFFFFFF)
70
80 DIM bmp{bfType{l&,h&}, bfSize%, bfReserved%, bfOffBits%, \
90 \ biSize%, biWidth%, biHeight%, biPlanes{l&,h&}, biBitCount{l&,h&}, \
100 \ biCompression%, biSizeImage%, biXPelsPerMeter%, biYPelsPerMeter%, \
110 \ biClrUsed%, biClrImportant%, rgb&(239,239,2)}, try{} = bmp{}
120 DIM used&(359,359) : FOR I% = 0 TO 359 : used&(I%,I%) = 1 : NEXT
130
140 bmp$ = @dir$ + "marilyn.bmp"
150 tmp$ = @tmp$ + "sa.tmp.bmp"
160 try$ = @tmp$ + "sa.try.bmp"
170 OSCLI "LOAD """ + bmp$ + """ " + STR$~bmp{} + " +" + STR$~DIM(bmp{})
180
190 *HEX 64
200 *REFRESH OFF
210 REPEAT
220 finished% = TRUE
230 FOR peg% = 0 TO 359
240 OSCLI "GSAVE """ + tmp$ + """"
250 OSCLI "DISPLAY """ + tmp$ + """ 1024,0,512,512"
260 OSCLI "GSAVE """ + try$ + """ 1040,16,480,480"
270 OSCLI "LOAD """ + try$ + """ " + STR$~try{} + " +" + STR$~DIM(try{})
280
290 max% = 0
300 x1 = 120+119.9*COSRAD(peg%) : y1 = 120+119.9*SINRAD(peg%)
310 FOR try% = 0 TO 359
320 IF used&(peg%, try%) = 0 THEN
330 x2 = 120+119.9*COSRAD(try%) : y2 = 120+119.9*SINRAD(try%)
340 dx = x2-x1 : dy = y2-y1
350 D% = 0
360 IF ABS(dx) > ABS(dy) THEN
370 dy /= dx
380 FOR X% = x1 TO x2 STEP SGN(x2-x1)
390 Y% = y1 + (X% - x1) * dy
400 IF Y% < 240 D% += try.rgb&(Y%,X%,1) - bmp.rgb&(Y%,X%,1)
410 NEXT
420 ELSE
430 dx /= dy
440 FOR Y% = y1 TO y2 STEP SGN(y2-y1)
450 X% = x1 + (Y% - y1) * dx
460 IF X% < 240 D% += try.rgb&(Y%,X%,1) - bmp.rgb&(Y%,X%,1)
470 NEXT
480 ENDIF
490 IF D% > max% max% = D% : best% = try%
500 ENDIF
510 NEXT
520
530 IF max% > 2000 THEN
540 x1 = 512+480*COSRAD(peg%) : y1 = 512+480*SINRAD(peg%)
550 x2 = 512+480*COSRAD(best%) : y2 = 512+480*SINRAD(best%)
560 PROC_aaline(x1, y1, x2, y2, 1.5, &08000000, 0)
570 finished% = FALSE
580 used&(peg%, best%) = 1
590 VDU 30 : PRINT '" Strings = "; SUM(used&()) - 360;
600 *REFRESH
610 ENDIF
620
630 NEXT peg%
640 UNTIL finished%
650 *REFRESH ON
660 PRINT '" Finished."
670 END
(via Richard Russell auf Facebook)
Siehe auch BBC BASIC.