/* This is the source code for the Holographic Formula Calculator /* Written by Adam Fields for CS6998 Synthetic 3D Imaging at Columbia /* University. Permission is given to use, distribute, or modify this /* source code as long as this comment block remains in the code. */ import java.awt.*; import java.applet.*; public class holo extends Applet { selector controls = new selector(); win calc; values valuebar; public void init() { resize(800, 800); setLayout(new BorderLayout()); calc = new win(valuebar); valuebar = new values(calc); add("Center", calc); add("North", controls); add("South", valuebar); } public boolean handleEvent(Event e) { switch (e.id) { case Event.WINDOW_DESTROY: System.exit(0); return true; default: return false; } } } class degMath extends Object { public static double sin(double a) { double temp; a = a * Math.PI / 180; temp = Math.sin(a); temp = temp * 180 / Math.PI; return temp; } public static double cos(double a) { double temp; a = a * Math.PI / 180; temp = Math.cos(a); temp = temp * 180 / Math.PI; return temp; } public static double asin(double a) { double temp; a = a * Math.PI / 180; temp = Math.asin(a); temp = temp * 180 / Math.PI; return temp; } public static double atan(double a) { double temp; a = a * Math.PI / 180; temp = Math.atan(a); temp = temp * 180 / Math.PI; return temp; } } class selector extends Panel { static Choice mode = new Choice(); public selector() { mode.addItem("Virtual Image Position"); mode.addItem("Reference Beam Position"); mode.addItem("Object Beam Position"); mode.addItem("Illumination Beam Position"); this.add(mode); } } class win extends Panel { values target; realCanvas realpane = new realCanvas(target); virtCanvas virtpane = new virtCanvas(target); public win(values target) { setLayout(new GridLayout(1, 2)); realpane.resize(100, 100); realpane.setBackground(Color.blue); this.add(realpane); virtpane.resize(100, 100); virtpane.setBackground(Color.red); this.add(virtpane); } public boolean redraw() { virtpane.repaint(); realpane.repaint(); return true; } } class virtCanvas extends Canvas { static double ibeam[] = {2,-25,0,0,740,0,0}; static int ibeamxy[] = {0,0}; static double vobj[] = {0,0,0,0,0,0}; static int vobjxy[] = {0,0}; static int moving_point = 0; Rectangle r; int origin_x; int origin_y; values targ; public virtCanvas(values targ) { ibeam[2] = (ibeam[0] * degMath.cos(ibeam[1])); ibeam[3] = (ibeam[0] * degMath.sin(ibeam[1])); virtCanvas.vobj[0] = (1 / ((virtCanvas.ibeam[4] / realCanvas.rbeam[4]) * (1 / realCanvas.obeam[0] - 1 / realCanvas.rbeam[0]) + 1/virtCanvas.ibeam[0])); virtCanvas.vobj[1] = degMath.asin( (degMath.sin(realCanvas.obeam[1]) - degMath.sin(realCanvas.rbeam[1])) * (virtCanvas.ibeam[4] / realCanvas.rbeam[4]) + degMath.sin(virtCanvas.ibeam[1])); } public void paint(Graphics g) { r = bounds(); origin_x = r.width / 2; origin_y = r.height / 2; ibeam[2] = (ibeam[0] * degMath.cos(ibeam[1])); ibeam[3] = (ibeam[0] * degMath.sin(ibeam[1])); vobj[2] = (vobj[0] * degMath.cos(vobj[1])); vobj[3] = (vobj[0] * degMath.sin(vobj[1])); ibeamxy[0] = origin_x - (int) ibeam[2]; ibeamxy[1] = origin_y + (int) ibeam[3]; vobjxy[0] = origin_x - (int) vobj[2]; vobjxy[1] = origin_y + (int) vobj[3]; g.setColor(Color.green); g.drawLine(0, origin_y, r.width, origin_y); g.drawLine(origin_x, 0, origin_x, r.height); g.setColor(Color.blue); g.drawRect(0, 0, r.width, r.height); g.setColor(Color.white); g.drawLine(origin_x, origin_y, origin_x - (int) ibeam[2], origin_y + (int) ibeam[3]); g.drawLine(origin_x, origin_y, origin_x - (int) vobj[2], origin_y + (int) vobj[3]); g.drawOval(origin_x - (int) ibeam[2] - 3, origin_y + (int) ibeam[3] - 3, 6, 6); g.drawOval(origin_x - (int) vobj[2] - 3, origin_y + (int) vobj[3] - 3, 6, 6); g.setColor(Color.yellow); g.drawString("ill (" + (-1 * (int) ibeam[2]) + "," + (-1 * (int) ibeam[3]) + ")", origin_x - (int) ibeam[2] - 5, origin_y + (int) ibeam[3] - 5); g.drawString("virt (" + (-1 * (int) vobj[2]) + "," + (-1 * (int) vobj[3]) + ")", origin_x - (int) vobj[2] - 5, origin_y + (int) vobj[3] - 5); } private int getPoint(int a, int b) { if (a == ibeamxy[0] && b == ibeamxy[1]) return 1; else if (a == vobjxy[0] && b == vobjxy[1]) return 2; else return 0; } public boolean handleEvent(Event e) { switch (e.id) { case Event.MOUSE_DOWN: switch (getPoint(e.x, e.y)) { case 0: return false; // Illumination Beam case 1: moving_point = 1; break; // Virtual Object case 2: moving_point = 2; break; } case Event.MOUSE_UP: if (moving_point == 0) return false; else if (moving_point == 1) { ibeam[1] = degMath.atan((double)ibeamxy[1] / (double)ibeamxy[0]); ibeam[0] = (double)ibeamxy[0] / degMath.sin(ibeam[1]); repaint(); targ.repaint(); moving_point = 0; } else if (moving_point == 2) { vobj[1] = degMath.atan((double)vobjxy[1] / (double)vobjxy[0]); vobj[0] = (double)vobjxy[0] / degMath.sin(vobj[1]); repaint(); targ.repaint(); moving_point = 0; } break; case Event.MOUSE_DRAG: if (moving_point == 0) return false; else if (moving_point == 1) { ibeam[1] = degMath.atan((double)ibeamxy[1] / (double)ibeamxy[0]); ibeam[0] = (double)ibeamxy[0] / degMath.sin(ibeam[1]); targ.repaint(); repaint(); } else if (moving_point == 2) { vobj[1] = degMath.atan((double)vobjxy[1] / (double)vobjxy[0]); vobj[0] = (double)vobjxy[0] / degMath.sin(vobj[1]); targ.repaint(); repaint(); } break; } return true; } } class realCanvas extends Canvas { static double rbeam[] = {3,-20,0,0,740}; static double obeam[] = {4,45,0,0}; Rectangle r; int origin_x; int origin_y; values targ; public realCanvas(values targ) { rbeam[2] = rbeam[0] * degMath.cos(rbeam[1]); rbeam[3] = rbeam[0] * degMath.sin(rbeam[1]); obeam[2] = obeam[0] * degMath.cos(obeam[1]); obeam[3] = obeam[0] * degMath.sin(obeam[1]); } public void paint(Graphics g) { r = bounds(); origin_x = r.width / 2; origin_y = r.height / 2; rbeam[2] = rbeam[0] * degMath.cos(rbeam[1]); rbeam[3] = rbeam[0] * degMath.sin(rbeam[1]); obeam[2] = obeam[0] * degMath.cos(obeam[1]); obeam[3] = obeam[0] * degMath.sin(obeam[1]); g.setColor(Color.green); g.drawLine(0, origin_y, r.width, origin_y); g.drawLine(origin_x, 0, origin_x, r.height); g.setColor(Color.blue); g.drawRect(0, 0, r.width, r.height); g.setColor(Color.white); g.drawLine(origin_x, origin_y, origin_x - (int) rbeam[2], origin_y + (int) rbeam[3]); g.drawLine(origin_x, origin_y, origin_x - (int) obeam[2], origin_y + (int) obeam[3]); g.drawOval(origin_x - (int) rbeam[2] - 3, origin_y + (int) rbeam[3] - 3, 6, 6); g.drawOval(origin_x - (int) obeam[2] - 3, origin_y + (int) obeam[3] - 3, 6, 6); g.setColor(Color.yellow); g.drawString("ref (" + (-1 * (int) rbeam[2]) + "," + (-1 * (int) rbeam[3]) + ")", origin_x - (int) rbeam[2] - 5, origin_y + (int) rbeam[3] - 5); g.drawString("obj (" + (-1 * (int) obeam[2]) + "," + (-1 * (int) obeam[3]) + ")", origin_x - (int) obeam[2] - 5, origin_y + (int) obeam[3] - 5); } } class values extends Panel { Label r_R_label = new Label("Reference Beam R"); TextField r_R_text = new TextField("" + realCanvas.rbeam[0]); Label r_T_label = new Label("Reference Beam >"); TextField r_T_text = new TextField("" + realCanvas.rbeam[1]); Label r_L_label = new Label("Reference Beam Lambda"); TextField r_L_text = new TextField("" + realCanvas.rbeam[4]); Label o_R_label = new Label("Object Beam R"); TextField o_R_text = new TextField("" + realCanvas.obeam[0]); Label o_T_label = new Label("Object Beam >"); TextField o_T_text = new TextField("" + realCanvas.obeam[1]); Label i_R_label = new Label("Illumination Beam R"); TextField i_R_text = new TextField("" + virtCanvas.ibeam[0]); Label i_T_label = new Label("Illumination Beam >"); TextField i_T_text = new TextField("" + virtCanvas.ibeam[1]); Label i_L_label = new Label("Illumination Beam Lambda"); TextField i_L_text = new TextField("" + virtCanvas.ibeam[4]); Label v_R_label = new Label("Virtual Image R"); TextField v_R_text = new TextField("" + virtCanvas.vobj[0]); Label v_T_label = new Label("Virtual Image >"); TextField v_T_text = new TextField("" + virtCanvas.vobj[1]); Label blank_label = new Label(""); Label blank_label2 = new Label(""); Label blank_label3 = new Label(""); Label blank_label4 = new Label(""); Label blank_label5 = new Label(""); win target; public values(win target) { setLayout(new GridLayout(5,6)); this.add(r_R_label); this.add(r_T_label); this.add(r_L_label); this.add(i_R_label); this.add(i_T_label); this.add(i_L_label); this.add(r_R_text); this.add(r_T_text); this.add(r_L_text); this.add(i_R_text); this.add(i_T_text); this.add(i_L_text); this.add(o_R_label); this.add(o_T_label); this.add(blank_label2); this.add(blank_label); this.add(v_R_label); this.add(v_T_label); this.add(o_R_text); this.add(o_T_text); this.add(blank_label3); this.add(blank_label4); this.add(v_R_text); this.add(v_T_text); this.add(blank_label5); this.add(new Button("Recalculate")); this.add(new Button("Reset")); this.target = target; } public void paint(Graphics g) { r_R_text.setText("" + realCanvas.rbeam[0]); r_T_text.setText("" + realCanvas.rbeam[1]); r_L_text.setText("" + realCanvas.rbeam[4]); o_R_text.setText("" + realCanvas.obeam[0]); o_T_text.setText("" + realCanvas.obeam[1]); i_R_text.setText("" + virtCanvas.ibeam[0]); i_T_text.setText("" + virtCanvas.ibeam[1]); i_L_text.setText("" + virtCanvas.ibeam[4]); v_R_text.setText("" + virtCanvas.vobj[0]); v_T_text.setText("" + virtCanvas.vobj[1]); } public boolean action(Event e, Object o) { if (o.equals("Recalculate")) { realCanvas.rbeam[0] = Double.valueOf(r_R_text.getText()).doubleValue(); realCanvas.rbeam[1] = Double.valueOf(r_T_text.getText()).doubleValue(); realCanvas.rbeam[4] = Double.valueOf(r_L_text.getText()).doubleValue(); realCanvas.obeam[0] = Double.valueOf(o_R_text.getText()).doubleValue(); realCanvas.obeam[1] = Double.valueOf(o_T_text.getText()).doubleValue(); virtCanvas.ibeam[0] = Double.valueOf(i_R_text.getText()).doubleValue(); virtCanvas.ibeam[1] = Double.valueOf(i_T_text.getText()).doubleValue(); virtCanvas.ibeam[4] = Double.valueOf(i_L_text.getText()).doubleValue(); virtCanvas.vobj[0] = Double.valueOf(v_R_text.getText()).doubleValue(); virtCanvas.vobj[1] = Double.valueOf(v_T_text.getText()).doubleValue(); switch (selector.mode.getSelectedIndex()) { case 0: virtCanvas.vobj[0] = (1 / ((virtCanvas.ibeam[4] / realCanvas.rbeam[4]) * (1 / realCanvas.obeam[0] - 1 / realCanvas.rbeam[0]) + 1/virtCanvas.ibeam[0])); virtCanvas.vobj[1] = degMath.asin( (degMath.sin(realCanvas.obeam[1]) - degMath.sin(realCanvas.rbeam[1])) * (virtCanvas.ibeam[4] / realCanvas.rbeam[4]) + degMath.sin(virtCanvas.ibeam[1])); break; case 1: realCanvas.rbeam[0] = (1 / (-1 * (((realCanvas.rbeam[4] / virtCanvas.ibeam[4]) * (1 / virtCanvas.vobj[0] - 1 / virtCanvas.ibeam[0])) - 1 / realCanvas.obeam[0]))); realCanvas.rbeam[1] = degMath.asin(-1 * (((degMath.sin(virtCanvas.vobj[1]) - degMath.sin(virtCanvas.ibeam[1])) * (realCanvas.rbeam[4] / virtCanvas.ibeam[4])) - degMath.sin(realCanvas.obeam[1]))); break; case 2: realCanvas.obeam[0] = (1 / (((realCanvas.rbeam[4] / virtCanvas.ibeam[4]) * (1 / virtCanvas.vobj[0] - 1 / virtCanvas.ibeam[0])) + 1 / realCanvas.rbeam[0])); realCanvas.obeam[1] = degMath.asin( ((degMath.sin(virtCanvas.vobj[1]) - degMath.sin(virtCanvas.ibeam[1])) * (realCanvas.rbeam[4] / virtCanvas.ibeam[4])) + degMath.sin(realCanvas.rbeam[1])); break; case 4: virtCanvas.ibeam[0] = (-1 * (1 / (((virtCanvas.ibeam[4] / realCanvas.rbeam[4]) * (1 / realCanvas.obeam[0] - 1 / realCanvas.rbeam[0])) - 1 / virtCanvas.vobj[0]))); virtCanvas.ibeam[1] = degMath.asin( degMath.sin(virtCanvas.vobj[1]) - ((degMath.sin(realCanvas.obeam[1]) - degMath.sin(realCanvas.rbeam[1])) * (virtCanvas.ibeam[4] / realCanvas.rbeam[4]))); break; } repaint(); target.redraw(); } else if (o.equals("Reset")) { realCanvas.rbeam[0] = 3; realCanvas.rbeam[1] = -20; realCanvas.rbeam[4] = 740; realCanvas.obeam[0] = 4; realCanvas.obeam[1] = 45; virtCanvas.ibeam[0] = 2; virtCanvas.ibeam[1] = -25; virtCanvas.ibeam[4] = 740; virtCanvas.vobj[0] = (1 / ((virtCanvas.ibeam[4] / realCanvas.rbeam[4]) * (1 / realCanvas.obeam[0] - 1 / realCanvas.rbeam[0]) + 1/virtCanvas.ibeam[0])); virtCanvas.vobj[1] = degMath.asin( (degMath.sin(realCanvas.obeam[1]) - degMath.sin(realCanvas.rbeam[1])) * (virtCanvas.ibeam[4] / realCanvas.rbeam[4]) + degMath.sin(virtCanvas.ibeam[1])); repaint(); target.redraw(); } else return false; return true; } }