Function Repository Resource:

Cyclide

Source Notebook

Compute expressions for Dupin cyclide surfaces

Contributed by: Wolfram Staff (original content by Alfred Gray)

ResourceFunction["Cyclide"][a,c,k,{u,v}]

computes the elliptic–hyperbolic cyclide with parameters a,c and k, parameterized in terms of the variables u and v.

ResourceFunction["Cyclide"][a,k,{u,v}]

computes the parabolic cyclide with parameters a and k, parameterized in terms of the variables u and v.

ResourceFunction["Cyclide"][a,,k]

represents an operator form that can be applied to variables u and v.

Details and Options

A Dupin cyclide or cyclide of Dupin is any geometric inversion of a standard torus, cylinder or double cone. Charles Dupin discussed his discovery of cyclides in his 1803 dissertation.
Dupin cyclides are surfaces that are envelopes of spheres. The spheres are then tangent to the cyclides along circles, which are the curvature lines.
The parametrization of elliptic–hyperbolic cyclides is , where a is the semimajor axis, c is the linear eccentricity of the ellipse and k is the radius of the generating sphere at the co-vertices of the ellipse (0,±b), where .
The parametrization of parabolic cyclides is , where a determines the shape of the associated parabolas and k determines the ratio of the diameters of the two holes.
Elliptic–hyperbolic cyclides are a parametrization of Dupin cyclides of radius k whose focal sets are the ellipse and the hyperbola .
Parabolic cyclides are a parametrization of Dupin cyclides of radius k whose focal sets are the parabolas {u,0,-u2/(8 a)+a+k } and {0,v,v2/(8 a)-a-k}.
Dupin cyclides have also been investigated by A. Cayley and J. C. Maxwell.
Dupin cyclides have applications in computer-aided design (CAD).

Examples

Basic Examples (6) 

Get the equation for a ring elliptic‐hyperbolic cyclide:

In[1]:=
ResourceFunction["Cyclide"][8, 3, 5, {u, v}]
Out[1]=

Plot it:

In[2]:=
ParametricPlot3D[
 Evaluate[ResourceFunction["Cyclide"][8, 3, 5, {u, v}]], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}]
Out[2]=

A horn cyclide:

In[3]:=
ParametricPlot3D[
 Evaluate[ResourceFunction["Cyclide"][8, 3, 3, {u, v}]], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}]
Out[3]=

Another horn cyclide:

In[4]:=
ParametricPlot3D[
 Evaluate[ResourceFunction["Cyclide"][8, 3, 1, {u, v}]], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}]
Out[4]=

A spindle cyclide:

In[5]:=
ParametricPlot3D[
 Evaluate[ResourceFunction["Cyclide"][3, 1, 5, {u, v}]], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}, PlotStyle -> Opacity[.5]]
Out[5]=

A ring cyclide with no hole:

In[6]:=
ParametricPlot3D[
 Evaluate[ResourceFunction["Cyclide"][3, 1, 3, {u, v}]], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}, PlotStyle -> Opacity[.5]]
Out[6]=

A ring parabolic cyclide:

In[7]:=
ResourceFunction["Cyclide"][2, 1, {u, v}]
Out[7]=
In[8]:=
ParametricPlot3D[
 ResourceFunction["Cyclide"][2, 1, {u, v}], {u, -20, 20}, {v, -20, 20}, PlotPoints -> 80, BoxRatios -> {1, 1, .3}]
Out[9]=

The implicit representation of the cyclide:

In[10]:=
Eliminate[
 Thread[{x, y, z} == ResourceFunction["Cyclide"][2, 1, {u, v}]], {u, v}]
Out[10]=

Plot the implicit equation and rotate to see the holes:

In[11]:=
ContourPlot3D[Evaluate[%], {x, -15, 15}, {y, -15, 15}, {z, -15, 15}]
Out[11]=

A horn parabolic cyclide:

In[12]:=
ParametricPlot3D[
 ResourceFunction["Cyclide"][.36, 1., {u, v}], {u, -5, 5}, {v, -5, 5},
  PlotPoints -> 80, BoxRatios -> {1, 1, .3}]
Out[13]=

Another horn parabolic cyclide:

In[14]:=
ParametricPlot3D[
 ResourceFunction["Cyclide"][.3, 1.5, {u, v}], {u, -5, 5}, {v, -5, 5},
  PlotPoints -> 80, BoxRatios -> {1, 1, .3}]
Out[15]=

