gosub initialise
gosub mainloop
exit

label mainloop
 repeat
  for t=0 to 1 step 0.03
   for a=1 to nd
    ax=ax(a)
    ay=ay(a)
    avx=avx(a)
    avy=avy(a)
    dx=dx(a)
    dy=dy(a)
    dvx=dvx(a)
    dvy=dvy(a)
    bezierdot(ax,ay,dx,dy,avx,avy,dvx,dvy,t)
    setrgb 1,255,t*255,0
    gosub drawball
   next a
  next t

  for a=1 to nd
   gosub setuppath
  next a
 until (1=2)
return

sub bezierdot(ax,ay,dx,dy,avx,avy,dvx,dvy,t)
 bx=ax+avx
 by=ay+avy
 cx=dx+dvx
 cy=dy+dvy
 aa=t
 bb=1-t
 x=ax*bb^3+3*bx*bb^2*aa+(3*cx)*bb*aa^2+dx*aa^3
 y=ay*bb^3+3*by*bb^2*aa+(3*cy)*bb*aa^2+dy*aa^3
end sub

label drawball
 ang=0
 repeat
  xo1=cosines(ang)*r
  yo1=sines(ang)*r
  xo2=cosines(ang+st)*r
  yo2=sines(ang+st)*r
  gtriangle x,y to x+xo1,y+yo1 to x+xo2,y+yo2
  gtriangle x,y to x-xo1,y+yo1 to x-xo2,y+yo2
  gtriangle x,y to x-xo1,y-yo1 to x-xo2,y-yo2
  gtriangle x,y to x+xo1,y-yo1 to x+xo2,y-yo2
  ang=ang+st
 until (ang>90)
return

label setuppath
 ax(a)=dx(a)
 ay(a)=dy(a)
 avx(a)=dvx(a)
 avy(a)=dvy(a)
 dx(a)=ran(640)
 dy(a)=ran(512)
 dvx(a)=sines(ran(360))*120
 dvy(a)=cosines(ran(360))*120
return

label initialise
 open window 640,512
 dim cosines(360),sines(360)

 f=pi/180
 for a=0 to 360
  cosines(a)=cos(a*f):sines(a)=sin(a*f)
 next a

 setrgb 2,0,0,0
 setrgb 3,0,0,0

 r=30
 st=20
 nd=4

 dim ax(nd),ay(nd),dx(nd),dy(nd)
 dim avx(nd),avy(nd),dvx(nd),dvy(nd)
 for a=1 to nd
  gosub setuppath
  gosub setuppath
 next a
return


