Site Tools


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?

Answer

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
    crvs(j) = Rhino.AddInterpCurve(pts)
  Next
 
  ' Loft the results
  Call Rhino.AddLoftSrf(crvs)
 
  ' 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
 
'------------------------------------------------------------------------------
Rhino.AddStartUpScript Rhino.LastLoadedScriptFile
Rhino.AddAlias "ParametricEllipsoid", "_-RunScript (ParametricEllipsoid)"


developer/scriptsamples/parametricellipsoid.txt ยท Last modified: 2015/09/14 (external edit)