Давно хотел разобраться с этим узором. Поиски вывели на разные версии кода, в том числе на нерабочие. Нашел на 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
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

Комментарии
Отправить комментарий