Create an Icosahedron
Windows only

Demonstrates one way of creating a Icosahedron in RhinoScript.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Icosahedron.rvb -- September 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

' Creates a icosahedron
'   Vertices: 12
'   Edges: 30
'   Faces: 20
'   Edges per face: 3
'   Edges per vertex: 5
'   Sin of angle at edge: 2 / 3
'   Surface area: 5 * sqrt(3) * edgelength^2
'   Volume: 5 * (3 + sqrt(5)) / 12 * edgelength^3
'   Circumscribed radius: sqrt(10 + 2 * sqrt(5)) / 4 * edgelength
'   Inscribed radius: sqrt(42 + 18 * sqrt(5)) / 12 * edgelength
'   Coordinates: a and b, where:
'     a = 1 / 2 and b = 1 / (2 * phi)
'     phi is the golden ratio = (1 + sqrt(5)) / 2
Sub Icosahedron()

  ' Declare local variables
  Dim radius, center
  Dim sqr5, phi, ratio, a, b
  Dim v(11), s(19)

  ' Prompt for center point
  center = Rhino.GetPoint("Center of icosahedral")
  If IsNull(center) Then Exit Sub

  ' Prompt for radius  
  radius = Rhino.GetDistance(center, 1.0, "Radius")
  If IsNull(radius) Then Exit Sub

  ' This will make the script run faster  
  Call Rhino.EnableRedraw(False)

  ' Phi - the square root of 5 plus 1 divided by 2
  sqr5 = Sqr(5.0)
  phi = (1.0 + Sqr5) * 0.5
  ' Golden ratio - the ratio of edgelength to radius
  ratio = Sqr(10.0 + (2.0 * sqr5)) / (4.0 * phi)
  a = (radius / ratio) * 0.5
  b = (radius / ratio) / (2.0 * phi)

  ' Define the icosahedron's 12 vertices
  v(0)  = Rhino.PointAdd(center, Array( 0,  b, -a))
  v(1)  = Rhino.PointAdd(center, Array( b,  a,  0))
  v(2)  = Rhino.PointAdd(center, Array(-b,  a,  0))
  v(3)  = Rhino.PointAdd(center, Array( 0,  b,  a))
  v(4)  = Rhino.PointAdd(center, Array( 0, -b,  a))
  v(5)  = Rhino.PointAdd(center, Array(-a,  0,  b))
  v(6)  = Rhino.PointAdd(center, Array( 0, -b, -a))
  v(7)  = Rhino.PointAdd(center, Array( a,  0, -b))
  v(8)  = Rhino.PointAdd(center, Array( a,  0,  b))
  v(9)  = Rhino.PointAdd(center, Array(-a,  0, -b))
  v(10) = Rhino.PointAdd(center, Array( b, -a,  0))
  v(11) = Rhino.PointAdd(center, Array(-b, -a,  0))

  ' Create the icosahedron's 20 triangular faces
  s(0)  = Rhino.AddSrfPt(Array(v(0), v(1), v(2)))
  s(1)  = Rhino.AddSrfPt(Array(v(3), v(2), v(1)))
  s(2)  = Rhino.AddSrfPt(Array(v(3), v(4), v(5)))
  s(3)  = Rhino.AddSrfPt(Array(v(3), v(8), v(4)))
  s(4)  = Rhino.AddSrfPt(Array(v(0), v(6), v(7)))
  s(5)  = Rhino.AddSrfPt(Array(v(0), v(9), v(6)))
  s(6)  = Rhino.AddSrfPt(Array(v(4), v(10), v(11)))
  s(7)  = Rhino.AddSrfPt(Array(v(6), v(11), v(10)))
  s(8)  = Rhino.AddSrfPt(Array(v(2), v(5), v(9)))
  s(9)  = Rhino.AddSrfPt(Array(v(11), v(9), v(5)))
  s(10) = Rhino.AddSrfPt(Array(v(1), v(7), v(8)))
  s(11) = Rhino.AddSrfPt(Array(v(10), v(8), v(7)))
  s(12) = Rhino.AddSrfPt(Array(v(3), v(5), v(2)))
  s(13) = Rhino.AddSrfPt(Array(v(3), v(1), v(8)))
  s(14) = Rhino.AddSrfPt(Array(v(0), v(2), v(9)))
  s(15) = Rhino.AddSrfPt(Array(v(0), v(7), v(1)))
  s(16) = Rhino.AddSrfPt(Array(v(6), v(9), v(11)))
  s(17) = Rhino.AddSrfPt(Array(v(6), v(10), v(7)))
  s(18) = Rhino.AddSrfPt(Array(v(4), v(11), v(5)))
  s(19) = Rhino.AddSrfPt(Array(v(4), v(8), v(10)))

  ' Join all of the faces
  Rhino.UnselectAllObjects()
  Call Rhino.SelectObjects(s)
  Call Rhino.Command("_Join", False)
  Rhino.UnselectAllObjects()

  ' Don't forget to do this
  Call Rhino.EnableRedraw(True)

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Rhino.AddStartupScript Rhino.LastLoadedScriptFile
Rhino.AddAlias "Icosahedron", "_NoEcho _-RunScript (Icosahedron)"