##
Homework 10

Extend your Phong-shaded sphere Applet,
so that it can be used to
apply the following procedural textures
to your test sphere:
- A pattern of fuzzy dots.
- A pattern of tunably sharper dots.
- A bump pattern.

The first part can be done by some variation of *f(x,y,z) = sin(x)*sin(y)*sin(z)*.
You'll want to play with both frequency and amplitude to get reasonable results
(ie: vary the domain and range, respectively, of the calls
to the three *sine* functions).
For example, you'll probably want to "normalize" the range
of *f()* so that it ends up with values between *0* and *1*
(so that you can use *0* as black and *1* as white).
You can always normalize from a known range *[a..b]*
into the range *[0..1]* via the function *N(a,b,t) = (t-a)*/*(b-a)*.
For example, *N(-1,1,t)* will shift *t*
from the range *[-1..1]* to *[0..1]*.

The second part can be done by applying a high gain filter
to the normalized *N(-1,1,f(x,y,z))*.
Such a filter pushes low values downward toward zero, and high values upward toward one.
A simple (but not tunable) version of such a filter can be
implemented by the cubic "s-curve" function *3*(t^2) - 2*(t^3)*.
I'd like you to create a similar, but tunable, function *gain(g,t)*, which
produces a higher gain as you increase
its *g* argument.
Then apply this to create
*F(x,y,z) = gain(g,N(-1,1,f(x,y,z)))*

using various values of *g* to modulate sharpness.

The last part is done by varying the surface normal (prior to
doing the Phong lighting model)
in **shadePixel()**.
This is trickier, since you need to vary the surface normal
by the vector-valued derivative
of your function.
You can approximate this derivative
by sampling values near the surface point,
as follows:
*
dF(x,y,z) = [F(x+µ,y,z)-F(x,y,z) ,
F(x,y+µ,z)-F(x,y,z) ,
F(x,y,z+µ)-F(x,y,z)]
*

for some very small value of *µ*.
To make the appearance of a bumpy surface,
you add *dF(x,y,z)* to the surface normal vector,
and then renormalize the result,
prior to shading.