#!yab
doc Draw some nice 3D curves
doc Original by Martin Lehmann for QBasic
doc
doc change the function func for different curves
doc try smaller values of i for a lower resolution
doc try z = 1 for less dots
doc
doc Note: this demo shows one thing: yab is slow :)
doc The cleanup of the drawing takes alot of time too,
doc you can simply break the program if you don't want to wait
doc

window open 100,100 to 739,579, "Win", "3D Curve"

bitmap 640,480, "DoubleBuffer"
canvas 0,0 to 639,479, "MyCanvas", "Win"

i = 128  // resolution
z = 0.5  // dot frequency
xk = 40
yk = 30

draw set "highcolor", 0,0,0, "DoubleBuffer"
draw rect 0,0 to 639,479, "DoubleBuffer"
draw bitmap 0,0, "DoubleBuffer", "copy",  "MyCanvas"

for t = -144 to 144 step(288/i)
	if(t=0) t=0.1
	r = int(0.5 + sqrt(20736 - t^2))
	for j = -r to r step z
		p = func(sqrt(j^2 + t^2) * 0.0327) * 20
		x = int(1.7 * (j + (t/2.25) + 160)) + xk
		y = int(1.8 * (199 - (p - t/2.25 + 90))) + yk
		draw set "highcolor", 255-r,j+r,255-p, "DoubleBuffer"
		draw line x,y to x,y, "DoubleBuffer"
		draw set "highcolor", 0,0,0, "DoubleBuffer"
		draw line x,y+1 to x,480, "DoubleBuffer"
	next j
	draw bitmap 0,0, "DoubleBuffer", "copy",  "MyCanvas"
next t

while(not instr(message$, "Quit"))
wend

window close "Win"

// Choose one of the functions below, comment out all others
sub func(n)
//	return cos(n) + cos(2*n) +cos(5*n)
//	return -abs(1/n)
//	return -abs(1/(n + j))
//	return sin(n) + sin(2*n) +sin(5*n)
//	return cos(sin(n))
	return cos(2*n) + cos((n+j)/16)
//	return sqrt(abs(0.5*(16 - n^2))) + 1/(n*4)
//	return cos(4*n) + 20/(n^2 + 3)
//	return cos(1/n) + cos(2/n) + cos(5/n) - 3
//	return cos(sin(j/n))
//	return 1/sqrt(n) - 3
end sub
