//
import java.util.*;
public class vpuff extends VolumeApplet
{
Random R = new Random(0);
int blur = 20, mode = 0;
double P[][];
double freq = 6.;
boolean isAddingNoise = false;
public void setAddingNoise(boolean tf) {
isAddingNoise = tf;
freshStart();
}
// THINGS TO INITIALIZE WHEN STARTING THE APPLET
public void initialize() {
setSpecular(.5,.7,.7,.01);
setAmbient(.5,0,0);
// CREATE CLOUD OF PARTICLES
P = new double[200][3];
for (int i = 0 ; i < P.length ; i++) {
double rr = 10;
do {
double z = (1 - 2. * i / P.length);
P[i][2] = z;
double r = Math.sqrt(1 - z*z);
P[i][0] = r * (2 * (R.nextDouble() % 1) - 1);
P[i][1] = r * (2 * (R.nextDouble() % 1) - 1) / 1.414;
rr = P[i][0]*P[i][0] + 2*P[i][1]*P[i][1] + P[i][2]*P[i][2];
} while (rr > 1.01);
}
C = 1;
S = 0;
}
double r = .3, rxr = r*r;
int i0 = 0;
public void restart() {
i0 = 0;
}
public double density(double x, double y, double z) {
x /= .7;
y /= .7;
z /= .7;
for ( ; i0 < P.length ; i0++)
if (P[i0][2] < z+r)
break;
double d = 0;
for (int i = i0 ; i < P.length && P[i][2] > z-r ; i++) {
double pu = P[i][0], py = P[i][1], pv = P[i][2];
double px = C * pu - S * pv;
double pz = S * pu + C * pv;
px -= x; py -= y; pz -= z;
double rr = (px*px + py*py + pz*pz) / rxr;
if (rr < 1)
d += .5 + .5 * Math.cos(Math.PI * Math.sqrt(rr));
}
if (d > 0) {
if (isAddingNoise)
d += 4 * addNoise(x, y, z);
d = Math.max(.01, Math.min(.99, d));
d = .1 * filter(d);
}
return d;
}
double rot = Math.PI/3, c = Math.cos(rot), s = Math.sin(rot);
double addNoise(double x, double y, double z) {
double u, v;
x += 100;
double d = 0;
d += abn(1, x,y,z); u = x; v = y; x = c*u-s*v; y = s*u+c*v;
d += abn(2, x,y,z); u = x; v = y; x = c*u-s*v; y = s*u+c*v;
d += abn(4, x,y,z);
return 1.2 * d / freq;
}
double abn(double f, double x, double y, double z) {
double freq = this.freq * f;
return (Math.abs(ImprovedNoise.noise(freq*x,freq*y,freq*z))-.5)/f;
}
double filter(double t) {
t = bias(t, .67);
if (t < .5)
t = gain(t, .86);
t = bias(t, .35);
return t;
}
}