The phenomenon of 'percolation' the passage of fluid or gas through solids of varying permeability, also has relevance to spread of diseases or polymerisation. The article stimulated me to animate the process as I found the article' static diagrams rather weak for helping understanding!
I create a rectangular grid representing nodes linked to their four neighbours ( or an edge). I then block these with a chosen probability- eg 0.5 means on average half the links are blocked. 100% is no-connections. 0% means 'no links obstructed'.
I then find in turn all entry links which are open, and follow each to the end of all connections that are open- or until it reaches the far-left side.
In the animation below, you can see how far the blue 'water' gets for ten different probabilities.
nomainwin global offset offset = 50 Rand = 0.6 ' probability crack is open WindowWidth =640 WindowHeight =630 open "Percolation" for graphics_nsb as #wg hw =hwnd( #wg) calldll #user32, "GetDC", hw as ulong, hdc as ulong #wg "trapclose quit" for Rand =0.00 to 1.00 step 0.1 #wg "cls ; down" #wg "backcolor 255 0 0 ; fill 192 192 192" call delay 100 #wg "place "; offset; " "; 0 #wg "boxfilled "; offset +610; " "; 610 call makeGrid call changeLink Rand #wg "size 10 ; color black ; down ; set 620 300" 'targetcolor =192 +192 *2^8 +192 *2^16 targetcolor =int( 255 +0 *2^8 +0 *2^16) ' to fill out to or within. Here RED. x =620: y =320 ' fill with blue water from near the black spot. #wg "backcolor 150 150 255" #wg "size 3" call delay 1000 calldll #gdi32, "ExtFloodFill",_ hdc as ulong,_ x as long,_ y as long,_ targetcolor as long,_ _ '_FLOODFILLSURFACE as long, result as long 'ie fill out 'WHILE this colour is met. _FLOODFILLBORDER as long, result as long 'ie fill out 'til this colour is met.. #wg "place 8 60 ; color red ; backcolor 192 192 192" #wg "\"; using( "#.###", Rand) #wg "flush ; getbmp scr 1 1 630 600" bmpsave "scr", "rocks_" +str$( Rand) +".bmp" call delay 1000 next Rand wait sub makeGrid #wg "color 192 192 192 ; size 3" for x =offset +0 -10 to 610 step 10 #wg "line "; x; " "; 0; " "; x; " "; 600 next x for y =0 -10 to 600 step 10 #wg "line "; offset; " "; y; " "; offset +560; " "; y next y #wg "backcolor 192 192 192 ; up ; goto 612 0 ; down ; boxfilled "; 630; " "; 630 #wg "backcolor 192 192 192 ; up ; goto 0 0 ; down ; boxfilled "; 50; " "; 630 scan end sub sub changeLink probability #wg "color 255 0 0" #wg "size 10" for x =offset +5 to offset +550 step 10 for y =0 to 600 step 10 if probability <=rnd( 1) then #wg "set "; x +5; " "; y next y next x scan end sub sub delay sleeptime calldll #kernel32, "Sleep", sleeptime as long, ret as void scan end sub sub quit h$ calldll #user32, "ReleaseDC", hw as ulong, hdc as ulong, ret as void 'release the DC close #h$ end end sub