Minimal path networks

I was trying to implement something similar to @AndersDeleuran video:

If there would be any use here is the script, you can relax the output using kangaroo (12.4 KB)


Hi petras,
Thank you for your syntax.
I am getting an error in grasshopper.Can you help me solve it.
Also I have very no knowledge of .NET, Can the branches only have an angle of 120 degrees in between?I see here it is randomly populating the cube.
I am not getting the output lines like your Jpegs show


Do you have rhino6?

Or use this version for rhino 5 (10.5 KB)

no idea about 120 degrees, I did not check it after relaxation, for kangaroo I just used zero length springs with anchor points.


I didn’t open the file yet, but to get 120° angles when relaxing in Kangaroo - use the ConstantTension goal instead of zero rest length springs (the latter uses Hooke’s law, with force magnitude based on extension, so has energy proportional to length squared, whereas the former has energy proportional to just length).

If the tension forces in three members attached to a point are equal, the only equilibrium configuration is when the angles are 120°

(This system will break down when segments get close to zero length though, and for that you’d need to include a way of changing topology during the relaxation)



Hi Petras,

Why am I not able to get the nodes correct.They are all straight lines

Because you did not relax it with the kangaroo.

If @DanielPiker could show the example file it would be nice. (12.2 KB)

It is as simple as this with constant tension and Kangaroo2:

actually you do not need spring goal:


What command did you use after clean tree.Also how are you getting nodes at the end of your lines.

Hi Daniel,
Thank you so much for your input, the constant tension goal works great for the angle of 120 degrees. Petras has helped me decode it on grasshopper
However, I still I want to know little bit about the theory behind 120° formation in a soap bubble if you can.I know that the 120 logic has an imaginary hexagon surrounding it, But why does it want to attain an equilibrium position at this particular angle.Is there a math behind it.


If you think about just 3 cables pulling on a point with equal force, if the point doesn’t lie in the same plane as the ends of the cables, it will get pulled down until it does.
Then if 2 of the cables are closer together in direction, they overpower the third, so the point moves towards the ends of the 2 close ones until things even out.

1 Like

Thank you so much Daniel.I understand now.

After clean tree I use my add on NGon to create line graph that gives information which line is connected to which.

I do not know if it is necessary as it is used only to calculate the angle

Thank you so much for your immediate replies Petras, and thank you for having patience with me.You are just amazing.
The next question I have is something related to it your addon.

1.The branches are lines, can we add certain thickness to them.Can we calculate the structural strength in Karamba, once we increase the thickness.
2.Can we map the plane and angle of the branching with respect to 0 degrees or some constraints for example an imaginary point or line as it increases,right now the branches are all over in every plane.How to determine the predictability.
so for example I have 5 counts going in populate 3D. Can we map the branching, hence I’ll say this (xy/yz/zx)plane gives in this (30/60/90/120…)angle in (x/y/z) direction

Also measurement of length.How to measure the total length of the line


For the thickness I would use @DanielPiker Fattener: Skeleton fattener + mesh cage morph
I am not structural engineer thus my knowledge in Karamba is wage.

For the second point, could you make a rhino drawing?

For measurement, grasshopper component curve length shows the length of the line.

1 Like

I ll look into Fattener command.In the mean time, I could calculate the total length but the unit was wrong because there was no specific unit given to the box.When I gave a dimension of 5000mm to the box, theres an error coming up.

and I cant see the added length.
Could you please look into it.PseudoSteinerTrees2Rhino5 (1).gh (13.3 KB)

Hi @Petras_Vestartas ,

I had to say this its been a pleasure talking with you.
You have been answering all my questions, solving them one after the other :slight_smile:
I will try and figure out the way to solve the scale issue once given the dimension.
Also is there a way we can define the start and end point instead of using populate 3d.
such that it is easier to map the path and figure out a way to find the angle between two consecutive lines in order.

Again tonnes of thanks to you.
Keep spreading knowledge.


I did not know that by simply passing a nested list into a second C# component it will output the tree, without having to convert it with explicit code in the first C# component, thanks @Petras_Vestartas

1 Like

Hi Everyone!
Is it possible to apply this script on points created by me? So rather than having the centerbox that constraints the geometry I tried to set my own point but the script doesnt recognise it. Would anyone have some advice for me on how to change this please?