Properties and Relations (4) 

Compute the focal set for elliptic–hyperbolic cyclides:

In[16]:=
ResourceFunction[
ResourceObject[<|{"Name" -> "FocalSet", "ShortName" -> "FocalSet", "UUID" -> "7e0ba845-8cac-4a29-a957-4f0d08603956", "ResourceType" -> "Function", "Version" -> "1.0.0", "Description" -> "Compute the focal set of a surface", "RepositoryLocation" -> URL[
          "https://www.wolframcloud.com/objects/resourcesystem/api/1.0"], "SymbolName" -> "FunctionRepository`$0518000ffe914ce6b8f29c2d471073e2`FocalSet", "FunctionLocation" -> CloudObject[
          "https://www.wolframcloud.com/obj/9862608e-ac2a-461f-98e3-a56d989cc06c"]}|>, {ResourceSystemBase -> Automatic}]][#, ResourceFunction["Cyclide"][a, c, k, {u, v}], {u, v}] & /@ {1, 2} // PowerExpand // Simplify
Out[16]=

Compute the focal set for the parabolic case:

In[17]:=
ResourceFunction[
ResourceObject[<|{"Name" -> "FocalSet", "ShortName" -> "FocalSet", "UUID" -> "7e0ba845-8cac-4a29-a957-4f0d08603956", "ResourceType" -> "Function", "Version" -> "1.0.0", "Description" -> "Compute the focal set of a surface", "RepositoryLocation" -> URL[
          "https://www.wolframcloud.com/objects/resourcesystem/api/1.0"], "SymbolName" -> "FunctionRepository`$0518000ffe914ce6b8f29c2d471073e2`FocalSet", "FunctionLocation" -> CloudObject[
          "https://www.wolframcloud.com/obj/9862608e-ac2a-461f-98e3-a56d989cc06c"]}|>, {ResourceSystemBase -> Automatic}]][#, ResourceFunction["Cyclide"][a, k, {u, v}], {u, v}] & /@ {1, 2} //
   PowerExpand // Simplify
Out[17]=

Code for generating a cyclide together with its focal curves:

In[18]:=
cycgen[a_, c_, k_, rau_, rav_, opts___] :=
 Module[{x, z, \[Alpha], \[Beta]}, x = ResourceFunction["Cyclide"][a, c, k, {u, v}]; z[1] = ParametricPlot3D[x, rau, rav, opts, Boxed -> False, Axes -> False]; \[Alpha][t_] := {a Cos[t], Sqrt[a^2 - c^2] Sin[t],
     0}; \[Beta][t_] := {c Sec[t], 0, Sqrt[a^2 - c^2] Tan[t]}; z[2] = ParametricPlot3D[\[Alpha][t], {t, -\[Pi], \[Pi]}]; z[3] = ParametricPlot3D[\[Beta][t], {t, -.499 \[Pi], .499 \[Pi]}]; Show[Array[z, 3], PlotRange -> {{-a - c - k, a + c + k}, {-a - c - k, a + c + k}, {-a - c - k, a + c + k}}]]

The ring cyclide with its focal curves:

In[19]:=
x = ResourceFunction["Cyclide"][12, 3, 4.5, {u, v}];
z[1] = ParametricPlot3D[Evaluate[x], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]},
    Boxed -> False, Axes -> False, PlotRange -> 19.5];
z[2] = cycgen[12, 3, 4.5, {u, 0, 2 \[Pi]}, {v, -\[Pi], 0}];
GraphicsGrid[{Array[z, 2]}]
Out[19]=

The horn cyclide with its focal curves:

In[20]:=
x = ResourceFunction["Cyclide"][8, 4, 0, {u, v}];
z[1] = ParametricPlot3D[Evaluate[x], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]},
    Boxed -> False, Axes -> False, PlotRange -> 12];
z[2] = cycgen[8, 4, 0, {u, 0, 2 \[Pi]}, {v, -\[Pi], 0}];
GraphicsGrid[{Array[z, 2]}]
Out[20]=

The spindle cyclide with its focal curves:

In[21]:=
Module[{x, z},
    x = ResourceFunction["Cyclide"][12, 4, 4, {u, v}];
    z[1] = ParametricPlot3D[x // Evaluate,
         {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}, Boxed -> False, Axes -> False, PlotRange -> 20];
    z[2] = cycgen[12, 4, 4, {u, 0, 2 \[Pi]}, {v, -\[Pi], 0}]; GraphicsGrid[{Array[z, 2]}]
 ]
