Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
112 lines (94 sloc) 3.29 KB
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 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.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 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