I needed to tile an arbitrary closed SubD surface with (mostly) hexagons, so I set up the Grasshopper / Kangaroo / C# solution below.

geodeye.gh (15.2 KB)

I’m populating the brep with random points, then using a SphereCollide goal to spread them out uniformly while keeping them on the surface with an OnMesh goal. The C# script generates the Voronoi diagram of the points, which are mostly hexagonal since that is the most efficient way to pack spheres on a plane.

That pretty much works, and I’m partly posting this as it may be useful to others. But…

What I was hoping for was almost all regular hexagons, with a small number of pentagons to accommodate the curvature, like you’d see in a spherical geodesic dome (i.e. the dual of a subdivided icosahedron). But you can see there are quite a lot of irregular polygons, and they are clustered together. Interestingly, changing the cell density doesn’t seem to make much difference.

I should add that I am specifying an average cell spacing S, and using that to calculate both the number of points (=Area/(S^{2}*√3/2)) and the SphereCollide radius (=S/2). These would be the exact values for a flat surface, and I believe that’s the only reason this works at all.

If I make the SphereCollide radius smaller, it just doesn’t do anything, and if I make it significantly bigger it doesn’t settle at all. At right around (0.7*S), there is a second minimum dominated by square cells, which is super interesting when you think about what’s happening:

…but even less useful to me.

I think the problem is that SphereCollide calculates hard “on/off” interactions, when what I really want is a continuous force field through space (or even along the surface). I can’t find a way to do this using Kangaroo, though…?

I did try using the Soft & Hard solver, but that just gave odd results. Maybe there is some clever way of placing anchor points to force a more regular solution?