Multiple Attractors with Points / Circles & Cutting Circles out of a Surface


I’ve created a grid of circles that I would like to scale using attractor points. I’ve used a Minimum component to limit the effect / operating range of the attractor. I haven’t been able to figure out how to add additional attractors to the definition - ideally I’d like to add multiple points.

Many thanks in advance, (10.2 KB)

Use Pull Point’s Distance output.

Multi (11.4 KB)


Some brief comments to consider - before I dig deeper for your answer.

  1. This white group is how I would generate a random list of attractor points:


  1. It seems odd to me that you create all circles with a fixed radius and scale them later instead of creating circles with different radii based on proximity to attractors?

  2. Cull every other circle seems odd to me, instead of creating a grid with more separation in the first place? Use ‘V Count’ = 125 instead of 250 for SDivide.

  3. Ideally, you would use the grid points instead of Area ‘C’ (Centroid)

TBC (To Be Continued)

Later… I replaced Dist with CP (Closet Point - singular!) This is an important detail.

I left Scale as you had it but would recommend changing that to create the circles with radii based on distance instead. (10.6 KB)

Here’s a way to do that: (15.6 KB)

Thank you for your answers – extremely helpful and clear.

To answer a couple of your questions:

  1. This was intended to control the density of the original pattern, in conjunction with SDivide, but I see how you’ve created a Max. Radius with ReMap instead - that’s much better.

  2. I forgot to flatten the output of CircleCNR; want to have the ability to make it a running pattern with Cull. I imagine this can still work with either of your definitions?

Thanks again,

Thank you very much for your suggestion – this is a great alternative. I need to add a few more parameters in this case but am saving your definition for future use.

Two more improvements:

  1. That A/B thing wasn’t sitting right with my way of thinking so I ditched it.
  2. Added a ‘min radius’ slider (blue group) to set the smallest circle size. (16.9 KB)

Yes, that will work. (18.1 KB)

Note that I disabled Boundary at the end because it’s rather slow. It’s more fun to play with the ‘Seed’ and ‘Count’ slider inputs to PopGeo when the model is fast.

Thank you again. I reconstructed your definition to trace your logic and it works perfectly.

I have two other questions –

  1. I would like to apply this to a curved surface. I tried replacing the ‘Circle’ elements with ‘CircleCNR’ to find the surface normal; it worked on the original surface (it oriented them vertically) but had some problems with the curved one (photo below).

  2. If I wanted to control the attractor points, rather than create random ones, do you have any suggestions? I know you recommended ‘PopGeo’ to create multiple points, but in this case it will be important to control the points of greatest material density. (18.2 KB)

On #1, it’s not difficult to restore that Circle CNR… Here it is: (23.6 KB)

On #2, you can choose the points any way you like, just replace the ones generated by PopGeo.

1 Like

Perfect, got it – (15.2 KB)

Thanks again!

One more – any suggestions for trimming the circles from the surface? Everything I’ve tried so far crashes.

I reduced the “resolution” (grid point count) because this is SLOW and might not work at all with thousands of holes. Even so, this took nearly ten minutes, so I disabled the yellow group on the attached file: (22.5 KB)

To get around the performance issue, the surface can be split up to reduce the number of holes per surface. More here:

The split is very slow because that method uses all the cutters as once - it is like surface.Face.Split(listOfCutters, splitTolerance); So it evaluates all the cutters and makes some split.

I have found in a lot of cases that just using anemone to split with one splitter at a time really improves the performance. So keep looping the next cutter with the previously cut surface.


Never would have thought that that approach would improve performance… must try it someday.

It still can be slow (but not as slow), but at least it always seems to finish rather than hang up.

1 Like

Here with Anemone fast loop. 75 seconds to finish. Without Anemone, I am still here waiting going on 8 minutes now… @DavidRutten can split be improved for Gh2? It’s just one of those things most everybody needs. (18.6 KB)


It’s not a Grasshopper thing, Split (like almost all geometric operations short of Delaunay, Voronoi and Bi-Arcs) are a Rhino thing. I can put it on the list for Future Rhino, but it’ll carry more weight if users request this instead of me.


Hi @Michael_Pryor,

I tried to translate that to C#, but it doesnt work.I think I need to feed everytime the surface back in?
Not for comparing splitting time, I just see it as exercise

Maybe you could help me? (12.5 KB)

Something like this is the same thought behind the Anemone way.

Basically using one curve at a time as a list (since split requires a list).

And actually you get the same speed advantage of the Anemone way even a bit faster. Here I cut about 2000 circles out in 86 seconds:

The Gh split took 244 seconds for the same 2000 circles:

@DavidRutten seems a simple change like that can greatly improve the performance for whatever reason. (15.0 KB)