// CubeApplet.java // (c)1999 David Barr -- davidbarr@iname.com import java.applet.*; import java.awt.event.*; import java.awt.*; import java.util.*; import java.text.*; class Facelet extends Polygon { int n; // facelet number int puzzleX, puzzleY; int myx[]; int myy[]; Facelet(int nn, int inx, int iny, int outx, int outy, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { // System.out.println("(" + x1 + "," + y1 + ")," + // "(" + x2 + "," + y2 + ")," + // "(" + x3 + "," + y3 + ")," + // "(" + x4 + "," + y4 + ")"); puzzleX=inx; puzzleY=iny; n = nn; myx = new int[4]; myy = new int[4]; myx[0] = x1; myx[1] = x2; myx[2] = x3; myx[3] = x4; myy[0] = y1; myy[1] = y2; myy[2] = y3; myy[3] = y4; resize(outx, outy); } void resize(int outx, int outy) { npoints=0; addPoint(myx[0]*outx/puzzleX, myy[0]*outy/puzzleY); addPoint(myx[1]*outx/puzzleX, myy[1]*outy/puzzleY); addPoint(myx[2]*outx/puzzleX, myy[2]*outy/puzzleY); addPoint(myx[3]*outx/puzzleX, myy[3]*outy/puzzleY); } } class SliceMove { int size; int moves[][]; SliceMove(int s) { size = s; moves = new int[s][4]; } void set(int n, int m, int val) { moves[n][m] = val; } int get(int n, int m) { return moves[n][m]; } int getSize() { return size; } } class Cube { Facelet facelets[]; int nfacelets, order, nfaces; Color faceColors[]; SliceMove SliceMoves[][]; Applet a; int puzzleWidth, puzzleHeight, panelWidth=0, panelHeight=0; int[] slicePart(int face, int num, boolean horiz, boolean forward) { int part[], base, i, r, c, dr, dc; part = new int[order]; base = face * order * order; if(horiz) { if(forward) { r=num; c=0; dr=0; dc=1; } else { r=num; c=order-1; dr=0; dc=-1; } } else { if(forward) { r=0; c=num; dr=1; dc=0; } else { r=order-1; c=num; dr=-1; dc=0; } } for(i=0; i0) { System.out.print(","); } System.out.print("{"); for(k=0; k<4; k++) { if(k>0) { System.out.print(","); } System.out.print(SliceMoves[axis][slice].get(j,k)); } System.out.print("}"); } System.out.print("},\n"); } System.out.print("\n"); } } public Cube(int inOrder, Applet a) { order = inOrder; puzzleWidth = order*order*4+1; puzzleHeight = order*order*5+1; panelWidth = 0; panelHeight = 0; restore(a); makeTables(); // printLegend(); // printTables(); } void restore(Applet a) { int i, j, k, row, col, n=0, sizex[], indentx[], indenty[], sizey[]; nfaces = 6; // cube nfacelets = order*order*nfaces; facelets = new Facelet[nfacelets]; faceColors = new Color[nfaces]; // faceColors[0] = Color.red; // faceColors[1] = Color.green; // faceColors[2] = Color.blue; // faceColors[3] = Color.yellow; // faceColors[4] = Color.white; // faceColors[5] = Color.orange; faceColors[Integer.parseInt(a.getParameter("wheresr"))] = Color.red; faceColors[Integer.parseInt(a.getParameter("wheresg"))] = Color.green; faceColors[Integer.parseInt(a.getParameter("wheresb"))] = Color.blue; faceColors[Integer.parseInt(a.getParameter("wheresy"))] = Color.yellow; faceColors[Integer.parseInt(a.getParameter("wheresw"))] = Color.white; faceColors[Integer.parseInt(a.getParameter("whereso"))] = Color.orange; indentx = new int[order+1]; indenty = new int[order+1]; sizex = new int[order+1]; sizey = new int[order+1]; for(k=0; k panelHeightNew) { panelWidthNew = panelHeightNew*4/5; } else { panelHeightNew = panelWidthNew*5/4; } f.resize(panelWidthNew, panelHeightNew); } g.setColor(faceColors[f.n / (order*order)]); g.fillPolygon(f); g.setColor(Color.black); g.drawPolygon(f); } panelWidth = panelWidthNew; panelHeight = panelHeightNew; } void TurnSlice(int axis, int slice, int times) { int i, j, k, l; for(l=0; l=1; j--) { facelets[SliceMoves[axis][slice].get(i,j)].n = facelets[SliceMoves[axis][slice].get(i,j-1)].n; } facelets[SliceMoves[axis][slice].get(i,0)].n = k; } } } void DetermineAndTurnSlice(int facelet1, int facelet2, boolean allSlices) { int f[], grps[], ns[], Slice, count, fl, grp, n, turns, i, axis; int firstSlice, lastSlice; ns = new int[2]; grps = new int[2]; f = new int[2]; f[0] = facelet1; f[1] = facelet2; // System.out.println("clicked on " + f[0] + " and " + f[1]); for(axis=0; axis<3; axis++) { for(Slice=0; Slice