fredrikj.net / blog /

# New color functions

*April 6, 2018*

Domain coloring
plots of complex functions
rendered
with the complex_plot
script in Arb
are a recurrent feature on this blog.
Domain coloring requires the choice of a *color function*
that maps a complex number to an (R, G, B) tuple.
Previously only
two such functions were provided:
`-color 0` gives the standard "rainbow" map (mapping phase to hue and magnitude to brightness)
and `-color 1` renders the phase alone in orange and blue.
Today, I decided to try to come up with a few more aesthetically pleasing color functions.

Through some experiments with blend modes in GIMP, I found that it is possible
to get quite appealing results by evaluating both the `-color 0` and `-color 1` functions,
merging them using a dodge filter with 50% opacity,
and then changing the color balance.
A "color balance" transformation in GIMP can be specified by a tuple of 9 parameters:
the adjustment for shadows, midtones and highlights (defined using ramp functions) for
the red, green and blue channels separately.
After finding a few nice such parameter combinations,
I looked up the exact formula
for color balance
used in GIMP and implemented it in `complex_plot`.
These color balance parameters can now be selected
with `-color N`, with `N` between 2 and 6.
Even more color functions can naturally be added in the future.

Each of the new color functions is demonstrated below by plotting
three favorite functions: the modular *j*-invariant, the gamma function, and the Riemann zeta function.
Click the images for 1024px resolution, or fetch the git
version of Arb and try the code on your own computer if you want higher
resolution or a different function!
I used the following invocations to create the pictures:

`build/examples/complex_plot -color N -range 0 2 0 1 -size 2048 1024 modj`

`build/examples/complex_plot -color N -range -23 23 -23 23 -size 1024 1024 zeta`

`build/examples/complex_plot -color N -range -5 5 -5 5 -size 1024 1024 gamma`

## N = 2

This is the result of the dodge operation alone; that is, the
identity balance transformation (0, 0, 0, 0, 0, 0, 0, 0, 0) is used.
The lack of reds make this scheme a bit easier on the eyes than the
default (`-color 0`) rainbow map, but it's also a little dull.

## N = 3

This uses the color balance transformation (0, -0.5, 0.2, 0, 0, -0.1, 0, -1.0, -0.2). The result is a shiny, chrome-like look.

## N = 4

This is definitely my favorite! The colors are warm and the gradients are paint-like. The transformation is (0, -0.5, 0.2, 0, 0.5, -0.1, 0, -0.3, -1.0).

## N = 5

This has some of the same paint-like quality, but with cold colors. The transformation is (0, -0.5, -1.0, 0, -0.1, -0.67, 0, -0.55, -0.12).

## N = 6

I say tomato. Transformation (0.86, 0, 0.13, 0.57, 0.19, -0.52, 0.31, -0.30, -0.94).