Fibonacci Spirals
Windows only

Demonstrates how to create a Fibonacci Spiral with RhinoScript.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' FibonacciSpiral.rvb -- June 2009
' If this code works, it was written by Dale Fugier.
' If not, I don't know who wrote it.
' Works with Rhino 4.0.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Option Explicit

Call FibonacciSpiral()

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Computes Fibonacci Spiral
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub FibonacciSpiral()

  ' Local variables
  Dim steps, scale, plane, xform
  Dim origin, pt0, pt1, pt2, pt3
  Dim n, cmd

  ' Get number of Fibonacci numbers to calculate
  steps = Rhino.GetInteger("Number of steps", 10, 1, 50)
  If IsNull(steps) Then Exit Sub

  ' Original origin point
  origin = Array(0,0,0)

  ' Process every step...
  For n = 1 To steps

    ' Compute Fibonacci number using Binet's formula      
    scale = Round(((Sqr(5) + 1) / 2) ^ n / Sqr(5))

    ' Determine x and y axes based on where we are
    plane = Rhino.WorldXYPlane()
    xform = Rhino.XformRotation(90.0 * (n Mod 4), plane(3), plane(0))
    plane = Rhino.PlaneTransform(plane, xform)

    ' Calculate arc points
    pt0 = origin
    ' Offset pt0 in the xaxis direction by scale
    pt1 = Rhino.PointAdd(pt0, Rhino.VectorScale(plane(1), scale))
    ' Offset pt1 in the yaxis direction by scale
    pt2 = Rhino.PointAdd(pt1, Rhino.VectorScale(plane(2), scale))
    ' Offset origin in the yaxis direction by scale
    pt3 = Rhino.PointAdd(pt0, Rhino.VectorScale(plane(2), scale))

    ' Add a closed polyline
    Call Rhino.AddPolyline(Array(pt0, pt1, pt2, pt3, pt0))

    ' Build a command script that will create an arc from
    ' start, end, and direction
    cmd = "_-Arc _StartPoint " & _
          Rhino.Pt2Str(pt0)    & _
          " "                  & _
          Rhino.Pt2Str(pt2)    & _
          " _Direction "       & _
          Rhino.Pt2Str(pt1)

    ' Run the command script to create the arc          
    Call Rhino.Command(cmd, 0)

    ' Update the origin point
    origin = pt2

  Next

End Sub