If we have a bunch of points that are uniformly spaced, we can squeeze them radially so that they yield a halftoned image. For example, if we have points distributed along a phyllotactic spiral, we can squeeze them to get a skull:

How does this work? Math math math.

As usual, we want to match darkness levels. Along a radial line of the image, we want to match the darkness of the uniformly distributed points to that of the output image. For the image, the total darkness is easy to calculate in terms of the radius **r** and the local darkness **K**:

K_{net}(r) = \int_0^r r K(r) dr

And for the uniformly distributed points, let’s say that \rho is the number of points per unit area, the dots are circular with area A_{dot} and the local radius is named **s**. In the coordinates of the uniformly distributed points:

K_{net}(s) = \rho A_{dot} \int_0^s r dr = \rho A_{dot} s^2/2

Then we equate the two, and get

K_{net}(r) = \rho A_{dot} s^2/2

but we want to map from each original point (with radius **s**) to the image space (radius **r**), so we find:

s = \sqrt{ 2 K_{net}(r) /(\rho A_{dot} ) } = f(r)

And we have to invert that to find the proper r:

r = f^{-1}(s) .

This gives the correct radial position for a dot in the uniform distribution. This didn’t deal with the angular position, which is definitely necessary. What I did was apply this technique to a lot of different angles of the image, and then interpolate to find the new radius of each point.

This works reasonably well, but it yields a bunch of artifacts. Especially when using a square grid of points, or when there are sharp gradients radially, which form shock waves in the image.

But it does work!