Post by tsh73 on Sept 26, 2019 21:16:15 GMT
it came as a side result of this lb thread
Run it.
Then scroll down to
or write your own.
Run it.
Then scroll down to
function r(fi)
and uncomment any other r(fi) or write your own.
nomainwin
global winW, winH, xmin, xmax, ymin, ymax
WindowHeight=630
WindowWidth=600
open "pretty polar plot" for graphics_nsb_nf as #gr
#gr "trapclose [quit]"
#gr "down"
#gr "home"
#gr "posxy w h"
winW=2*w: winH=2*h
global pi, fixed1
pi=acs(-1)
fixed1=(pi/3)
boundsAreKnown=0
if boundsAreKnown then
'bounds are known?
xmin=-3: xmax=3
ymin=-3: ymax=3
else
xmin=1e5: xmax=0-xmin
ymin=xmin: ymax=xmax
nPoints=300 'just for min/max
dfi=2*pi/nPoints 'so this will be step in math coordinates
for fi=0 to 2*pi step dfi
r=r(fi)
x=r*cos(fi)
y=r*sin(fi)
if x>xmax then xmax=x
if x<xmin then xmin=x
if y>ymax then ymax=y
if y<ymin then ymin=y
next
end if
'(0,0) for acymmetric graphs
home$="place ";int(sx(0));" ";int(sy(0))
nPoints=1000 'to have filled figure, more points
dfi=2*pi/nPoints
'now we just - plot function. Note same loop
#gr "color red"
#gr "size 3"
r=r(0)
x=r*cos(fi)
y=r*sin(fi)
#gr "set ";sx(x);" ";sy(y) 'just set first dot
for fi=0 to 2*pi step dfi
r=r(fi)
x=r*cos(fi)
y=r*sin(fi)
#gr "color ";rainbow$(fi/(2*pi)) 'rainbow fill
#gr home$ 'with this, from center - filled figure
#gr "goto ";sx(x);" ";sy(y) 'connect dots
next
'and finally, add axis
#gr "color black"
#gr "size 1"
#gr "line ";sx(xmin);" ";sy(0);" ";sx(xmax);" ";sy(0)
#gr "line ";sx(0);" ";sy(ymin);" ";sx(0);" ";sy(ymax)
'labeling
#gr "place ";sx(0)+5;" ";sy(0)-5
#gr "\0,0"
#gr "place ";sx(xmax)-20;" ";sy(0)-5
#gr "\X"
#gr "place ";sx(0)+5;" ";sy(ymax)+20
#gr "\Y"
#gr "place ";sx(1)+5;" ";sy(0)-5
#gr "\1"
#gr home$
'notice xmax;" ";sx(xmax);" ";sx(1)
#gr "circle ";sx(1)-sx(0)
#gr "flush"
#gr, "getbmp drawing 1 1 ";winW;" ";winH
bmpsave "drawing", "graph.bmp"
wait
[quit]
close #gr
end
'To translate X from interval [a,b] to [c,d] we'll do (X-a)/(b-a)*(d-c)+c.
'create two functions: sx(x) and sy(y)
function sx(x)
sx=(x-xmin)/(xmax-xmin)*winW
end function
function sy(y)
sy=winH-(y-ymin)/(ymax-ymin)*winH 'Y is inverted, so winH-...
end function
function rainbow$(x)
hi = int((x*6) mod 6)+ 5*(x<0) 'fixed to 0..5
f = (x*6) mod 1 + (x<0) 'frac, 0..1
q = (1-f)
select case hi
case 0
r = 1: g = f: b = 0
case 1
r = q: g = 1: b = 0
case 2
r = 0: g = 1: b = f
case 3
r = 0: g = q: b = 1
case 4
r = f: g = 0: b = 1
case 5
r = 1: g = 0: b = q
end select
R = int(r*255)
G = int(g*255)
B = int(b*255)
rainbow$= R;" ";G;" ";B
end function
function r(fi)
'r=2 'circle, stright and boring
'r=(fi mod 1) + 1 'broken sawtooth
'r=(fi mod fixed1) + 1 'fixed sawtooth
'r=(fi mod (fixed1/4)) + 1 'fixed sawtooth
r=abs((fi mod fixed1)*2-fixed1) + 1 'triangle
'r=abs((fi mod (fixed1/4))*2-(fixed1/4)) + 1 'more tooths. better tooths
'r=abs((fi mod fixed1)*2-fixed1)^2 + 1 'tri^2
'r=abs((fi mod (fixed1/4))*2-(fixed1/4))^2 + 1 'tri^2
'r=cos(6*fi) + 4 'sine wave wrapped on a circle (changed to COS to better align angle-wise)
'r=cos(6*4*fi) + 10 'sine wave, more tooths
end function