Here's a GN group that will pack instances on a surface, irrespective of its topology. The packing is based on a hexagonal tiling of its UV space.
It relies on 2 subgroups.
A hexagonal tiling of a given UV space, using a method explained here :
.. and a group which measures the linear relative stretch of the UV map with respect to the mapped surface:
This group is responsible for scaling instances to fill the surface, in proportion to the hex cells in which they are placed. Something close to the output square-root of the scale is required to do this, but I've left that outside the group to allow for no scaling at all (IS Exponent: 0).
They can be used in the following tree to place the instances. Points are redundantly spread on the surface by subdivision, moved to the locations of their hex cells, and merged:
Inputs provided:
- The Geometry to be paved, and its UV Map
- The Instance to be distributed
- A Scale for the instance, and a multiplier for convenience, to aid the entry of small values
- An exponent to scale the instances with respect to UV stretch. This would normally be set to 0.5.
This is the kind of result: