\chapter{Color mapping}

In chapter 2 we saw a figure (figure 2) which showed a fluid in motion. The fluid had a very bright grey color. How is this color determined at every vertex?

\section{Description}

The technique that maps a value to a specific color is called color mapping. We already explained that the simulation is divided into cells with each 4 vertices
that can contain different values (a uniform quad grid). A colormap calculates the color, given a certain colormap function, for every value at a vertex. Example:
\\

In figure 2 we saw the smoke using a grey scaled colormap. If we know that the values at the vertices ranges from 0 to 1, we can use the value to determine each
color aspect, red, green and blue. This means, for each vertex:

$$ red = green = blue = value $$

To be able to reason about the colored images, we added a legend at the top of the screen. The leftmost colors indicate low values and the rightmost colors indicate
high values. With such a colormap legend, it's easier to understand the produced images and say something about the value of the fluid. \\

You are also able to set the number of used colors. At default this value is set to 256 colors, but you can easily set that amount to 16 using a slider. You will
see big bands of colors appear. This way, the line between certain values becomes more visible. \\

\section{Implementation}

We've implemented two actual colormaps and three which only contain one RGB color, red, green or blue (useful for isolines for instance). The "Wilrik" colormap
implements a fire elemental color scheme. The other one is called "Oliver" and is a repeated band of colors which can show quite well where the fluid's in motion.
\\

\begin {center}
  \includegraphics[width=100mm]{wilrik.png} \\
  Figure 3: A fire colormap \\
\end {center}

The fire color is determined as follows:

$$ red = value; green = value / 3; blue = 0; $$

So, if the value is high, a lot of red, one third of green and no blue is taken. Low values only get a bit of red and almost no green. This gives a black to dark
red to orange, almost yellow colormap. \\

To create a repeating band of colors, we used to following definition:

$$ value = (int)(value * 100) \texttt{ mod } 10 $$

So we first multiply the value with 100, cast it to an integer and take that value modulo 10. We then take some colors from a look-up-table to pick the color for
the band. \\

\section{Difficulties}

The last mechanisms to implement for this assignment were scaling and clamping. With clamping you let the user set a minimum and maximum for the values. This is
done by first enabling clamping and then click somewhere in the bottom of the color legend and drag the minimum and maximum clamping indictors. Actual data lower
then the minimum or higher than the maximum are set to the maximum or minimum respectively. \\

The (auto)scaling mechanism was a bit more subtle. When enabled, you can set the scaling in the same way as the clamping. For the auto-scaling, the minimum and
maximum values are stored and the entire dataset at the current time moment is mapped to the visible colormap. This is not so hard to do, but we had not foreseen
that values could also be negative. It wasn't until we implemented the divergence that we found this problem. \\
