Is there an easy way to create uniform point distributions on a sphere, such as the endpoints of an icosohedron, but more points?

Is there an easy way to create uniform point distributions on a sphere, such as the endpoints of an icosohedron, but with more points?

I’m considering achieving it by circle packing, but I’d rather perfectly uniform spacing, maybe possible with that, I’m pretty new to it.

I know I can set it up multiple ways to achieve a U/V distribution, but they are spaced rectangularly. I want them spaced triangularly.

I’m thinking the file may be superfluous in this case, but in case anyone wants to help that way…
More uniformly spaced instances desired.gh (19.6 KB)
More uniformly spaced instances desired.3dm (44.4 KB)

I did figure out how to do something similar maybe exact, with trimesh, but I’m curious if there is a previous command to do what I’m asking.

Hi @jayandrewscadd

I’m afraid this is impossible for more than 20 points (the vertices of an icosahedron).

One way to get a nice symmetrical distribution where the variation in distances to neighbours is quite small is to subdivide an icosahedron and project the vertices onto a sphere.


icosa_dots.gh (8.4 KB)

There are many other options though. Distributing points on a sphere is a surprisingly rich topic. Because perfectly regular arrangements are not possible for arbitrary numbers of points, there are many different quantities which can be optimized for, giving different results - 2 well studied ones are maximising minimum distance between any 2 points(the Tammes problem), minimizing the electrostatic potential energy (the Thomson problem).
See this thread for a bit more on the topic

For an alternative approach, here’s a nice Fibonacci distribution of points on a sphere:

2 Likes

Here’s an example of using electrostatic type repulsion to distribute a large number of points (shown here with 10,000).
This approach can be useful if you require a specific number of points, since with the subdivision method you are limited to the jumps in vertex count between levels of subdivision.
repulsion_distribute_sphere.gh (14.3 KB)

Thank you so much Daniel. I just opened the file in the first example, just to see. As I mentioned I have already accomplished the first step, used a different method than you mentioned, though I still give you credit since I used trimesh haha. I oriented a plane at each end point of a line from center to each vertex.

My next challenge is to try to arrange the shapes somehow looking somewhat perpendicular to each other. Sorry, I don’t mean to move the goalpost on you :slight_smile: just sharing what I’m up to, and glad if anyone has any suggestions.

BTW, I am fully aware that I can’t get this 90°ish pattern by using 90°, as it’s on a sphere instead of a plane!

Can you clarify what you’re thinking of by “somewhat perpendicular”?

Right haha, sounds funnier when you quote me, I’ll adjust that to less linear or more triangular maybe :slight_smile:

Of course it’s very tricky on a sphere.

On a square grid like this metal pattern you can assign the vertices to 2 different sets so that each one is in a different set from its neighbours. Then you can have these 2 sets perpendicular to each other.
For a triangular grid this is not possible.

Right, definitely tricky. Randomizing might be my best option.

Oh, nevermind it’s a subdivision, now I see, I should have decreased the level, not increased. Good idea.

It’s just warning you before creating huge numbers of points.
When you put in a level higher than 3, you need to right click the component and select ‘No’ under ‘Dynamic preview’.
The number of points goes up fast though (hence the warning) - level 5 gives you >10k, level 6 gives >40k. So if you put in something like level 20 you can expect things to freeze.

1 Like

Makes total sense. I blame it on I’m a bit rusty, haven’t used Rhino in a while :slight_smile: