# Create an Ellipsoid Parametrically

Developer: RhinoScript
Summary: Demonstrates one way of creating a Ellipsoid.

## Question

I understand that Rhino's Ellipsoid commands creates ellipsoids by first creating a sphere and then scaling it non-uniformly. Is there way to create an ellipsoid parametrically?

See the example script below.

```'------------------------------------------------------------------------------
' ParametricEllipsoid.rvb -- February 2012
' If this code works, it was written by Dale Fugier.
' If not, I don't know who wrote it.
' Works with Rhino 4.0.
'
' Notes, the surface of the ellipsoid may be parameterized in several ways.
' One possible choice which singles out the 'z'-axis is:
'   x = a * Cos(u) * Cos(v)
'   y = b * Cos(u) * Sin(v)
'   z = c * Sin(u)
' where:
'  -pi/2 <= u <= pi/2, And -pi <= v <= pi
'------------------------------------------------------------------------------

Option Explicit

'------------------------------------------------------------------------------
' ParametricEllipsoid
'------------------------------------------------------------------------------
Sub ParametricEllipsoid()

' Variables
Dim a, b, c
Dim dom_u(1), dom_v(1), num_u(1), num_v(1)
Dim i, j, st(1), uv(1), pts(), crvs()

' Prompt for coefficents
a = Rhino.GetInteger("A Coefficient", 1, 1)
If IsNull(a) Then Exit Sub

b = Rhino.GetInteger("B Coefficient", 1, 1)
If IsNull(b) Then Exit Sub

c = Rhino.GetInteger("C Coefficient", 1, 1)
If IsNull(c) Then Exit Sub

' Define domain of ellipsoid
dom_u(0) = -(Rhino.PI / 2.0)
dom_u(1) = Rhino.PI / 2.0
dom_v(0) = -(Rhino.PI)
dom_v(1) = Rhino.PI

' Define a domain of point samples
' To sample more points, increase num_u(1) and num_v(1)
num_u(0) = 0
num_u(1) = 20
num_v(0) = 0
num_v(1) = 20

' Storate for calculated point and temporary curves
ReDim pts(num_u(1))
ReDim crvs(num_v(1))

' Calculate ellipsoid points and interpolate
For j = num_v(0) To num_v(1)
For i = num_u(0) To num_u(1)
st(0) = NormalizedAt(num_u(0), num_u(1), i)
st(1) = NormalizedAt(num_v(0), num_v(1), j)
uv(0) = ParameterAt(dom_u(0), dom_u(1), st(0))
uv(1) = ParameterAt(dom_v(0), dom_v(1), st(1))
pts(i) = PointAt(a, b, c, uv(0), uv(1))
Next
Next

' Loft the results

' Delete the temporary curves
'Call Rhino.DeleteObjects(crvs)

End Sub

'------------------------------------------------------------------------------
' PointAt
' Evaluates an ellipsoid at a parameter
'------------------------------------------------------------------------------
Function PointAt(a, b, c, u, v)
Dim pt(2)
pt(0) = a * Cos(u) * Cos(v)
pt(1) = b * Cos(u) * Sin(v)
pt(2) = c * Sin(u)
PointAt = pt
End Function

'------------------------------------------------------------------------------
' ParameterAt
' Converts a normalized parameter to a domain value
'------------------------------------------------------------------------------
Function ParameterAt(t0, t1, x)
ParameterAt = (1.0 - x) * t0 + x * t1
End Function

'------------------------------------------------------------------------------
' NormalizedAt
' Converts a domain value to a normalized parameter
'------------------------------------------------------------------------------
Function NormalizedAt(t0, t1, t)
Dim x : x = t0
If (t0 <> t1) Then
If (t = t1) Then
x = 1.0
Else
x = (t - t0)/(t1 - t0)
End If
End If
NormalizedAt = x
End Function

'------------------------------------------------------------------------------