Isothermic Costa Surface

I’m attempting to planarize a Costa minimal surface using the isothermic goal. I haven’t had much success, and I’ve been wondering if there are issues with the outer boundary of my surface, and/or my K2 setup. For reference, the mesh was originally modeled in Mathematica and cleaned up manually in Rhino. Suggestions welcome!

(I do recall seeing a post on this several years ago on the old forum, but thought I’d understand more about this goal with a new discussion)

While I’m here - more generally, what’s a suggested way to model the base polygonal meshes of mathematically minimal surfaces and to control their boundary during relaxation?

Screenshot for reference:

Hi Nick,

Finding isothermic minimal surfaces like this without having the boundary defined first can be a bit tricky.
If I recall, for the discrete Costa I posted years back I used some bending or co-circular force for the boundary.

Another way to go about this would be to relax a circle packing quad mesh on* the sphere and get the Koebe polyhedron, then rearrange the edges to make the isothermic minimal surface, like in Stefan’s thesis.
*note though that the edges need to lie tangent to the sphere, not the points on the sphere.

It gets a bit complicated around the singularities, but there might be a way to model only 1/4 or 1/8 of the Costa surface to avoid this, then get the rest by symmetry.

Another approach I’ve sometimes thought about is that maybe there is a way to relax the quad mesh towards an isothermic minimal one without explicitly building the Koebe polyhedron or fixing the boundary.
With the tangent incircle quad energy, the grid lines already tend to follow the principal curvature directions, and principal curvatures being equal and opposite at each point is another way of characterising a minimal surface, so maybe a goal to just enforce this angle condition directly…

As for modelling the base quad mesh - I don’t have any really easy way, just practise. If you have or can plot the principal curvatures, you can make some big faces connecting up the singularities.

1 Like

Thanks, Daniel! Lots to think about here. I’ve tried bending the boundary but I’ll give it another try before posting my file. I’ll also try co-circular forces as a comparison.

I’m reading Stefan’s thesis; thanks for sharing that reference. I’m trying to understand what you mean exactly by “rearranging the edges”. I understand the concept, but am trying to think through the modeling process with K2 …


  • I think this is what I’ve been attempting to do (albeit, unknowingly). I’ll tinker a bit more and post my attempts for good measure.
  • helpful advice!

I had another look at this paper by Bobenko, Hoffmann and Springborn, and managed to implement the discrete Christoffel dual operation in Kangaroo, along with an edge tangent to sphere goal for making Koebe polyhedra.

This uses a few new components from the next release, but I’ll post the files here as soon as its ready


Super! Really looking forward to the next release.

I too, read the Bobenko, Hoffmann and Springborn paper as it was referenced in Architectural Geometry (Pottmann,, which was helpful in explaining the parallel diagonals.

Just a sketch experimenting with reversing the orientation of the quads as shown on p.701.

The above just flips domain of the horizontal edge lengths and sets that as the target (shortest becomes longest, etc), and includes a very low bending force along the horizontal polylines, with gradually increasing but proportional forces between the Line and Cyclic Quad goals. Not really accurate since it never converges, but sort-of neat nonetheless.
1 Like

Almost - but it’s not the lengths of the edges that need to swap, it’s the direction of the diagonals (the lengths all change). (26.5 KB)
(note that this operation won’t work if you have internal vertices with valence ≠ 4. Then you need to break it up into patches and re-assemble)


Very nice, thanks!

and here’s the def including a new goal for making mesh edges tangent to a sphere, as needed to generate Koebe polyhedra: (21.6 KB)


nice stuff here

“outer boundary” is relative :wink: the Costa Surface can be modeled from a single NURBS surface.
Technically this it is a surface with 3 holes, closed in u- and v-direction (a torus with three holes).
However, you have to turn it inside out so that the holes appear as outer boundaries:

Many years ago I made a vbscript animation morphing such a torus to a costa srf… I’ll search for it.


Nice. Like this right?


yes, but as NURBS surface. Much nicer :wink:
Edit: and mine is from 2006

Depends what you want to do with it I guess!
For fabrication, flat panels which can be offset with beams of constant depth that node out cleanly can be useful.
NURBS will be smoother, but also still only an approximation of the true minimal surface right?

This quote sums up what I find appealing about the discrete differential geometry approach:

“The basic philosophy of discrete differential geometry is that a discrete object like a polyhedron is not merely an approximation of a smooth one, but rather a differential geometric object in its own right. In contrast to traditional numerical analysis which focuses on eliminating approximation error in the limit of refinement (e.g., by taking smaller and smaller finite differences), DDG places an emphasis on the so-called “mimetic” viewpoint, where key properties of a system are preserved exactly, independent of how large or small the elements of a mesh might be”


Beautiful! Learning alot here.

Jess, I’d love to see your animated NURBS version. Are you suggesting in your screenshot that it’s possible to invert the flat surface into the Costa using control points?

Daniel, your samples are super helpful - much appreciated as always. Is it within the scope of them to invert the torus?

Yes. From the flat surface you can make a torus and this can be “morphed” into a Costa Surface.
Have a look at the attached file: CostaTorusSmoothing_jm.3dm (262.9 KB)

and the animation:



Super! Is it possible to find the named selection set in Rhino 6?

Select these points manually and run the _InvertPt command

Got it!
It’s interesting how the torus needs to be made from the flat surface for this to work. I just tried to model a simple torus and cut a few ellipses out of it to mimic yours, and it smooths out into a circle.

For the purposes of what I’m working on I do need a planar quad mesh, but I can’t help but be curious about that first step - going from a flat planar surface to the torus.

I could watch this all day!

1 Like

Hey Daniel, this was no critic of your work! We know that Grasshopper and Kangaroo and many other tools for Rhino have changed the world. I use and love all techniques dealing with geometry. When I solved that problem I had no idea if there is a way to model a Costa surface from a single NURBS. So I started with really low point count surfs and used the smooth command a lot. You might have a look at the 3dm file I posted above. And yes, this is probably just a very rough approximation of a minimal surface. Who cares - I love beautiful shapes, dirty math and fabricating crazy designs. :wink:

I should say, I’ve been able to arrive at a planar quad mesh using older-school methods (mostly because I’m still trying to absorb the Koebe and Christoffel methods above), but the result is wonky at best.