"perfect" grid with nice boundary

I think there’s still room for further improvement, for instance here’s the effect of adding some bending resistance to concentric rings of edges towards the boundary, which reduces the squeeze at the ends visible in the third one above.


nice but smaller dots makes the eye more forgiving, so to test if this really works it should be displayed with dots that are at least as large as their spacing.

1 Like

I agree - a stipple of tiny dots is much less revealing of the irregularities in a grid than a packing of tangent circles centred on the same points. It depends on the application which one is more relevant

I don’t think I’m allowed to share, but I also simply don’t own images of that work. That question is actually not so easy to answer.
Between 2013 and 2016 I made a couple of Dynaudio and Fender Speakers for Volkswagen, seats and other interiour parts, many concept cars and concept part. You can google for them, but only a small percentage of that work will ever be seen by public. And guess what, the boring stuff won way to often.:woozy_face: Since 2012, Grasshopper is broadly known at VW Design, fighting with many prejudices. So many of this work was rather experimental, keeping up with new technology. And many things you see, look like Grasshopper, but are made with Catia or completly manual drawn in Alias or Icem Surf. Don’t underestimate cheap design contractors from oversee :wink: :man_facepalming:

In 2015 I switched to exteriour where I first fully introduced a way to create generative parts up to production quality. I made every generative exterior pattern of the PoloGti, GolfGti and Jetta Gli (which just came out recently). These 3 cars alone had at least 3-4 years of full design development. One of my most difficult perforation job was a full dashboard cover for a Phaeton, which was never presented to public, since the car was stopped, same as many other cars later during the diesel gate. I think you will see more generative parts in the near future, since it slowly begins to be an accepted tool, and designer becoming better with it, but I’m out of this anyway, doing GH for hobby only.

And to be honest with you guys, after doing at least 10 of these cheese grater, I wonder if you guys would find the job very exciting. I can only demotivate you all becoming good at it, because otherwise you might be the idiot doing it… :smile:


Perf patterns are tough, period! And it’s never an idiot doing it. (I got the ironical humor though…:wink: )

Perf patterns are critical to products requiring aesthetics since they can be “make-or-break”…in that they impart such strong visual influence, especially when deployed prominently, such as the chair example above. Hard work!

Excellent topic OP, and @DanielPiker…you’re always a technical inspiration! Thank you!

The problem with any pattern done with Grasshopper is, that its actually fun and indeed intellectual challenging to create algorithms and working out multiple mapping strategies.
But from my experience this is about 10% of all the work involved , the rest is applying to frequent changes , proving feasibility and optimisation until perfection. This rest (the 90%) is what nobody tells you about until you experience it for yourself. I personally found this quite boring, after doing it dozens of times. :confused:
Me and my workmates actually tried to rotate on doing perf patterns for this reason back in the days…

1 Like

I agree. I think because it makes the stepping at the ends look consistent with the long sides.

I think this could look very good but with manually deleting one point at each corner

Edit: like this "perfect" grid with nice boundary

How about a slightly more complex shape?


the other side :slight_smile:


Hey @DanielPiker, I’m curious what you changed in the triangles script to add the bedning resistance to concentric rings. Would it be possible to upload the file or describe it in words? I can’t figure out how to change your script to achieve the same result.

Hi @danielbent,

I tried a couple of different ways of smoothing the concentric rings.
One is to identify the edges one row in from the boundary, join them into a polyline and apply a ‘Rod’ goal.
Another is to identify the vertices one away from the boundary, and pull them to an offset of the smooth boundary curve.
It can also be helpful to do the same thing to the next ring in, but with a lower strength, to blend more smoothly.

I didn’t post this earlier, because I think I can make something a bit cleaner and simpler for identifying these concentric rings using the mesh topology, but in the mean time, here’s how I was doing it above:
dotdistribute_foot.gh (34.0 KB)

When applying this to other shapes, a critical step is drawing the grid aligned curve to identify which points get pulled to the boundary.

1 Like

For example, here’s an attempt on a more complex shape.
On the left is the relaxed result, and on the right is the curve used to identify which points to pull to the boundary (essentially the cutting pattern of the mesh).

The more closely this grid aligned cutting pattern matches the target boundary curve, the less variation in spacing there will be in the final result.
Here I’ve used some turns of 30°, so some half triangles. Using only 60° turns can give a calmer look towards the boundary, but since it doesn’t let you approximate the curved shape so closely, there will be greater variation in distance between points.


Thank you so much for the file and the explanation @DanielPiker , it helped a lot to understand your script and a bit more of kangaroo :slight_smile:

Additionnaly I tried to identify the concentric rings using mesh topology via sandbox and came up with a working solution (at least for this example) but it’s far away from clean.
Daniel_Piker_dotdistribute_foot_modified.gh (37.7 KB)

I’ve been chipping away at this problem for years every time if comes up on a project. hard to come into the conversation after daniel has answered :wink: , but here’s where I’ve gotten prior to my experience with grasshopper. To finalize this, I would plug the points into a kangaroo spring form mesh to help with the spacing. It’s on my to do list.

Here goes… !

By eye, trying to find a natural grid system that is:

-Evenly distributed.
-Respects the outer profile curve.
-Has good flow lines.

It’s mostly a squish diamond grid, with a special treatment in the corners, where you add two new dots on every other concentric row. Good start, but there is tension in the region circled in red.

When grid lines are added, it becomes obvious that there is an extra row causing the tension that should be deleted.

Row deleted, optimizing flow lines.

Grid dots nudged over optimized flow lines.

A similar logic was used on this circular grid pattern, which I did do in grasshopper…


Do you mind posting your script for this solution?

@TheCyclist here you go:
perfect-grid.gh (16.4 KB)


I tried to identify the concentric rings of vertices by using mesh topology in C#. It works well for the foot example and I will test it with more complex shapes. Sadly it get’s really slow fore more than 5 or 6 generations, but since I only used 2 or 3 it doesn’t matter for me atm.

template for the script was @PeterFotiadis VertexNeighborhood script found: here

190729_dotdistribute_foot_modified_c#.gh (34.4 KB)

I will keep working on this since I want to learn more c# + I would love to input vertices directly instead of their indices, add a curve input to delete points of Gen1 that are not inside the curve (should also make the script faster) and by that and combined with the dictionary the following generations shouldn’t be able to pick points outside of the curve.

Hi Daniel,
I try to look at this interesting topic, but it says this DotDisplay kangaroo component is missing. I wonder if this version of kangaroo has been released yet? I can not find it. Does it work with Rhino 5?

DotDisplay is part of the release of Kangaroo included in Rhino6. I think the definition should work without it though if you close the warning - it is only there for display. To see the points, turn on visibility for the main solver component.