There has been a spate of sightings of this illusion on YouTube, TikTok etc. I fancied coding it. Using LB's drawing commands it is quite easy, but the result has visible drawing delays on my machine, Instead I thought I'd do it with sprites. These are made in a separate LB program as BMPs and then converted to sprites. A pretty background of where I am at present makes it look more interesting. By saving each frame I can assemble an animated GIF which I can use, without LB, on my website or to email to a friend.
Adding variations is easier- starting with one ball and then adding a new one each revolution, altering number of balls, rotating each sprite... all good fun.
' I created the sprites separately as bmp's then used LB's sprite converter.
nomainwin
WindowWidth =580
WindowHeight =530
open "Sprite demo" for graphics_nsb as #wg
#wg "trapclose quit"
loadbmp "background", "background2.bmp" ' You can choose any image as background.
#wg "background background"
for j =1 to 8
loadbmp "ball" +str$( j), "ball" +str$( j) +"Sprite.bmp"
#wg "addsprite ballSpr" +str$( j) +" ball" +str$( j)
#wg "centersprite ballSpr" +str$( j)
next j
i =1
do
for k =1 to 8 ' ' for each of eight diagonal
th =( 22.5 *( i +k)) ' th =angle of diagonal path
r =170 *sinRad( i *4.5 +22.5 *k) ' sinusoidal change to radius
xSc =int( 280 +r *sinRad( 22.5 *k))
ySc =int( 250 -r *cosRad( 22.5 *k))
#wg "spritexy ballSpr" +str$( k) +" "; xSc; " "; ySc
#wg "drawsprites"
'calldll #kernel32, "Sleep", 100 as long, ret as void
next k
calldll #kernel32, "Sleep", 50 as long, ret as void
scan
i =i +1
' save each image to assemble a animated GIF to use elsewhere
'#wg "getbmp scr 1 1 580 530"
'bmpsave "scr", "aniBalls" +right$( "00000" +str$( i), 5) +".bmp"
loop until i >10000
wait
function sinRad( t)
sinRad =sin( t *3.14159265 /180)
end function
function cosRad( t)
cosRad =cos( t *3.14159265 /180)
end function
sub quit h$
close #h$
end
end sub