A Polyspiral is a spiral made of multiple line segments, whereby each segment is larger (or smaller) than the previous one by a given amount. Each segment also changes direction at a given angle.



Task
Animate a series of polyspirals, by drawing a complete spiral then incrementing the angle, and (after clearing the background) drawing the next, and so on. Every spiral will be a frame of the animation. The animation may stop as it goes full circle or continue indefinitely. The given input values may be varied.

If animation is not practical in your programming environment, you may show a single frame instead.



Pseudo code
    set incr to 0.0

    // animation loop
    WHILE true 

        incr = (incr + 0.05) MOD 360
        x = width / 2
        y = height / 2
        length = 5
        angle = incr

        // spiral loop
        FOR 1 TO 150
            drawline
            change direction by angle
            length = length + 3
            angle = (angle + incr) MOD 360
        ENDFOR
    



require 'gl2 trig media/imagekit'
coinsert 'jgl2'
 
DT       =: %30       NB. seconds
ANGLE    =: 0.025p1   NB. radians
DIRECTION=: 0         NB. radians
 
POLY=: noun define
  pc poly;pn "Poly Spiral";
  minwh 320 320; cc isi isigraph;
)
 
poly_run=: verb define 
  wd POLY,'pshow'
  wd 'timer ',":DT * 1000
)
 
poly_close=: verb define
  wd 'timer 0; pclose'
)
 
sys_timer_z_=: verb define
  recalcAngle_base_ ''
  wd 'psel poly; set isi invalid'
)
 
poly_isi_paint=: verb define
  drawPolyspiral DIRECTION
)
 
recalcAngle=: verb define
  DIRECTION=: 2p1 | DIRECTION + ANGLE
)
 
drawPolyspiral=: verb define
  glclear''
  x1y1 =. (glqwh'')%2
  a=. -DIRECTION
  len=. 5
  for_i. i.150 do.
    glpen glrgb Hue a % 2p1
    x2y2=. x1y1 + len*(cos,sin) a
    gllines <.x1y1,x2y2
    x1y1=. x2y2
    len=. len+3
    a=. 2p1 | a - DIRECTION
  end.
)
 
poly_run''