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


(Gabriel) #1


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)

Multiple point attractors
(Michael Pryor) #2

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)

(Gabriel) #5

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,

(Gabriel) #6

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.

(Gabriel) #8

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.

(Gabriel) #10

Perfect, got it – (15.2 KB)

Thanks again!

(Gabriel) #11

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:

(Michael Pryor) #13

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.

(Miguel Villegas Ballesta) #14

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

(Michael Pryor) #15

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

(Michael Pryor) #16

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)

(David Rutten) #17

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.

(Michael Pryor) #18



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)

(Michael Pryor) #20

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)

Wish: make split surface faster