Waves in 2D- computer ripple tank

I wanted to replace the messy ripple tanks used to get familiar with wave behaviour with computer equivalents.

- -

Previous attempts had used line graphics and the drawing 'circle' command. But they don't LOOK right. I wanted grey-scale images that looked more realistic. This led to some pretty slow code, but images can be saved and animated as GIFs. And yes, I accidentally animated this backwards!!

- -

It was particularly fun to model phased-arrays of multipole emitters and create a steerable main lobe.

- -

- -


Code

Just examples- many variants have been used...


    '   *********************************************************
    '   **                                                     **
    '   ** aniRippleV7b.bas    tenochtitlanuk    18/06/2020    **
    '   **                                                     **
    '   *********************************************************


    '   Generate stills to create animations of travelling waves.

    '   To-dos
    '       -change so calculates how much each source adds so total <256 and >=0.
    '       -check against preferred LB5 syntax.
    '       -add programmatic change to frequency /wavelength.
     '          -speed up a lot by summing waves then drawing each point.

    nomainwin

    WindowWidth  =530
    WindowHeight =550

    open "Animate Phased Array" for graphics_nsb as #wg

    #wg "trapclose quit"
    #wg "down"
    #wg "size 1 ; fill 128 128 128"

    dim screen( 500, 500)

    phaseLag    =0.8
    pi          =4 *atn( 1)
    '   phaseLag   is amount adjacent sources lag by for steering.
    '   delay      is overall phase offset to move pattern outwards fraction of wavelength.

    delay = 0
    count =20

    for wLength  =0.5 to 4 step 0.5

        for x =0 to 499 step 1
            for y =0 to 499 step 1

                 screen( x, y)      =128

                 for j =1 to 2
                    radialDist         =sqr( ( x -200 -j *32)^2 +( 460 -y)^2)
                    screen( x, y)      =screen( x, y) +62 *( sin( radialDist /wLength +j *phaseLag +delay))
                    scan
                next j

                #wg "color "; screen( x, y); " "; screen( x, y); " "; screen( x, y)
                #wg "set "; 10 +x; " "; 10 +y

            next y
        next x

        #wg "flush ; getbmp scr 0 0 520 540"
        bmpsave "scr", "V8" +right$( "00" +str$( count), 2) +".bmp"
        #wg "cls ; fill 128 128 126"
        count   =count -1

    next wLength

    wait

    sub quit h$
        close #wg
        end
    end sub


    nomainwin

    WindowWidth  =530
    WindowHeight =550

    open "Animate Phased Array" for graphics_nsb as #wg

    #wg "trapclose quit"
    #wg "down"
    #wg "size 1 ; fill 128 128 128"

    dim screen( 500, 500)

    global phaseLag, delay: phaseLag =1.5: pi =4 *atn( 1)

    for delay  =0 to 2 *pi step pi /5
        for x =0 to 499
            for y =0 to 499
                screen( x, y) =128
            next y
        next x

        call populate 1
        #wg "getbmp scr 0 0 530 550"
        bmpsave "scr", "aniRipple" +str$( time$( "seconds")) +".bmp"
        #wg "cls ; fill 128 128 126"
    next delay

    wait

    sub quit h$
        close #wg
        end
    end sub

    sub populate i
        for j =1 to i
            for x =0 to 499 step 1
                for y =0 to 499 step 1
                    radialDist =sqr( ( x -200 -j *16)^2 +( 460 -y)^2)
                    screen( x, y) =screen( x, y) +127 *( sin( radialDist /4 +j *phaseLag +delay))
                    #wg "color "; int( screen( x, y)); " "; int( screen( x, y)); " "; int( screen( x, y))
                    #wg "set "; 10 +x; " "; 10 +y
                    scan
                next y
            next x
        next j
    end sub