>b's weblog

“Zu sagen was ist, bleibt die revolutionärste Tat.” (Rosa Luxemburg)

Welthandel im Wandel: USA reduzieren ihr Handelsdefizit drastischIm Gedenken an jene, die in der Woche vom 29.12.2025 bis 5.1.2026 “plötzlich und unerwartet” gestorben sind

String Art

String Art, BASIC Programming Language, Richard Russell · November 7, 2025

 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.