Delaunay Triangulation on a Façade

Hello all,

Today we are going to discuss Grasshopper for Rhino. A tool I love, but don’t get a chance to discuss or even use enough. It can be a powerful tool for design, but sometimes difficult to implement, due to its learning curve. Additionally, figuring out how to efficiently import a design from GH/Rhino into another software, such as Revit, is a major issue (that deserves its own post). For now, I want to discuss a specific problem, and ultimately the solution, that I came across while designing a façade in grasshopper. It has to do with ~Delaunay Triangulation~.

The design the client wanted modeled was a randomized, triangulated pattern on a glass curtain panel that would vary in depth. This design seems to be quite common in interior architecture (I’ve modeled it a few times now) and this time around, I wanted to tackle it in grasshopper so I would have the script for future projects and iterations. Grasshopper has a node called “Delaunay Edges” and “Delaunay Mesh” which creates Delaunay Triangulation, an ideal pattern for what I was trying to achieve. Here is the Wiki article on it (I particularly enjoy it’s relationship with the Voronoi pattern):

Locate triangle containing arbitrary point in Delaunay-triangulated surface  - Stack Overflow

I aimed for triangulated pattern that was not uniform in placement, but consistent in size (see the above image). The best method to do this was to randomly populate points on a surface (which was pre-modeled in Rhino) and connect them using the Delaunay edge node in GH. However, this led to something I should have foreseen- the design failed to include the edges of the surface:

As you can see, the green Delaunay edges do not include any points found on the surface edge, because duh, I didn’t set it to do so. I ended up throwing in a divide by distance on my surface edge, and included those points with the randomly populated surface points. This is the result:

Already a lot better than the previous iteration. This pattern connects the surface edge points I created with the populated points so that I was getting a rectangular edge, However, I noticed that there were some undesirable sliver triangles around the border. I thought that by culling points within a certain distance to the surface edge, it would remove these skinny triangles. I ended up using the pull point node to gather the interior points’ distances to the surface edge, and creating a cull pattern based on whether each of these distances were larger than the allowed “smallest distance”. If a point’s distance was smaller than the allowed distance, it was removed from the list.

This technique ended up working quite well, as you can the (poorly) marked blue circles show points that were thrown out of the list due to their proximity to the border. Overall, I was quite happy with this shape. The last task was to move each point based on a randomly assigned unit vector (on the y axis) to create varying depth to the surface.

Once complete, the edges were piped and surfaces baked to create the following form:

I really liked how the randomized depths give the shape some dimension. I show these two iterations side by side, because the client actually wanted larger triangles (left) than my first iteration (right). Luckily, because I had designed it all in grasshopper, all I had to do was change one or two sliders, and viola, updated! Work smarter, not harder.

Note: If you would like the grasshopper script, shoot me a message and I can send to you to work with. Thanks!

3 thoughts on “Delaunay Triangulation on a Façade

  1. Hello! Is there any chance I could get the grasshopper script file? I am hoping to create a similar model and I’m not very experienced with GH yet.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s