Schoen's Complementary D Surface and asymptotic Lines

Hi everyone,
I am trying to obtain the asymptotic lines of the above-mentioned minimal surface, as seen here:

Here is how I started:

  1. create baseSrfs
  2. Meshed and relax them
  3. Not sure how to get the asymptotic lines.
    Could anybody give me a hint?
    Can this work? And if yes, how?

Thanks everybody and have a nice weekend! (98.6 KB)

Assigned to Grasshopper category.

Thanks @John_Brock ,
thought I had put it there.

I see that you are a man devoted to FindTheTruthOutThere

So … get a Surface out of these pts and apply at NASA (Alan like). (117.5 KB)

Cross fingers: If Lewis wins in Mexico today (and the next 2) F1 races - meaning a 8th crown I’ll mail you 10 ultra freaky Surface things (in The Nane of Science AND Sir Lewis).

Moral: Forza Lewis.


I haven’t looked at what @PeterFotiadis has proposed as a solution, but here is my attempt.

I’ve replaced your points-to-surfaces-to-meshes script portion with a more efficient and straightforward way that gets you a clean mesh without having to do a manual clean-up in Rhino.
I’ve also gotten rid of the Kangaroo simulation to relax the mesh, and am instead using Catmull-Clark-Subdivision from Weaverbird to smooth it. The result are very similar!

I’ve also included an experimental, pythonic mesh welder component of mine, which seems to work pretty great, even better than the Weaverbird or vanilla Grasshopper ones it seems, which mostly fail to weld radially distributed, adjacent meshes.

The asymptotic curves are simulated with a Kangaroo simulation, similar to what you would do to get geodesic curves between points on a mesh. (30.1 KB)

Why do you want the asymptotic curves?
I’m guessing maybe related to asymptotic gridshells.
If so have a look at this thread.

Hi @diff-arch,
thanks for your improvements! The weld component works great! Rhino seems to have problems with the radial vertices.
I started with a surface and never changed it to a mesh, which is more straight forward as you mentioned.
Thanks again for showing this way!

Thanks for your answer Daniel!

You are absolutely right. Since I saw them I was fascinated. But I still need to understand more. Especially the workflow. My final aim was to lasercut the stripes.
As mentioned in the thread you linked, they(Eike and team) use Bowerbird for the generation of the asymptotic curves, which works over surfaces.
Another post I found seems also to work only over surfaces:

link: Sam Whitehead –

For my case tried to get the asymptotic curves for the surfaces and they seem to align with the isocurve direction:

That was why I thought I could just subdivide the mesh.
When I use the method you posted in your linked thread(the vertex star def.) the mesh crumples to something unusable:
Also I am not sure what ideally would happen to these kinks:

So I am still not sure if I am on the right track.

Thanks @PeterFotiadis ,

I searched the web for the formula, but without success. You seem to generate a Schwartz gyroid, if I am not mistaken?
Also do you really mean surface? or a mesh?

The planar vertex star approach should work, but I notice in that screenshot you don’t have the boundary restrained at all - that’s why it is crumpling. You’d need to keep the boundary curves on their respective planes.

I would suggest though instead of using the planar vertex star definition, to maybe use the other approach shown there with the Koebe polyhedron, which I think should be possible for this periodic surface.

This way you get the discrete minimal surface (which you can’t get from isosurfacing, relaxing springs, or a subdivision mesh), and the discrete asymptotic grid (not the same thing as geodesics) at the same time, so you don’t need to trace curves across a surface.

The mesh needs to be the diagonal of what you have at the moment though, so the mesh edges will follow the principal curvatures, and the diagonals will be the asymptotics.

1 Like

I hate meshes, I confess:

BTW!: There’s various TPMS (with some freaky names). Shown above a Schoen Gyroid (no copy in Z for clarity) - I have a C# for the Complementary D but I can’t remember where it is.

BTW2: Mexico was a disaster: Lewis finished a distant/miserable second. 8th crown fades little by little.


Hi Daniel,
thanks for the explanation!
I took your advices serious and tried my best with the transformation of the Koebe Polyhedra.
As I understand, the overall logic is the following: The 3 surfaces my geometry consists of can be formed with patches which can be obtained from the Polyhedra:

Adjusting them manually, the result looks topological correct:

From the other thread, I understand this should be done by Christoffel Transformation, which took me a while to understand. As I understand, the transformation is just from one state into another, exchanging the diagonals. At this part, I don’t get how it can convert to the geometry I would like to have.
With your keywords I found a nice diploma tesis(reposiTUm: Ein Beitrag zur Erstellung einer Gitterschale unter der Verwendung asymptotischer Kurven auf Minimalflächen) on this topic, but still I am missing some pieces to understand the workflow.
Maybe you could give me some hints(a few keywords) so I could keep on researching.

Thanks a lot and have a nice weekend start!

I’m not at my normal computer right now, but a few pointers to useful references.

It shows the dual construction quite well.

and my main reference on this was Stefan’s diploma thesis:

Discrete Minimal Surfaces, Koebe Polyhedra, and Alexandrov’s Theorem. Variational Principles, Algorithms, and Implementation. (Diploma Thesis)

