media @ VU
[] readme course(s) preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthought(s) appendix reference(s) example(s) resource(s) _

talk show tell print

applet-math-fractal-mixing.jva

applet-math-fractal-mixing.jva / applet-math-fractal-mixing


  // Mixing,  Evgeny Demidov,  28 Aug 2003
  
  import java.awt.*;
  import java.awt.image.*;
  import java.awt.event.*;
  import java.util.StringTokenizer;
  
  public class applet-math-fractal-mixing extends java.applet.Applet implements MouseListener,
    KeyListener, ActionListener {
  double Yc=.0, Xc=-.5, dx=6.283, dy=dx, R=.3,  K=1, Pi=Math.PI, Pi2=Pi*2;
  int maxColor=96, N=1, w, h, w2, h2,  pixArr[];
  Image img;             IndexColorModel RainbowColor;
  Label     lbK, lbN;
  TextField tfXY, tfK, tfN;
  Button    btPl, btMn;
  
  public void init() {
    String s=getParameter("XYmidDelCD"); if (s != null) {
      StringTokenizer st = new StringTokenizer(s);
      Xc = Double.valueOf(st.nextToken()).doubleValue();
      Yc = Double.valueOf(st.nextToken()).doubleValue();
      dx = Double.valueOf(st.nextToken()).doubleValue();
      dy = Double.valueOf(st.nextToken()).doubleValue();}
    s=getParameter("K"); if (s != null) K = Double.valueOf(s).doubleValue();
    s=getParameter("R"); if (s != null) R = Double.valueOf(s).doubleValue();
    s=getParameter("N"); if (s != null) N=Integer.parseInt(s);
    s=getParameter("MaxColor"); if (s != null) maxColor=Integer.parseInt(s);
    int M=maxColor/3,  M2=2*M;  maxColor = 3*M;     // maxColor is 3*int
    long M4 = (long)M*M*M*M;
    byte rColor[] = new byte[maxColor+2], bColor[] = new byte[maxColor+2],
         gColor[] = new byte[maxColor+2];
    for (int i = 1; i < M2; i++){                   // set Color Map
      long dum = M - i;  dum *=dum;  dum *=dum;
      gColor[i] =  bColor[(i+M) % maxColor] = rColor[(i+M2) % maxColor] =
          (byte)(255 - (255*dum)/M4);}
    rColor[2] = gColor[2] = (byte)150; bColor[2] = (byte)255;
    rColor[maxColor] = gColor[maxColor] = bColor[maxColor] = (byte)255;
    RainbowColor = new IndexColorModel( 8, maxColor+2, rColor,gColor,bColor);
    w = getSize().width;   h = getSize().height;
    w2 = w/2;  h2 = h/2;
    pixArr = new int[w*h];
    this.setLayout( new FlowLayout(FlowLayout.LEFT, 0, 0) );
    tfXY = new TextField( ""+(float)Xc+" "+(float)Yc+"; "+(float)dx+
      " "+(float)dy, 30);   add(tfXY);
    lbK = new Label("K", Label.RIGHT); add(lbK);
    tfK = new TextField( "" + K, 4);   add(tfK);
    tfK.addKeyListener(this);
    lbN = new Label("N", Label.RIGHT); add(lbN);
    tfN = new TextField( "" + N, 2);   add(tfN);
    tfN.addKeyListener(this);
    btPl = new Button("+"); btPl.addActionListener(this); add(btPl);
    btMn = new Button("-"); btMn.addActionListener(this); add(btMn);
    Draw();
    addMouseListener(this);
  }
  
  public void destroy() {  removeMouseListener(this); }
  public void mouseClicked(MouseEvent e) {}      //1.1 event handling
  public void mousePressed(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent  e) {}
  
  public void mouseReleased(MouseEvent e) {
    Xc = Xc+(e.getX()-w2)*dx/w;
    Yc = Yc-(e.getY()-h2)*dx/w;
    if (e.isControlDown()){
      dy *= 2.; if (!e.isShiftDown()) dx *= 2.;}
    else {
      dy /= 2.; if (!e.isShiftDown()) dx /= 2.;}
    tfXY.setText( ""+(float)Xc+" "+(float)Yc+"; "+(float)dx+" "+(float)dy);
    Draw();
    repaint();
  }
  public void actionPerformed(ActionEvent e){
    if ( e.getActionCommand().equals("+") ) N++;
      else N--;
    tfN.setText(""+N);
    Draw();
    repaint();
  }
  public void keyTyped(KeyEvent e) {}
  public void keyPressed(KeyEvent e) {}
  public void keyReleased(KeyEvent e) {
    final int keyEnter = 10;
    if (e.getKeyCode() == keyEnter) {
      try{
        K = Double.valueOf(tfK.getText()).doubleValue();
        N = Integer.parseInt(tfN.getText());
        Draw();
        repaint();
      }catch ( NumberFormatException ne) {}
    }
    e.consume();
  }
  
  public void paint(Graphics g) {
    g.drawImage(img, 0, 0, this);
  }
  
  public void Draw(){
    for (int p = h*w; p > 0;) pixArr[--p] = maxColor;
    int pix, ix,iy;
    pix = 0;
    double X,Y, Xo,Yo;
    for (iy=0; iy < h; iy++) {
     Yo = Yc + (h2-iy)*dy/h;
     for (ix=0; ix < w; ix++){
      Xo = X = Xc + (ix-w2)*dx/w;  Y = Yo;
      if (N >=0){
       for(int i=N; i>0; i--){
         Y = Y + K*Math.sin(X);
         X = X + Y;
         while(X < -Pi) X += Pi2;
         while(X > Pi) X -= Pi2;
         }}
      else{
       for(int i=-N; i>0; i--){
         X = X - Y;
         Y = Y - K*Math.sin(X);
         while(X < -Pi) X += Pi2;
         while(X > Pi) X -= Pi2;}}
      if((Math.abs(Xo) < R)&&(Math.abs(Yo) < R)) pixArr[pix] = 2;
      if((Math.abs(X) < R)&&(Math.abs(Y) < R)) pixArr[pix] = 1;
      pix++;}
    }
  //System.out.println(""+Xc +"  "+Yc);
    img = createImage(new MemoryImageSource(w, h, RainbowColor, pixArr, 0, w));
  }
  
  }
  


(C) A. Eliëns 2/9/2007

You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.