import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Polygon; import java.awt.*; import java.util.Date; import java.lang.Math; import java.lang.*; public class rotating_cube extends java.applet.Applet implements Runnable { int Ix, Iy, xhome = 200, yhome = 200; double vx = 80.0, vy = 60.0, vz = 70.0, theta = -.5, omega = 1.3, alpha = -0.9; double box[][] = new double[8][3]; double cur_image_box[][] = new double[8][3]; final static int MAX_SURFACES = 6, NUM_SURFACES = 6, x=0, y=1, z=2; boolean continue_looping = true; final static double PI = 3.1415926, TWO_PI = 6.2831852; int surface[][] = new int[MAX_SURFACES][4]; Color surface_color[] = new Color[MAX_SURFACES]; Thread runner; // .... private boolean doubleBuffer=true; // or false of course private Image buf; // bitmap for double buffering private Graphics gBuf; // gc to draw on bitmap public void init() { double xoff = 0.0, yoff = 0.0, zoff = 0.0, xfactor = 80.5, yfactor = 80.5, zfactor = 80.5; // .... box[0][0] = (-1.0 + xoff) * xfactor; box[0][1] = (-1.0 + yoff) * yfactor; box[0][2] = (-1.0 + zoff) * zfactor; box[1][0] = (-1.0 + xoff) * xfactor; box[1][1] = (1.0 + yoff) * yfactor; box[1][2] = (-1.0 + zoff) * zfactor; box[2][0] = (1.0 + xoff) * xfactor; box[2][1] = (1.0 + yoff) * yfactor; box[2][2] = (-1.0 + zoff) * zfactor; box[3][0] = (1.0 + xoff) * xfactor; box[3][1] = (-1.0 + yoff) * yfactor; box[3][2] = (-1.0 + zoff) * zfactor; box[4][0] = (-1.0 + xoff) * xfactor; box[4][1] = (-1.0 + yoff) * yfactor; box[4][2] = (1.0 + zoff) * zfactor; box[5][0] = (-1.0 + xoff) * xfactor; box[5][1] = (1.0 + yoff) * yfactor; box[5][2] = (1.0 + zoff) * zfactor; box[6][0] = (1.0 + xoff) * xfactor; box[6][1] = (1.0 + yoff) * yfactor; box[6][2] = (1.0 + zoff) * zfactor; box[7][0] = (1.0 + xoff) * xfactor; box[7][1] = (-1.0 + yoff) * yfactor; box[7][2] = (1.0 + zoff) * zfactor; surface[0][0] = 1; surface[0][1] = 2; surface[0][2] = 3; surface[0][3] = 0; surface_color[0] = Color.black; surface[1][0] = 6; surface[1][1] = 5; surface[1][2] = 4; surface[1][3] = 7; surface_color[1] = Color.green; surface[2][0] = 0; surface[2][1] = 4; surface[2][2] = 5; surface[2][3] = 1; surface_color[2] = Color.blue; surface[3][0] = 2; surface[3][1] = 6; surface[3][2] = 7; surface[3][3] = 3; surface_color[3] = Color.red; surface[4][0] = 2; surface[4][1] = 1; surface[4][2] = 5; surface[4][3] = 6; surface_color[4] = Color.yellow; surface[5][0] = 3; surface[5][1] = 7; surface[5][2] = 4; surface[5][3] = 0; surface_color[5] = Color.white; if (doubleBuffer) { /* this is java 1.1 ---> */ Dimension dim = getSize(); // Dimension d = size(); // System.out.println("\n" + "getSize is " + d.width + " = width and height = " + d.height); // dim.width = 508; // d.height = 458; /* 102 Dimension d = size(); */ buf = createImage(dim.width, dim.height); gBuf = buf.getGraphics(); } } public void paint_polygons(Graphics g) { int cur_surface; double pt1_x, pt1_y, pt1_z, pt2_x, pt2_y, pt2_z, pt3_x, pt3_y, pt3_z, pt4_x, pt4_y, pt4_z; Polygon poly = new Polygon(); Polygon poly_2 = new Polygon(); Polygon poly_3 = new Polygon(); double poly_generic[][] = new double[4][3]; for (cur_surface = 0; cur_surface < NUM_SURFACES; cur_surface++) { if ( vector_cross_product(cur_image_box[ surface[cur_surface][0] ] [0] - cur_image_box[ surface[cur_surface][1] ] [0], cur_image_box[ surface[cur_surface][0] ] [1] - cur_image_box[ surface[cur_surface][1] ] [1], cur_image_box[ surface[cur_surface][0] ] [2] - cur_image_box[ surface[cur_surface][1] ] [2], cur_image_box[ surface[cur_surface][2] ] [0] - cur_image_box[ surface[cur_surface][1] ] [0], cur_image_box[ surface[cur_surface][2] ] [1] - cur_image_box[ surface[cur_surface][1] ] [1], cur_image_box[ surface[cur_surface][2] ] [2] - cur_image_box[ surface[cur_surface][1] ] [2] )) { /* poly.addPoint( (int) cur_image_box[ surface[cur_surface][0] ] [0], (int) cur_image_box[ surface[cur_surface][0] ] [1] ); poly.addPoint( (int) cur_image_box[ surface[cur_surface][1] ] [0], (int) cur_image_box[ surface[cur_surface][1] ] [1] ); poly.addPoint( (int) cur_image_box[ surface[cur_surface][2] ] [0], (int) cur_image_box[ surface[cur_surface][2] ] [1] ); poly.addPoint( (int) cur_image_box[ surface[cur_surface][3] ] [0], (int) cur_image_box[ surface[cur_surface][3] ] [1] ); */ poly_generic[0][x] = (cur_image_box[ surface[cur_surface][0] ] [0]) ; poly_generic[0][y] = (cur_image_box[ surface[cur_surface][0] ] [1]) ; poly_generic[1][x] = (cur_image_box[ surface[cur_surface][1] ] [0]) ; poly_generic[1][y] = (cur_image_box[ surface[cur_surface][1] ] [1]) ; poly_generic[2][x] = (cur_image_box[ surface[cur_surface][2] ] [0]) ; poly_generic[2][y] = (cur_image_box[ surface[cur_surface][2] ] [1]) ; poly_generic[3][x] = (cur_image_box[ surface[cur_surface][3] ] [0]) ; poly_generic[3][y] = (cur_image_box[ surface[cur_surface][3] ] [1]) ; poly.addPoint( (int) poly_generic[0][x] + xhome, (int) poly_generic[0][y] + yhome ); poly.addPoint( (int) poly_generic[1][x] + xhome, (int) poly_generic[1][y] + yhome ); poly.addPoint( (int) poly_generic[2][x] + xhome, (int) poly_generic[2][y] + yhome ); poly.addPoint( (int) poly_generic[3][x] + xhome, (int) poly_generic[3][y] + yhome ); g.setColor(surface_color[cur_surface]); g.fillPolygon( poly ); poly.npoints = 0; /* --------- poly_2 ------------ */ poly_2.addPoint((int) (poly_generic[0][x] * 0.75) + xhome + 200 , (int) (poly_generic[0][y] * 0.45) + yhome + 200 ); poly_2.addPoint((int) (poly_generic[1][x] * 0.75) + xhome + 200, (int) (poly_generic[1][y] * 0.45) + yhome + 200 ); poly_2.addPoint((int) (poly_generic[2][x] * 0.75) + xhome + 200, (int) (poly_generic[2][y] * 0.45) + yhome + 200 ); poly_2.addPoint((int) (poly_generic[3][x] * 0.75) + xhome + 200, (int) (poly_generic[3][y] * 0.45) + yhome + 200 ); /* System.out.println("\n" + pt1_x + " " + pt1_y); */ /* poly.addPoint( (int) (cur_image_box[ surface[cur_surface][0] ] [0] + xhome), (int) (cur_image_box[ surface[cur_surface][0] ] [1] + yhome) ); poly.addPoint( (int) (cur_image_box[ surface[cur_surface][1] ] [0] + xhome), (int) (cur_image_box[ surface[cur_surface][1] ] [1] + yhome) ); poly.addPoint( (int) (cur_image_box[ surface[cur_surface][2] ] [0] + xhome), (int) (cur_image_box[ surface[cur_surface][2] ] [1] + yhome) ); poly.addPoint( (int) (cur_image_box[ surface[cur_surface][3] ] [0] + xhome), (int) (cur_image_box[ surface[cur_surface][3] ] [1] + yhome)); */ g.fillPolygon( poly_2 ); poly_2.npoints = 0; // System.out.println("\n" + surface_color[cur_surface]); } } } public boolean vector_cross_product(double Vx, double Vy, double Vz, double Wx, double Wy, double Wz) { double vectorX, vectorY, vectorZ; // vectorX = ( Vy * Wz ) - ( Vz * Wy ); // vectorY = ( Vz * Wx ) - ( Vx * Wz ); vectorZ = ( Vx * Wy ) - ( Vy * Wx ); // if vectorZ is positive, then display the polygon determined by the surface defined by input vectorx V and W if ( vectorZ > 0 ) return true; else return false; } public void destroy() { // .... if (doubleBuffer) gBuf.dispose(); } public boolean mouseDragged(Event evt, int x, int y) { Ix = x; Iy = y; repaint(); return true; } protected void paintApplet(Graphics g) { double rx, ry, rz, tx, ty, tz, zcos, zsin, ysin, ycos, xsin, xcos; // pre-clear the bitmap or the applet // remove this if you paint the entire area anyway /* java 1.1 ---> */ Dimension d = getSize(); // d.width = 508; // d.height = 458; // Dimension d = size(); // System.out.println("\n" + "getSize is " + d.width + " = width and height = " + d.height); /* Dimension d = size(); */ g.setColor(getBackground()); g.fillRect(0, 0, d.width, d.height); // ....code that was originally in paint()... int cur_x, cur_y, cur_z, old_x = 0, old_y = 0; zsin = Math.sin(theta); zcos = Math.cos(theta); ysin = Math.sin(omega); ycos = Math.cos(omega); xsin = Math.sin(alpha); xcos = Math.cos(alpha); for (int i = 0; i < box.length; i++) { // twist object about z axis tx = box[i][0] * zcos - box[i][1] * zsin; ty = box[i][0] * zsin + box[i][1] * zcos; tz = box[i][2]; // twist object about y axis rx = tx * ycos + tz * ysin; ry = ty; rz = -1.0 * tx * ysin + tz * ycos; // twist object about x axis tx = rx; ty = ry * xcos - rz * xsin; tz = ry * xsin + rz * xcos; /* cur_x = (int) (tx + xhome); cur_y = (int) (ty + yhome); */ cur_x = (int) (tx); cur_y = (int) (ty); cur_z = (int) (tz); // orig g.fillRect((int) (tx + xhome), (int) (ty + yhome), 15, 15); // g.fillRect(cur_x, cur_y, 15, 15); cur_image_box[i][0] = cur_x; cur_image_box[i][1] = cur_y; cur_image_box[i][2] = cur_z; // g.drawLine(old_x, old_y, cur_x, cur_y); old_x = cur_x; old_y = cur_y; } alpha += 0.0173; if (alpha < 0.0) { alpha += TWO_PI ; } if (alpha > TWO_PI) { alpha -= TWO_PI ; } theta += 0.131; if (theta < 0.0) { theta += TWO_PI; } if (theta > TWO_PI) { theta -= TWO_PI; } omega += 0.016; if (omega < 0.0) { omega += TWO_PI; } if (omega > TWO_PI) { omega -= TWO_PI; } paint_polygons(g); } public void paint(Graphics g) { if (doubleBuffer) { paintApplet(gBuf); g.drawImage(buf, 0, 0, this); } else { paintApplet(g); } } public void update(Graphics g) { // override this because the default implementation always // calls clearRect first, causing unwanted flicker paint(g); } public void run () { while (continue_looping) { repaint() ; try { Thread.sleep(10); } catch (InterruptedException e) { } } } public void start () { if (runner == null) ; { runner = new Thread (this) ; runner.start() ; } } public void stop () { if (runner != null) { // -deprecation as of version 1.2 runner.stop() ; runner = null ; continue_looping = false; } } }