import java.applet.Applet; import java.awt.*; public class model3D extends Applet implements Runnable { public Point left_origin = null; public Point right_origin = null; Triplet left_points = null; Triplet right_points = null; Thread kicker = null; boolean initialized=false; ExCanvas left, right; Modeler pad; boolean wait_for_left_org = true; boolean wait_for_right_org = true; boolean wait_for_right = true; boolean wait_for_left = true; int temp_px = 0; int temp_py = 0; int xa = -40; int xb = 40; int plane = 1000; int iodis = 20; int org_xl = 0; int org_xr = 0; int org_y = 0; Image i_left; Image i_right; Image point; Image highlight; Image origin; public void start() { if (kicker==null) { kicker=new Thread(this); } kicker.start(); } public void run() { if (!initialized) { MediaTracker tracker = new MediaTracker(this); i_left = getImage(getDocumentBase(), "toy-left.gif"); tracker.addImage(i_left, 0); i_right = getImage(getDocumentBase(), "toy-right.gif"); tracker.addImage(i_right, 0); origin = getImage(getDocumentBase(), "origin.gif"); tracker.addImage(origin, 0); point = getImage(getDocumentBase(), "point.gif"); tracker.addImage(point, 0); highlight = getImage(getDocumentBase(), "point-select.gif"); tracker.addImage(highlight, 0); try { tracker.waitForID(0); } catch (InterruptedException e) {} left = new ExCanvas(i_left, origin, point, highlight, this); right = new ExCanvas(i_right, origin, point, highlight, this); pad = new Modeler(); initialized=true; } left = new ExCanvas(i_left, origin, point, highlight, this); right = new ExCanvas(i_right, origin, point, highlight, this); pad = new Modeler(); add(left); add(right); add(pad); layout(); } public void deliver_point(ExCanvas caller, int mx, int my) { if (caller==left) { if (wait_for_right_org) { wait_for_left_org = false; temp_px = mx; temp_py = my; } else if (wait_for_left_org) { wait_for_left_org = false; left.getPoints(); right.getPoints(); pad.setOrigin(0, 0); org_xl = mx; org_xr = temp_px; org_y = my; } else if (wait_for_right) { wait_for_left = false; temp_px = mx; temp_py = my; } else { addPoint(pad, mx-org_xl, temp_px-org_xr, my-org_y); wait_for_left=true; wait_for_right=true; left.getPoints(); right.getPoints(); } } else { if (wait_for_left_org) { wait_for_right_org = false; temp_px = mx; temp_py = my; } else if (wait_for_right_org) { wait_for_right_org = false; left.getPoints(); right.getPoints(); pad.setOrigin(0, 0); org_xl = temp_px; org_xr = mx; org_y = temp_py; } else if (wait_for_left) { wait_for_right = false; temp_px = mx; temp_py = my; } else { addPoint(pad, temp_px-org_xl, mx-org_xr, my-org_y); wait_for_left=true; wait_for_right=true; left.getPoints(); right.getPoints(); } } if (wait_for_left&&wait_for_right) { pad.repaint(); } } public void addPoint(Modeler m, int xf, int xs, int my) { double m1 = ((double) plane) / ((double)(xf+iodis)); double b1 = -m1*((double) xf); double m2 = ((double) plane) / ((double)(xs-iodis)); double b2 = -m2*((double) xs); double d = -m2 + m1; double new_x = (b2-b1)/d; double new_z = (-b1*m2+b2*m1)/d; //System.out.println(xf+" "+xs+" "+my+" : "+new_x+" "+my+" "+new_z+" : "+m1+" "+b1+" "+m2+" "+b2); m.addPoint((int) new_x, my, (int) new_z); } public void stop() { remove(left); remove(right); remove(pad); wait_for_left_org = true; wait_for_right_org = true; wait_for_right = true; wait_for_left = true; if (kicker!=null) { if (kicker.isAlive()) {kicker.stop();} kicker = null; } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { if (!initialized) { g.drawString("Loading images... Please wait...", size().width/2-75, size().height/2); } else { super.paint(g); } } public void layout() { super.layout(); if (left!=null && right!=null) { left.layout(); right.layout(); } } }