Fourier Polynomial Applet
import java.awt.*;
import java.applet.*;
import java.lang.*;
public class Fourier extends Applet
{
Graphics sG;
Graphics bG;
Image bI;
Graphics cG;
Image cI;
Color back = new Color(247, 243, 234);
Color lines = new Color(128, 128, 255);
Color black = new Color(0, 0, 0);
Color red = new Color(255, 0, 0);
Color pale = new Color(255, 128, 128);
Color button = new Color(255, 128, 128);
Color paleblue = new Color(128, 128, 255);
double[] a = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0,
1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, -0.8, -0.8, -0.8};
double[] b = {-0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2,
1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, -0.8, -0.8, -0.8};
int n = 0;
double sum;
double[] u = new double[1000];
double[] v = new double[1000];
public void init()
{
bI = createImage(this.size().width, this.size().height);
bG = bI.getGraphics();
cI = createImage(this.size().width, this.size().height);
cG = cI.getGraphics();
drawback();
}
public void paint(Graphics g)
{
g.drawImage(cI, 0, 0, this);
sG = getGraphics();
}
public void update(Graphics g)
{
g.drawImage(cI, 0, 0, this);
}
public int yscale(double y)
{
int iy;
iy = (int) java.lang.Math.round(110.0 - y * 60.0);
return iy;
}
public void drawback()
{
int iy;
bG.setColor(back);
bG.fillRect(0, 0, 421, 241);
bG.setColor(paleblue);
bG.fillRect(10, 220, 401, 11);
bG.setColor(button);
bG.fillRect(110, 220, 201, 11);
bG.setColor(lines);
for (int i = 10; i < 421; i = i + 20)
{
bG.drawLine(i, 10, i, 210);
}
for (int i = 10; i < 221; i = i + 20)
{
bG.drawLine(10, i, 410, i);
}
bG.drawLine(209, 10, 209, 210);
bG.drawLine(211, 10, 211, 210);
bG.drawLine(10, 109, 410, 109);
bG.drawLine(10, 111, 410, 111);
bG.setColor(black);
for (int i = 0; i < 20; i = i + 1)
{ for (int dx = -1; dx < 2; dx = dx + 1)
{
for (int dy = -2; dy < 3; dy = dy + 1)
{
bG.drawLine(i * 20 + 10 + dx, yscale(a[i]) + dy,
i * 20 + 30 + dx, yscale(b[i]) + dy);
}
}
}
sum = 0.0;
for (int i = 0; i < 20; i = i + 1)
{
sum = sum + a[i] + b[i];
}
sum = sum/40.0;
iy = yscale(sum);
bG.setColor(pale);
bG.drawLine(10, iy, 410, iy);
cG.drawImage(bI, 0, 0, this);
cG.setColor(red);
cG.fillRect(10, iy - 1, 401, 3);
}
public boolean mouseDown(Event evt, int mx, int my)
{
int j;
double ox, oy, nx, ny;
double omega, m, bb, x0, x1;
for (int i = 10; i < 421; i = i + 20)
{
if ((my > 9) && (my < 211) && (mx >= i - 2) && (mx < i + 6))
{
n = 0;
j = (int) java.lang.Math.floor(mx/20.0);
if (j == 20)
{
j = 0;
}
a[j] = (110.0 - my)/60.0;
drawback();
sG.drawImage(cI, 0, 0, this);
}
if ((my > 9) && (my < 211) && (mx <= i + 2) && (mx > i - 6))
{
n = 0;
j = (int) java.lang.Math.floor(mx/20.0);
j = j - 1;
if (j == -1)
{
j = 19;
}
b[j] = (110.0 - my)/60.0;
drawback();
sG.drawImage(cI, 0, 0, this);
}
}
if(my > 215)
{
if ((mx < 110) || (mx > 310))
{
n = 0;
drawback();
}
cG.drawImage(bI, 0, 0, this);
omega = n + 1;
u[n] = 0.0;
v[n] = 0.0;
x1 = -3.1416;
for (int k = 0; k < 20; k = k + 1)
{
x0 = x1;
x1 = x1 + 3.1416/10.0;
m = (b[k] - a[k])/(3.1416/10.0);
bb = a[k] - m * x0;
u[n] = u[n] -
(m * java.lang.Math.cos(omega * x0) +
bb * omega * java.lang.Math.sin(omega * x0) +
m * omega * x0 * java.lang.Math.sin(omega * x0))/(omega * omega) +
(m * java.lang.Math.cos(omega * x1) +
bb * omega * java.lang.Math.sin(omega * x1) +
m * omega * x1 * java.lang.Math.sin(omega * x1))/(omega * omega);
v[n] = v[n] +
(bb * omega * java.lang.Math.cos(omega * x0) +
m * omega * x0 * java.lang.Math.cos(omega * x0) -
m * java.lang.Math.sin(omega * x0))/(omega * omega) -
(bb * omega * java.lang.Math.cos(omega * x1) +
m * omega * x1 * java.lang.Math.cos(omega * x1) -
m * java.lang.Math.sin(omega * x1))/(omega * omega);
}
u[n] = u[n] / 3.1416;
v[n] = v[n] / 3.1416;
n = n + 1;
nx = -3.1416;
ny = sum;
for (int jj = 0; jj < n; jj = jj + 1)
{
ny = ny + u[jj] * java.lang.Math.cos((jj + 1) * nx) +
v[jj] * java.lang.Math.sin((jj + 1) * nx);
}
for (int k = 10; k < 407; k = k + 5)
{
ox = nx;
nx = ox + 3.1416/40.00;
oy = ny;
ny = sum;
for (int jj = 0; jj < n; jj = jj + 1)
{
ny = ny + u[jj] * java.lang.Math.cos((jj + 1) * nx) +
v[jj] * java.lang.Math.sin((jj + 1) * nx);
}
bG.setColor(pale);
bG.drawLine(k, yscale(oy), k + 5, yscale(ny));
cG.setColor(red);
for (int dx = -1; dx < 2; dx = dx + 1)
{
for (int dy = -1; dy < 2; dy = dy + 1)
{
cG.drawLine(k + dx, yscale(oy) + dy,
k + 5 + dx, yscale(ny) + dy);
}
}
}
sG.drawImage(cI, 0, 0, this);
}
return true;
}
}
Copyright c 1995 by
Frank Wattenberg, Department of Mathematics, Montana State University,
Bozeman, MT 59717