Equilateral Triangular Grids on a Surface

I am looking for a way to split up a surface to equilateral triangles to place adaptive components on them. I have tried most packages but I can’t split any of the given panel shapes into such triangles.

What have you tried? Can you send a sketch of what you’re after? Perhaps looking into MeshToolkit as a start point if you haven’t already, while that may not make equilateral triangles it will be triangles and is a good starting point for discussion.

Always take a screenshot of work done so far. :slight_smile:

That’ll make it easier for others to comment and help you in the right direction.

@jacob.small @Christian_Vestesen
Sorry about the lack of screenshots and basically anything else. I was extremely frustrated when I posted this and my laptop was holding on for dear life. Here are my surface and current point grid, but I assume the process is usable on most surfaces.


To make a long story short I’ve made a kinetic equilateral Revit curtain panel, the opening of said panel I want to control with the sun path. However My issue comes from the way I’ve constructed my grid and the triPanel package nodes I have use the diagonal of each rectangle to form a set of three points.

So main question again:
Although adaptive, my component is best suited for an equilateral frame (or similar proportions). How do I cover my surface with said equilateral point grid?

Making sure the triangles are equilateral will be pretty challenging with an unrulled surface.

However doing surface panellization is now easier than ever thanks to the List@Level syntax. Here’s an example using only OOTB nodes:

7 Likes

Its not possible triangulate a surface with equilateral triangles. You could get very close, but it wouldn’t be smooth and of course, you would need to perform relaxations on the surface geometry to find the optimal solution. Its not trivial.

Daniel Piker wrote about this on the GH forum:

1 Like

What about importing a custom mass that is divided by revit to the appropriate grid and then using said grid in dynamo? Or impoting the geometry to revit as a mass, dividing it and using the revit grid points? Is that in the realm of the possible? And how does one extract said points into dynamo?

Your screenshot doesn’t really show the graph so I can only guess as to how this is working. I for one would need to see more of where you are and where you want to get in order to help more.

There are a few methods for getting a UV grid from a mass, but the issue will still be the tessellation. No matter how you slice it, an equilateral triangle doesn’t really like to tessellate onto an irregular surface, and what portions do like tessellating won’t really be consistent.

@h.hristov31,

Show with a sketch or something exactly what you need, please.

This is one possible solution:

def DiagridPanels(s:Surface, u:int, v:int)
{
   return = [Imperative]
   {
      ustep = 0..1..#u+1;
      vstep = 0..1..#v+1;

      points[];
      polys[];
      panels[];

      for (i in 0..u)
      {
         for (j in 0..v)
         {
            if ((i+j) % 2 == 0)
            {
               pt1 = s.PointAtParameter(ustep[i],vstep[j]);
               points[i][j] = {pt1,pt2,pt3};

               if (j > 0)
               {
                  pt2 = s.PointAtParameter(ustep[i+1],vstep[j-1]);
               }
               else
               {
                  pt2 = s.PointAtParameter(ustep[i+1],vstep[j]);
               }
               points[i][j] = {pt1,pt2,pt3};

               if (j < v)
               {
                  pt3 = s.PointAtParameter(ustep[i+1],vstep[j+1]);
               }
               else
               {
                  pt3 = s.PointAtParameter(ustep[i+1],vstep[j]);
               }
               points[i][j] = {pt1,pt2,pt3};
            }
            else
            {
               pt1 = s.PointAtParameter(ustep[i+1],vstep[j]);
               points[i][j] = {pt1,pt2,pt3};

               if (j < v)
               {
                  pt2 = s.PointAtParameter(ustep[i],vstep[j+1]);
               }
               else
               {
                  pt2 = s.PointAtParameter(ustep[i],vstep[j]);
               }
               points[i][j] = {pt1,pt2,pt3};

               if (j > 0)
               {
                  pt3 = s.PointAtParameter(ustep[i],vstep[j-1]);
               }
               else
               {
                  pt3 = s.PointAtParameter(ustep[i],vstep[j]);
               }
               points[i][j] = {pt1,pt2,pt3};
            }
         }
      }

      polys = PolyCurve.ByPoints(points,true);
      panels = Surface.ByPerimeterPoints(points);

      return = {points,polys,panels};
   }
};

DiagridPanels(s,u,v);
1 Like

To illustrate my point better as I finally have a computer in front of me, here are some screenshots of my idea. I’ve tried a couple of things but I didn’t really have the time to really get into them so I would consider them basically useless for the time being.



So apparently you can import said divided mass into dynamo but none of that imported geometry is a point. I may just be a noob and not see how to extract the points and group them by three to form the point grid, as I’ve never done such a thing.

I am yet to test this out but I assume it’s basically the same exact method as the previous one but with a few extra steps.

I did however make some progress with the surface I previously shared and came to the conclusion that it’s highly impractical, so I will continue with a flatter more basic surface as it suits my needs better.

So yeah… Hope this makes things more clear on my part

TLDR: How do I extract a point grid out of the imported divided mass?

Here is one way to get the points from your geometry. (This graph was run on a divided surface I created the similar to yours above) Not sure how this will help with achieving your original goal, though.

5 Likes

Thank you so much ! This really solved the issue I had.

1 Like