/*	SIRDS will make a Single Image Stereogram 5/18/99 Chris Thiel 	*/import java.awt.*;import java.applet.Applet;import java.io.*;import java.net.*;public class sirds extends Applet{					int colors[] = new int [256];		int x, y, s, left, right;	Color pix[]; // maximum x	int same[];	int Z[][];	String Title;	InputStream is = null;	Image img;	Graphics gr;		// default parameters	int dotColor = 0;	boolean stereogram=true;	String infile = null;	int numRows;	int numCols;	int f = 1; 			// doubling factor	int b = 0;			// number of border pixels		int DPI=72; 		// resolution: dots per inch	double mu = 1/3.0;  // distance  of viewer ratio 	int E = (int)(Math.round(2.5*DPI));			public int separation (int Z) {	//The farther the object Z=(-9..9),  the less the separation 		return (int)(Math.round((1-mu*Z)*E/(2-mu*Z)));	}	public void readFile(String infile) {		try{			try{            	is = new URL(getDocumentBase(), infile).openStream();             }catch(MalformedURLException ignored){}    		StreamTokenizer d = new StreamTokenizer(is);    		int i=0; int j=0;    		if  (d.nextToken() != d.TT_EOF) numCols = (int)(d.nval);    		if  (d.nextToken() != d.TT_EOF) numRows = (int)(d.nval);      		Z = new int [numCols+2*b][numRows+2*b];      		while (d.nextToken() != d.TT_EOF) {       			Z[j+b][i+b] = (int)(d.nval);        		j++;       		 	if (j == numCols){//next row        		  	j = 0;          			i++;       	 		}        		}    	}catch (IOException ignored) { }	}		public void setParameters(){		infile = getParameter("infile");		if ( infile == null) infile="bigman.txt";		String s = getParameter("2D");		if ( s == null) {			stereogram = true;		} else {			stereogram = false;		}		s = getParameter("DPI");		if (s == null) {			DPI = 72;		}else {			DPI = Integer.parseInt(s); 		}		s = getParameter("border");			if (s == null) {			b = 0;		}else {			b = Integer.parseInt(s); 		}		s = getParameter("factor");		if (s == null) {			f = 1;		}else {			f = Integer.parseInt(s); 		}		s = getParameter("color");		if (s == null) {			dotColor = 0;		}else {			dotColor = Integer.parseInt(s); 		}				DPI=DPI/f;		E = (int)(Math.round(2.5*DPI));			 	}	public void createSIRD( Graphics g) {			if (stereogram){			g.drawString( "Stereogram being initialized", 30, 30 );			g.drawString( "Data from "+infile+"  "+DPI+" DPI", 30, 50 );		  for ( y =0 ; y < numRows+2*b; y++) {		   	pix  = new Color[numCols+2*b];			same = new int[numCols+2*b];					for (x = 0; x < numCols+2*b; x++) same[x] = x;			//calc links for the depth			for ( x = 0; x < numCols+2*b; x++) {				s = separation ((int)(Z[x][y]));				left = x - (s/2);				right = left + s;				if ( 0 <= left && right < numCols){					int k;					for (k=same[left]; k != left && k != right; k=same[left])						if ( k < right)							left = k;						else {							left = right;							right = k;						}					same[left] = right;				}			}			// assign the colors									for (x = numCols+2*b-1; x >= 0; x--) {				if (same[x] == x ) pix [x] = RandomColor();				else pix[x] = pix[same[x]];				g.setColor(pix[x]);				g.fillRect( x*f, y*f, f, f);			}		  }		} if (!stereogram){			g.setColor(RandomColor());			 for ( y =0 ; y < numRows+2*b; y++) for (x = numCols+2*b-1; x >= 0; x--) {				if (!(Z[x][y]==0)) g.fillRect( x*f, y*f, f, f);			}			g.setColor(Color.black);			g.drawString( "Stereogram", 10, 10 );			g.drawString( "Data from "+infile+"  "+DPI+" DPI", 10, 25 );			g.drawString( "factor = "+f+", Border =  "+b+" pixels", 10, 40 );		}		}		public void init() {			//getParameter("imageName")		setParameters();								readFile(infile);			  	    	resize(f*(numCols+2*b),f*(numRows+2*b));		setBackground(Color.white);		img = createImage ( f*(numCols+2*b),f*(numRows+2*b));		gr = img.getGraphics();		createSIRD(gr);					}	public Color RandomColor () {		Color c = null;		switch (dotColor) {			case (1) :	// blue				c= new Color(5,				(int)(Math.random()*255),				(int)(Math.random()*255));				break;			case (2) : // purple				c= new Color(				(int)(Math.random()*255),				5,				(int)(Math.random()*255));				break;			case (3) : // yellow-green				c= new Color(				(int)(Math.random()*255),				(int)(Math.random()*255),				5);				break;			case (4) : // woody-red				c= new Color(				(int)(Math.random()*255),				(int)(Math.random()*100),5);				break;			default:  // tutti-fruti				c= new Color(				(int)(Math.random()*255),				(int)(Math.random()*255),				(int)(Math.random()*255));		}		return c;	}	public void paint( Graphics g ) {	 		g.drawImage(img, 0,0,null);	}}