NB This program calls dlls, so is LB only, although you can use RB if you are prepared to load the bmp as a binary file and look up each pixel...
The surface involved is simply equal to the radius, so represents a conical depression.
The colour scales were created with graduated fills in the GIMP (any paint software would do) and saved as a 24 bit bmp, which LB can load and interrogate pixel by pixel to get the rgb values. This is much more flexible than any method relying on calculating r g and b from f( x, y).
Which do YOU think best represents the surface? Five are uni-valued. The others are multi-valued. The program automatically saves them as BMPs.
nomainwin
UpperLeftX = 200
UpperLeftY = 100
WindowWidth = 450
WindowHeight = 200
graphicbox #w.g0, 10, 10, 256, 140
graphicbox #w.g1, 320, 30, 100, 100
graphicbox #w.g2, 280, 10, 20, 140
dim ColLookUp$( 256, 12), v( 12)
open "3D surface" for graphics_nsb as #w
#w.g1, "down ; fill black"
#w, "trapclose [quit]"
handleg0 =hwnd( #w.g0)
calldll #user32, "GetDC", uhandleg0 as long, hDC as ulong
loadbmp "Scale", "QuadSpectrum.bmp" ' NB must be a 24 bit bmp...
#w.g0, "down ; drawbmp Scale 0 0"
#w.g0, "flush"
for l =1 to 11 ' since my bmp has 11 graduated colour stripes
read yy ' which is how far down next colour stripe is centred
v( l) =yy
for v =0 to 255
calldll #gdi32, "GetPixel",_
hDC as ulong,_
v as long,_
yy as long,_
pixcol as long
bl = int( pixcol /( 256*256))
gr = int( (pixcol -bl *256*256) / 256)
re = int( pixcol -bl *256*256 - gr *256)
ColLookUp$( v, l) =str$( re) +" " +str$( gr) +" " +str$( bl)
next v
scan
next l
unloadbmp "Scale"
callDll #user32, "ReleaseDC",_
handleg0 as ulong,_ ' handle of graphic box
hDC as ulong,_ ' dc from GetDC
result as ushort ' returns non-zero if successful
c =-1
[start]
timer 0
c =( c +1) mod 11 ' choose in turn each of 11 colour sequences. ( c =0 to 10)
ch =c +1 ' ch =1 to 11
#w.g2 "goto 10 "; v( ch); " ; down ; color red ; backcolor red ; circlefilled 5 ; up"
for x =0 to 99
scan
for y =0 to 99
r =( ( x -50)^2 +( y -50)^2)^0.5 ' r is radius from centre, between 0 and about 71
r =int( r)
#w.g1 "color "; ColLookUp$( int( r /72 *255), ch)
#w.g1 "set "; x; " "; y
next y
next x
sv$ ="Bump"; str$( ch)
#w.g1 "flush ; getbmp "; sv$; " 0 0 99 99"
bmpsave sv$, sv$+".bmp"
unloadbmp sv$
#w.g2 "goto 10 "; v( ch); " ; down ; color white ; backcolor white ; circlefilled 4 ; up"
timer 2000, [start]
wait
data 5, 18, 33, 44, 53, 62, 80, 93, 105, 118, 129
[quit]
confirm "Really exit?"; answer$
if answer$ ="no" then goto [start]
close #w
end