/*
*/ import java.lang.*; import java.applet.*; import java.awt.*; import java.awt.image.*; public class F3 extends Applet { Image orig, contour; // the original and contour versions of the image int scrollint=0; int scrollintold=0; Timer timer= new Timer(this); Scrollbar s = new Scrollbar(Scrollbar.HORIZONTAL,10,10,0,255); int width=256,height=256; int decimal=0,fract=0,cont=0; int[] box1 = new int [256]; int[] box2 = new int [256]; int[] box3 = new int [256]; /** * Load the image. Create a new image that is a contour version of it, using * a FilteredImageSource, ImageProducer and a the ContourFilter class, below. */ public void init() { setLayout(new BorderLayout() ); orig = this.getImage(this.getCodeBase(), "galax.gif"); ImageFilter filter = new ContourFilter(20); ImageProducer producer = new FilteredImageSource(orig.getSource(), filter); contour = this.createImage(producer); add("North",s); timer.start(); fractInit(orig); } public void step() { scrollintold=scrollint; scrollint=s.getValue(); if(scrollint != scrollintold) { ImageFilter filter = new ContourFilter(scrollint); ImageProducer producer = new FilteredImageSource(orig.getSource(), filter); contour = this.createImage(producer); fractDim(scrollint); repaint(); } } public void fractDim(int i) { double bbb; bbb=(double) box2[i]/((double) box3[i]); bbb=Math.log(bbb)/Math.log(2); decimal=(int) bbb; bbb=( (bbb-(double) decimal)*100.+0.5); fract= (int) bbb; cont=i; } public void fractInit(Image im) { try { //grab pixels and precompute for fractDim int[] pgPixels = new int [width*height]; PixelGrabber pg = new PixelGrabber(im,0,0, width,height,pgPixels,0,width); if(pg.grabPixels() && ((pg.status() & ImageObserver.ALLBITS) !=0)) { int level=0; int max3,max2,max1,min3,min2,min1; int x,y; for(int iiii=0;iiii<(width>>3);iiii++){ for(int jjjj=0;jjjj<(height>>3);jjjj++){ min3=256;max3=0; for(int iii=0;iii<=1;iii++){ for(int jjj=0;jjj<=1;jjj++){ min2=256;max2=0; for(int ii=0;ii<=1;ii++){ for(int jj=0;jj<=1;jj++){ min1=256;max1=0; for(int i=0;i<=1;i++){ for(int j=0;j<=1;j++){ x=i+(ii<<1)+(iii<<2)+(iiii<<3); y=width*(j+(jj<<1)+(jjj<<2)+(jjjj<<3)); level=pgPixels[x+y]&0xff; max1=Math.max(max1,level); min1=Math.min(min1,level); // System.out.println(" "+level); // System.out.println(" "+x+" "+y+" "+level); } } // System.out.println(">"+max1+" "+min1); for(int m = min1; m<=max1;m++){ box1[m]++; } max2=Math.max(max1,max2); min2=Math.min(min1,min2); } } max3=Math.max(max3,max2); min3=Math.min(min3,min2); for(int m=min2;m<=max2;m++){ box2[m]++; } // System.out.println(">>"+max2+" "+min2); } } for(int m=min3;m<=max3;m++){ box3[m]++; } } } } }catch (InterruptedException e) {e.printStackTrace();} return; } /* override update to reduce flickering */ public void update(Graphics g){ g.setColor(getBackground()); g.fillRect(300,282,556,300); g.setColor(getForeground()); paint(g); } public void paint(Graphics g) { g.drawImage(orig, 25, 25, this); g.drawImage(contour, 300, 25, this); g.drawString("Fractal Dimension = "+decimal+"."+fract+" level= "+cont ,300,300); } } /** Filter an image by averaging its colors */ class ContourFilter extends RGBImageFilter { static int ilevel; public ContourFilter(int ilev) { canFilterIndexColorModel = true;ilevel=ilev; } public int filterRGB(int x, int y, int rgb) { int a = rgb & 0xff000000; int r = rgb & 0xff0000; int g = rgb & 0x00ff00; int b = rgb & 0x0000ff; int avg=((r>>16)+(g>>8)+b)/3; r=0; g=0; b=0; if(avg>ilevel) r=255<<16; if(avg==ilevel) g=255<<8; if(ilevel>avg) b=255; return a | r | g | b; } } class Timer extends Thread { F3 myapplet; public Timer(F3 myapplet){ this.myapplet=myapplet ; setPriority(MIN_PRIORITY); } public void run() { for(;;){ myapplet.step(); yield(); try{sleep(100L);} catch(InterruptedException e){;} } } } /**/