/* 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); } }