// correlated noise,  Evgeny Demidov, 8 Feb 2002
import java.awt.*;
import java.awt.event.*;
public class noise extends java.applet.Applet
 implements ItemListener, ActionListener{
  int  n = 300, n1 = n-1, Rc = 32, w, h, h2, h0, lbSize = 50;
  double p[], p1[];
  Choice chRc;    Label lbRc;    Button btNew;

public void init() {
  w = getSize().width;
  h = getSize().height - lbSize;  h2 = h/2; h0 = h2 + lbSize;
  p = new double[n];     p1 = new double[n];
  for (int i = 0; i < n; i++) p[i] = 2*Math.random() - 1;
//    p[150] = 1;
  String s=getParameter("Rc"); if (s != null) Rc = Integer.parseInt(s);
  lbRc = new Label("Rc", Label.RIGHT);  add(lbRc);
  chRc = new Choice();
  for (int i = 0, r = 1; i < 8; i++){
    chRc.addItem(Integer.toString(r));  r *= 2;}
  chRc.select("" + Rc);  chRc.addItemListener(this);  add(chRc);
  btNew = new Button("New");   btNew.addActionListener(this);
  add(btNew);
  averaging();
}
public void averaging(){
  double a = .5/Math.sqrt(2*Rc+1);
//  for (int i = 0; i < Rc; i++)  p1[i] = p1[n1 - i] = 0;
  for (int i = Rc; i < n-Rc; i++){
    double sum = 0;
    for (int j = -Rc; j <= Rc; j++) sum += p[i+j];
    p1[i] = a*sum;}
}

public void paint(Graphics g) {
  g.setColor(Color.white);   g.fillRect(0, 0, w, h+lbSize);
  g.setColor(Color.black);   g.drawLine(0,h0 ,w,h0);
  int x = 0, x0 = 0, y, y0 = (int)(h2*p[0]) + h0;
  g.setColor(new Color(200,200,255));
  for (int i = 1; i < n; i++){
    x += 2;  y = (int)(h2*p[i]) + h0;
    g.drawLine(x0,y0 ,x,y);
    x0 = x;  y0 = y;}
  g.setColor(Color.red);
  x = x0 = 2*Rc;  y0 = (int)(h2*p1[Rc]) + h0;
  for (int i = Rc+1; i < n-Rc; i++){
    x += 2;  y = (int)(h2*p1[i]) + h0;
    g.drawLine(x0,y0 ,x,y);
    x0 = x;  y0 = y;}
}

public void itemStateChanged(ItemEvent e){
  Rc = Integer.parseInt(chRc.getSelectedItem());
  averaging();
  repaint();
}
public void actionPerformed(ActionEvent e){
  for (int i = 0; i < n; i++) p[i] = 2*Math.random() - 1;
  averaging();
  repaint();
}
public void update(Graphics g){ paint(g); }
}
