Divide multiple radial curves into increasing lengths

A request for feedback from a grasshopper novice. I am trying to achieve a pattern which matches the attached pic.
Using my limited gh skills I can create the radial lines and divide the curve into equal amounts.

My next challenge is to divide the radials into increasing increments, the further they move out from the centre.
After that I would need to create circles on the radials whose diameters would follow the radials, but that’s the following challenge!

Any feedback would be much appreciated :slightly_smiling_face:
Circular_floor_pattern_wip.gh (8.2 KB)

whatever your Grasshopper level is, the first work is more a math work. You must decide if you want circle, an ellipse or whatever shape. Where is its center. You can parametrize with an angle …

So you have many choices, so first thing is to choose parameters. I understand you have

  • Initial radius
  • Number of subdivision (even number)
  • Angle

Radius New = Radius Old*(1+Sin(alpha/2)/Cos(beta) - Tan(beta)*Sin(alpha/2))
Beta is 0 if center of circle is between the 2 arcs extremities.
alpha = 2\pi /nSubdivisions

  //Laurent Delrieu 13/01/2022
    //Radius where the arc begin
    double radius = initialRadius;
    //Angle representing where the center of the arc is, if 0 center between the ends of arcs
    double beta = betaDegree * Math.PI / 180;
    //List of all radiuses
    List<double> lst_radiuses = new List<double>();
    //List of arcs
    List<Arc> lst_arcs = new List<Arc>();

    double alpha = Math.PI * 2 / (double) numberOfDivisions;

    //For all rows
    for (int i = 0; i < numberOfRows; i++)
      //Position of extremities of arc
      Point3d p1 = new Point3d(-radius * Math.Sin(alpha / 2), radius * Math.Cos(alpha / 2), 0);
      Point3d p3 = new Point3d(radius * Math.Sin(alpha / 2), radius * Math.Cos(alpha / 2), 0);
      //calculation of new radius
      radius = radius * ( 1 + Math.Sin(alpha / 2) / Math.Cos(beta) - Math.Tan(beta) * Math.Sin(alpha / 2));
      Point3d p2 = new Point3d(0, radius, 0);
      lst_arcs.Add(new Arc(p1, p2, p3));
    radiuses = lst_radiuses;
    arcs = lst_arcs;

Using my nColor tool


Using Anemone loop.

Circular_floor_pattern_2022Jan13a.gh (19.4 KB)

Math? Bah! Who needs it? :sunglasses:

P.S. Actually, there is a small error if you look closely…

Circular_floor_pattern_2022Jan13b.gh (29.7 KB)

arc_radial-pattern.gh (13.5 KB)

Thank you Laurent. That is most impressive! I will have to study on it a bit further as it is beyond my current math appreciation level, but i do get the gist of it…

Much appreciated

Thanks Joseph,

That does exactly what I was looking for… I’d also like to check out the possibility of using a slightly eccentric centre point and see how that reacts

Anemone looks like a powerful tool!

Thanks Seghier,

I will download the file and play around with it this evening…

@seghierkhaled and @Joseph_Oster proposed you recursion using Anemone.Joseph uses geometric calculation (less Math :slight_smile: ) and Khaled some of the Math I present without the beta coefficient.
For me it was math and recursion using code.
Use what you understand, but I insist you must try to deconstruct the problem to be able to “speak” to the machine (Grasshopper here).

Here my last version with a beta that is variable.

And if you want \beta = 0

pattern circles_variable beta.gh (29.9 KB)


You can also use series instead of anemone

arc_radial-pattern.gh (11.0 KB)


Or it is also possible to use his first idea with points on a line. Circles have no more center with a strict position but size is clearly more

pattern circles simple.gh (15.5 KB)


These are very elegant, thank you for sharing.

It’s extremely useful to get a look at your version and get a sense of the process used to construct the pattern based on your first diagram of the shapes.

I was looking at a solution from a different direction; subdividing a line on a radial and then creating ellipses using alternating points on those lines, but your last message shows the direction that would have taken - still an interesting outcome, but not exactly the result I was after!

When you want something you have to describe well what you want. The image with the floor was quite clear but your Grasshopper script didn’t have curves so your intentions where not enough clear. You must internalize curves, add some drawings … By the way the question was interesting.

As I understand what you want, the main job you’ll have is to work on datatree of points in order to take

  1. Point(i) on Branch(j)
  2. Point(i+1) on Branch(j+1)
  3. Point(i) on Branch(j+2)
    DataTree are not easy to handle but as you understood there are some things useful on my last script.
1 Like