# Refining the Model, Multi-step Processes

If we make an observation that, at least for some woods, grain patterns are noisy while the color in between the rings of grain is turbulated we can arrive at a more sophisticated color function. This time the color function depends on r, theta, and z.

This time two colors are specified for the pulp, PulpMin & PulpMax. The range of colors that can be returned for the pulp are those that lie on the line from PulpMin to PulpMax.

```Color(r, theta, z)
{
//First peturb the radius with a noise function
R = r + Noise(r, theta, z);

D = R/RingWidth;
D = (D - (int)D) * RingWidth;
if( D < GrainWidth) return GrainColor;
else
{
R = r + Turbulance(r, theta, z);
//some fudging to ensure a number between 0 and 1
factor = (1 + sin(R/lambda)) / 2.0;

//use this factor to linearly interpolate between the two colors PulpMin and PulpMax.
return Interpolate(GrainMax, GrainMin, factor);
}
}
```

This procedure can also be done with the grain color by specifying GrainMin and GrainMax.

The next two images instead of using two colors, PulpMin & PulpMax, uses a repeating set
of 20 colors.

Ring = (int)R / RingWidth;
Ring = Ring % 20;

Interpolation is first between the ring color and the next ring color followed by an of that color and the previous ring color. The factors used for the two interpolations are different and were forced into the range [0, 0.5].