/* * Arm.java (requires Java 1.2+) */ import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.*; import java.util.*; class MyImage extends BufferedImage { MyImage(int x, int y, int type) { super(x, y, type); } public void draw() { } // Damn compiler wouldn't let me declare it abstract } class MyCanvas extends Component { MyImage image; int w, h; MyCanvas(MyImage _image) { image= _image; w = image.getWidth(null); h = image.getHeight(null); setSize(w, h); } public void paint(Graphics g) { //System.out.println("MyCanvas.paint()"); g.drawImage(image, 0, 0, w, h, null); } public MyImage getImage() { return image; } } //------------------------------------------------------------------------------------------- // A vector object positioned and oriented in space class VecObj { Vector lines; VecObj parent; double anchorpos[]; double orientrads[]; double childAttPt[]; // point in local object coords where a child would attach // Scratch values for faster processing... double rotx_cosine, rotx_sine; double roty_cosine, roty_sine; double rotz_cosine, rotz_sine; class line { double p0[]; double p1[]; Color color; line(double _p0[], double _p1[], Color _color) { p0= new double[3]; p0[0]= _p0[0]; p0[1]= _p0[1]; p0[2]= _p0[2]; p1= new double[3]; p1[0]= _p1[0]; p1[1]= _p1[1]; p1[2]= _p1[2]; color = _color; } } VecObj(VecObj _parent) { System.gc(); lines= new Vector(); anchorpos = new double[3]; anchorpos[0]= 0; anchorpos[1]= 0; anchorpos[2]= 0; orientrads= new double[3]; orientrads[0]= 0; orientrads[1]= 0; orientrads[2]= 0; parent= _parent; childAttPt= null; } VecObj() { this((VecObj)null); } public double[] getChildAttPt() { return childAttPt; } public void setChildAttPt(double _pt[]) { childAttPt= _pt; } final public VecObj getParent() { return parent; } final void addLine(double[] p0, double[] p1, Color color) { line l= new line(p0, p1, color); lines.addElement(l); } public final void setAnchorPos(double x, double y, double z) { anchorpos[0]= x; anchorpos[1]= y; anchorpos[2]= z; } public final void setOrient(double x, double y, double z) { orientrads[0]= x; orientrads[1]= y; orientrads[2]= z; } public final void rotateBy(double x, double y, double z) { orientrads[0]+= x; orientrads[1]+= y; orientrads[2]+= z; } public final void translateBy(double x, double y, double z) { anchorpos[0]+= x; anchorpos[1]+= y; anchorpos[2]+= z; } // Apply rotation and translation... protected final void rotate_and_translate(double[] pt, double ret[]) { double x2, y2, z2; ret[0]= pt[0]; ret[1]= pt[1]; ret[2]= pt[2]; // Rotate about X axis x2= ret[0]; y2= (ret[1]*rotx_cosine) + (ret[2]*rotx_sine); z2= -(ret[1]*rotx_sine) + (ret[2]*rotx_cosine); ret[0]= x2; ret[1]= y2; ret[2]= z2; // Rotate about Y axis x2= (ret[0]*roty_cosine) + (ret[2]*roty_sine); y2= ret[1]; z2= -(ret[0]*roty_sine) + (ret[2]*roty_cosine); ret[0]= x2; ret[1]= y2; ret[2]= z2; // Rotate about Z axis x2= (ret[0]*rotz_cosine) + (ret[1]*rotz_sine); y2= -(ret[0]*rotz_sine) + (ret[1]*rotz_cosine); z2= ret[2]; ret[0]= x2; ret[1]= y2; ret[2]= z2; if (parent== null) { // Translate to desired position... ret[0]+= anchorpos[0]; ret[1]+= anchorpos[1]; ret[2]+= anchorpos[2]; } else { // Move to end of parent arm... double ipt[] = new double[3]; // Scratch // Convert from local coords to parent-relative coords... double[] attpt= parent.getChildAttPt(); ipt[0]= ret[0]+ attpt[0]; ipt[1]= ret[1]+ attpt[1]; ipt[2]= ret[2]+ attpt[2]; // Convert from parent-relative coords to absolute coords... parent.rotate_and_translate(ipt, ret); // Note recursion } } protected final void perspectiveProject(double[] pt) { double dist= 600; double z= pt[2]; z+= dist; if (z< 1) z= 1; // avoid divide-by-zero double scale= (600-(400/2))/z; pt[0]*= scale; pt[1]*= scale; } final void draw(Graphics g) { // Precompute some values we'll use repeatedly: int w2= 400/2; int h2= 400/2; rotx_cosine= Math.cos(orientrads[0]); rotx_sine= Math.sin(orientrads[0]); roty_cosine= Math.cos(orientrads[1]); roty_sine= Math.sin(orientrads[1]); rotz_cosine= Math.cos(orientrads[2]); rotz_sine= Math.sin(orientrads[2]); double p0[]= new double[3]; double p1[]= new double[3]; for (int i=0; i