# Surface Wave

Surface wave is a very simple rhinoscript tool which uses a curve to create a sine wave based surface. Developed as a means to expedite surface experimentation, its function as a tool is very limited, but its results as an origin are quite useful.

### Rhino Script

```Option Explicit
'Script written by <David Mans>
'Script version Sunday, May 25, 2008 11:21:36 PM
Call Main()
Sub Main()
Dim curves
curves = Rhino.GetObjects("Select Curve", 4)
If isNull(curves) Then Exit Sub

If IsEmpty(aF) Then
aF = 2
End If
If IsEmpty(aA) Then
aA = 20
End If
If IsEmpty(aB) Then
aB = 2
End If
If IsEmpty(aC) Then
aC = 3
End If
End If
If IsEmpty(aE) Then
aE = 90
End If

Dim b, arrItems, arrValues
arrItems = array("waves", "steps", "baseLength", "increaseLength", "baseRotation", "increaseRotation")
arrValues = array(aF, aA, aB, aC, aD, aE)
b = Rhino.PropertyListBox(arrItems, arrValues,, "Volume Parameters")

aA = CDbl(b(1)): aB = CDbl(b(2)): aC = CDbl(b(3)): aD = CDbl(b(4)): aE = CDbl(b(5)): aF = CStr(b(0))
Call Rhino.EnableRedraw(False)
Dim i
For i = 0 To ubound(curves) Step 1
Call reparameterize(curves(i))
Call quickStems(curves(i), aA - 1, aB, aC, aD, aE * .5, aF)
Next
Call Rhino.EnableRedraw(True)

End Sub
Function quickStems(curve, steps, bLen, length, bRot, rotation, waves)
quickStems = Null
Dim i
Dim crvDom, ori, pln, plnR, len, rot, vect, wav
Dim finCrv
ReDim crv(steps),pt(steps)
crvDom = Rhino.CurveDomain(curve)
wav = 1 / waves
For i = 0 To steps Step 1
len = length - length * Cos(i / (steps * wav) * pi)
rot = rotation - rotation * Cos(i / (steps * wav) * pi)
ori = Rhino.EvaluateCurve(curve, crvDom(1) / steps * i)
pln = Rhino.CurvePerpFrame(curve, crvDom(1) / steps * i)

plnR = Rhino.RotatePlane(pln, rot - brot, pln(3))
vect = Rhino.PointAdd(ori, Rhino.VectorScale(Rhino.VectorUnitize(plnR(2)), bLen + len))

pt(i) = vect
Next
End Function
Function reparameterize(strObjectID)
If Rhino.IsCurve(strObjectID) = True Then
Call rhino.SelectObject(strObjectID)
Call rhino.Command("reparameterize 0 1")
Call rhino.UnselectAllObjects()
End If
If Rhino.IsSurface(strObjectID) = True Then
Call rhino.SelectObject(strObjectID)
Call rhino.Command("reparameterize 0 1 0 1")
Call rhino.UnselectAllObjects()
End If
End Function
```