Fibonacci squares and spiral

 

Давно хотел разобраться с этим узором. Поиски вывели на разные версии кода, в том числе на нерабочие. Нашел на Github  вариант HTML5+JS и перевел на пуревасик. Немного попыхтел над опцией поворот по/против часовой стрелки.

Dim f(14)
f(0)=1
f(1)=1
For n=2 To 14
  f(n)=f(n-1)+f(n-2)
Next n
ccw=0;clockwise
sca=20
If OpenWindow(0, 0, 0, 800, 600, "Fibonacci spiral and squares", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 800, 600)
    If StartDrawing(CanvasOutput(0))
      Box(0,0,GadgetWidth(0),GadgetHeight(0),0)
      For n=1 To 13
        ;fibs=f(n)
        If ccw
          s=1
        Else
          s=-1
        EndIf
        cx.f=GadgetWidth(0)/2
        cy.f=GadgetHeight(0)/2
        an.f=0
        For i=0 To n
          r=f(i)*sca
          a0.f=an
          a1.f=an+s*#PI/2
          ux.f=Cos(a0)
          uy.f=Sin(a0)
          vx.f=Cos(a1)
          vy.f=Sin(a1)
;rect
          LineXY(cx,cy,cx + r * ux, cy + r * uy,255)
          LineXY(cx + r * ux, cy + r * uy,cx + r * (ux + vx), cy + r * (uy + vy),255)
          LineXY(cx + r * (ux + vx), cy + r * (uy + vy),cx + r * vx, cy + r * vy,255)
          LineXY(cx,cy,cx + r * vx, cy + r * vy,255)
          
;arc
          If ccw
            ab.f=a0
            ae.f=a1
          Else
            ab.f=a1
            ae.f=a0
          EndIf
          
          tf.f=ab
          While tf<=ae
            px=cx+r*Cos(tf)
            py=cy+r*Sin(tf)
            Box(px,py,1,1,$FF00)
            tf=tf+0.001
          Wend
          
          tx=(cx+cx + r * (ux + vx))/2
          ty=(cy+cy + r * (uy + vy))/2
          DrawText(tx,ty,Str(f(i)),$7f7f7f,0);$FFFFFF)
          nextr.f=f(i+1)*sca
          cx=cx+(r-nextr)*Cos(a1)
          cy=cy+(r-nextr)*Sin(a1)
          an=a1
        Next i
      Next n
            StopDrawing()
          EndIf
          Repeat
            Event=WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf



Комментарии