Note that this approach works on the principal curvature aligned mesh, then the asymptotic grid would be the diagonals. It looks like what you have is the diagonal grid to start with.

I think I posted on that other thread the definition which takes a starting polyhedron and makes it Koebe, then it has a second stage where you can use the slider to turn one patch of it into the Christoffel dual, which is then discrete minimal.
You can then mirror this patch around to get the rest of the surface by symmetry.

Knowing which polyhedron to use at the start isn’t always immediately obvious though. Those for the standard P G and D surfaces are easy enough to find, but others might take a bit more searching.

If you have a good approximation of the minimal surface to start with, you can maybe run the dual operation the other way (again on a single patch), and see the symmetry from that to figure out what the right polyhedron is.
There’s probably also some easier way I’m missing to find it directly from knowing the symmetry of the minimal surface you’re after.

1 Like

Poor Lewis - he just doesn’t have the pace advantage he used to. Maybe things will be better next year.

Thanks again for the hints and the sources!

I think I might have been understanding the workflow now.
Trying the different polyhedra is quite fun!

This one could be the correct one:

The last piece does not fit, maybe cause of the here mentioned flip?

Will keep playing and posting the results. Now it seems doable thanks to your patience!

1 Like

It was a fun Sunday, I tried every Polyhedron of RhinoPolyhedra that consisted of pure quads(123 there are):

several came out hopeful and similar to the last one of the last post.
But all fail at the last piece. Whether the size nor the curvature fits:

Do I miss something? Thanks!

1 Like

Well, at least it’s a nice collection of Koebe polyhedra and discrete minimal surfaces you’ve ended up with I guess!

It’s an interesting challenge.
Yes - the symmetry for this one isn’t quite what it first appears.
The ‘disphenoid’ page on Brakke’s site is also useful in explaining this:

You can also go back to the original source. This page by Alan Schoen isn’t the easiest to navigate - it’s all on just one very long page, but wonderfully informative.
He refers to the surface in question there as C₁₉(D)

Another way to approach this is to start by modelling the tetrahedral unit cell, then use Mirror and ArrayPolar to extend that.

Here’s a go at this, using the diagonal grid.
complementaryD_mesh.3dm (152.9 KB)
which when relaxed starts looking like something along the right lines:

complementaryD_smoothed.3dm (522.0 KB)

However, the grid here is still along the diagonals, which is not what we want for the discrete minimal surface.
Taking the diagonalized mesh of this gives the correct grid, but then the problem is that we have triangles along the boundary, which complicate things for further relaxation.

We could chop it along the grid, but would then need to apply appropriate boundary constraints for whatever new repeating cell we had.

I also had a go with the Koebe approach, but didn’t find the correct polyhedron yet. I was trying to use the above to deduce which one.
I think it could be one with valence 2 vertices, which I don’t think RhinoPolyhedra has many of.

Like this one for instance:

1 Like

Thanks again for the elaborated answer and the nice pics!

hehe, yes. And it is fun!

I saw his site before and really liked it. Yesterday late night I thought, it would be nice if he would have written down, from which Polyhedra they can be made :slight_smile:
So I wrote him and asked, not thinking of getting an answer- 2 minutes later he answered, that he does not know - I was flashed:)

The physical models are divine! the material, the colours! I love them!
This weekend I want to try every polyhedron he mentions on his website. Maybe it is a trace.

I also tried that, without success. Since you introduced me to the Koebe idea I will stick on that track I think… Seems to have advantages and it fascinates me. Maybe if I can’t get any advance this weekend I’ll change my mind.

For some reason the Koebe defintion from the other thread does not work when I subdivide Polyhedras with both, tri-and quad faces 2 times like in this example: (27.9 KB)
Do you know why?
Found also another one which looked at the first glance but wasn’t:

Well long is the way and hilly, but still fun to explore.
As always any hint is really apreciated! Thanks for the patience!

Since I could not find a way to make the Koebe definition working on mixed(tri+quad) meshes I couldn’t test the polyhedras you were mentioning. So I thought trying the further procedure to begin to make some test (materials,thickness,etc) could be a good idea:

I took the Mesh I most liked from my discrete minimal surfaces collection from last week:

and did the following:

  1. diagonilzed the mesh and extruded the mesh edges:
  2. manually joined them and converted them into Polysurfaces:
  3. unrolled them:

    Surprisingly, the Stripes aren’t straight.

I also had a try on your smoothed mesh with the same procedure, I imagine it requires still the further relaxation you are mentioning, since it is really curvy:

Hopefully I do not annoy you.
Thanks for your patience and expertise and have a nice sunday!

Hi Peter,

sorry, I did not appreciate the answer last year enough… I was young and foolish, now I am old and still silly.
Again I am digging into minimal surfaces(Gyroid this time, that’s why I remembered) and was searching what I did a year ago and found a script based on some code of you:

I am still wondering how you managed to get a surface out of it.

Maybe you have time/motivation/will to give a hint- I will send sardines or Doppelkorn to show appreciation