Out[21]=

A parallel surface of a ring cyclide is another cyclide:

In[22]:=
psc = ResourceFunction[
ResourceObject[<|{"Name" -> "ParallelSurface", "ShortName" -> "ParallelSurface", "UUID" -> "1669dbe8-ee23-45c7-bfa0-bb98c2d676d3", "ResourceType" -> "Function", "Version" -> "1.0.0", "Description" -> "Compute the parallel surface of a surface", "RepositoryLocation" -> URL[
       "https://www.wolframcloud.com/objects/resourcesystem/api/1.0"],
       "SymbolName" -> "FunctionRepository`$b9e3e6f0736040288f0f0e29abb01d20`ParallelSurface", "FunctionLocation" -> CloudObject[
       "https://www.wolframcloud.com/obj/d4586eb0-c51a-4800-b6ec-c065d3f32321"]}|>, {ResourceSystemBase -> Automatic}]][
  ResourceFunction["Cyclide"][8, 3, 5, {u, v}], 4, {u, v}]
Out[22]=
In[23]:=
ParametricPlot3D[
 Evaluate[{ResourceFunction["Cyclide"][8, 3, 5][u, v], psc}], {u, -\[Pi], \[Pi]}, {v, -\[Pi], \[Pi]}, PlotPoints -> {40, 15}, PlotStyle -> Opacity[.5]]
Out[23]=

The same cyclide with a parallel surface of negative distance:

In[24]:=
pscn = ResourceFunction[
ResourceObject[<|{"Name" -> "ParallelSurface", "ShortName" -> "ParallelSurface", "UUID" -> "1669dbe8-ee23-45c7-bfa0-bb98c2d676d3", "ResourceType" -> "Function", "Version" -> "1.0.0", "Description" -> "Compute the parallel surface of a surface", "RepositoryLocation" -> URL[
       "https://www.wolframcloud.com/objects/resourcesystem/api/1.0"],
       "SymbolName" -> "FunctionRepository`$b9e3e6f0736040288f0f0e29abb01d20`ParallelSurface", "FunctionLocation" -> CloudObject[
       "https://www.wolframcloud.com/obj/d4586eb0-c51a-4800-b6ec-c065d3f32321"]}|>, {ResourceSystemBase -> Automatic}]][
  ResourceFunction["Cyclide"][8, 3, 5][u, v], -6, {u, v}]
Out[24]=
In[25]:=
ParametricPlot3D[
 Evaluate[{ResourceFunction["Cyclide"][8, 3, 5, {u, v}], pscn}], {u, -\[Pi], \[Pi]}, {v, -\[Pi], \[Pi]}, PlotPoints -> {40, 15}, PlotStyle -> Opacity[.5]]
Out[25]=

Modifying parameter k by n units is equivalent to moving a parallel surface a distance of n units:

In[26]:=
ParametricPlot3D[
 Evaluate[
  Table[ResourceFunction["Cyclide"][8, 3, n, {u, v}], {n, -6, 6, 3}]],
 {u, 0, \[Pi]}, {v, -\[Pi], 0}, Mesh -> False, PlotPoints -> {40, 15},
  PlotStyle -> Opacity[.5]]
Out[26]=

Solve the geodesic equations of a ring cyclide:

In[27]:=
sg = Flatten[
   Table[NDSolve[
     ResourceFunction["Geodesic"][
      ResourceFunction["Cyclide"][8, 3, 5, {u, v}], {u, v}, t, {\[Pi], \[Pi]}, \[Theta]], {u, v}, {t, 0, 4 \[Pi]}], {\[Theta], 2 \[Pi]/30, 2 \[Pi], 2 \[Pi]/30}], 1];

Plot the solutions:

In[28]:=
Show[ParametricPlot3D[
  Evaluate[ResourceFunction["Cyclide"][8, 3, 5, {u, v}]], {u, 0, 2 \[Pi]}, {v, 0, 2 \[Pi]}, PlotStyle -> Opacity[.5], Mesh -> False,
   Boxed -> False, Axes -> False], ParametricPlot3D[
  Evaluate[
   ResourceFunction["Cyclide"][8, 3, 5][u[t], v[t]] /. sg], {t, 0, 2 \[Pi]}]]
Out[28]=

Publisher

Enrique Zeleny

Version History

  • 1.0.0 – 14 July 2020

Source Metadata

Related Resources

License Information