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