//Contains common 3D stuff import java.awt.*; import graphics.Matrix3D; import graphics.MatrixStack; public class ThreeDApplet extends BufferedApplet { long time0; double elapsed = 0; //# of seconds passed since start of applet int w, h; MatrixStack stack; //EXTEND THESE public void init() { super.init(); w = bounds().width; h = bounds().height; time0 = System.currentTimeMillis(); //start the clock stack = new MatrixStack(); } public void render(Graphics g) { elapsed = tick(); //set clock animate(); draw(g); animating = true; } //OVERRIDE THESE void draw(Graphics g) {} void animate() {} public void drawShape(Graphics g, graphics.Shape s) { //loop through each face for (int fi = 0; fi < s.numFaces(); fi++) { int[] face = s.getFace(fi); //copy from vertices to points double[][] points = new double[face.length][6]; for (int i = 0; i1, 1->2, 2->0) g.drawLine( x(triangle[0][0]), y(triangle[0][1]), x(triangle[1][0]), y(triangle[1][1]) ); g.drawLine( x(triangle[1][0]), y(triangle[1][1]), x(triangle[2][0]), y(triangle[2][1]) ); g.drawLine( x(triangle[2][0]), y(triangle[2][1]), x(triangle[0][0]), y(triangle[0][1]) ); } //draws quad as two triangles public void drawQuad(Graphics g, double[][] quad) { double[][] triangle = new double[3][3]; //3 points with 3 values each //(0->1, 1->2, 2->0) triangle[0] = quad[0]; //1st point of triangle triangle[1] = quad[1]; //2nd point of triangle triangle[2] = quad[2]; //3rd point of triangle drawTriangle(g, triangle); //(2->3, 3->0, 0->2) triangle[0] = quad[2]; //1st point of triangle triangle[1] = quad[3]; //2nd point of triangle triangle[2] = quad[0]; //3rd point of triangle drawTriangle(g, triangle); } //projection stuff int x(double t) { return w/2 + (int)(t*w/4); } int y(double t) { return h/2 - (int)(t*w/4); } //returns the number of seconds passed since start of applet private double tick() { long time = System.currentTimeMillis(); return (time - time0) / 1000.0; } //applies matrix at the top of the stack to a shape public void transform(graphics.Shape shape) { shape.matrix.copy(stack.peek()); shape.transform(); } //convenience methods for stack operations protected void push() { stack.push(); } protected Matrix3D pop() { return stack.pop(); } public void rotateX(double theta) { stack.peek().rotateX(theta); } public void rotateY(double theta) { stack.peek().rotateY(theta); } public void rotateZ(double theta) { stack.peek().rotateZ(theta); } public void translate(double x, double y, double z) { stack.peek().translate(x, y, z); } public void scale(double x, double y, double z) { stack.peek().scale(x, y, z); } }