Welcome, guest | Sign In | My Account | Store | Cart

Color-cycling plasma fractal applet.

Java, 120 lines
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// <applet code="Plasma" width=800 height=600></applet>
// FB - 201003265
// Color-Cycling Plasma Fractal
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;

public class Plasma extends Applet
{
  Image img;
  // pix will hold the actual image data
  // mat will hold the image data of palette colors
  int pix[], mat[];
  int red[],green[],blue[];
  int w,h,inc;
  float roughness;
  long ctm;

  public void adjust(int xa,int ya,int x,int y,int xb,int yb)
  {
    int c,d;
    if(mat[w*y+x]==0)
    {
      d=(int)(Math.abs(xa-xb)+Math.abs(ya-yb));
      c=(mat[w*ya+xa]+mat[w*yb+xb])/2+(int)((Math.random()-0.5)*d*roughness);
      c=((int)Math.abs(c))%256;
      mat[w*y+x]=c;
    }
  }

  public void subdivide(int x1,int y1,int x2,int y2)
  {
    int x,y;
    if(!((x2-x1<2) && (y2-y1<2)))
    {
      x=(x1+x2)/2;y=(y1+y2)/2;
      adjust(x1,y1,x,y1,x2,y1);adjust(x2,y1,x2,y,x2,y2);
      adjust(x1,y2,x,y2,x2,y2);adjust(x1,y1,x1,y,x1,y2);
      if(mat[w*y+x]==0)
      {
        mat[w*y+x]=(mat[w*y1+x1]+mat[w*y1+x2]+mat[w*y2+x2]+mat[w*y2+x1])/4;
      }
      subdivide(x1,y1,x,y);subdivide(x,y1,x2,y);
      subdivide(x,y,x2,y2);subdivide(x1,y,x,y2);
    }
  }

  public void init()
  {
    // create a color palette (RGBY)
    red=new int[256];green=new int[256];blue=new int[256];
    for(int i=0;i<256;i++)
    {
        switch((int)(i/64))
        {
            case 0:
                red[i]=(i%64)*3+64;
                green[i]=0;
                blue[i]=0;
                break;
            case 1:
                red[i]=0;
                green[i]=(i%64)*3+64;
                blue[i]=0;
                break;
            case 2:
                red[i]=0;
                green[i]=0;
                blue[i]=(i%64)*3+64;
                break;
            case 3:
                red[i]=(i%64)*3+64;
                green[i]=(i%64)*3+64;
                blue[i]=0;
                break;
        }
    }

    ctm=System.currentTimeMillis();
    inc=(int)(Math.random()*7+1)*((int)(Math.random()*2)*2-1);
    roughness=(float)Math.random()*6+1;
    w=getSize().width;h=getSize().height;
    pix=new int[w*h]; mat=new int[w*h];

    // put random color pixels to the 4 corners
    for(int y=0;y<2;y++)
      for(int x=0;x<2;x++)
        mat[w*y*(h-1)+x*(w-1)]=(int)(Math.random()*256);
    
    subdivide(0,0,w-1,h-1);
  }

  public void paint(Graphics g)
  {
    int c;
    int alpha=255;

    // restart the applet periodically
    if((System.currentTimeMillis()-ctm)>=10000) init();

    // keep the color-cycling speed constant between different PCs!
    long t=System.currentTimeMillis();
    while((System.currentTimeMillis()-t)<10) {;}

    // rotate the colors (the palette)
    for(int y=0;y<h;y++)
      for(int x=0;x<w;x++)
      {
        mat[w*y+x]=(mat[w*y+x]+inc+256)%256; c=mat[w*y+x];
        // convert image data of palette colors to actual image data
        pix[w*y+x]=(alpha<<24)|(red[c]<<16)|(green[c]<<8)|blue[c];
      }

    img=createImage(new MemoryImageSource(w,h,pix,0,w));
    g.drawImage(img,0,0,this);
    repaint();
  }

  public void update(Graphics g) { paint(g); } // no flickering!
}