void setURFtoDLF(cubiecube_t* cubiecube, short idx) { int x; corner_t corner6[6] = { URF, UFL, ULB, UBR, DFR, DLF }; corner_t otherCorner[2] = { DBL, DRB }; int b = idx % 720; // Permutation int a = idx / 720; // Combination for(int c = 0; c < CORNER_COUNT; c++) cubiecube->cp[c] = DRB;// Use DRB to invalidate all corners for (int j = 1, k; j < 6; j++)// generate permutation from index b { k = b % (j + 1); b /= j + 1; while (k-- > 0) rotateRight_corner(corner6, 0, j); } x = 5;// generate combination and set corners for (int j = DRB; j >= 0; j--) if (a - Cnk(j, x + 1) >= 0) { cubiecube->cp[j] = corner6[x]; a -= Cnk(j, x-- + 1); } x = 0; for (int j = URF; j <= DRB; j++) if (cubiecube->cp[j] == DRB) cubiecube->cp[j] = otherCorner[x++]; }
void setURtoDF(cubiecube_t* cubiecube, int idx) { int x; edge_t edge6[6] = { UR, UF, UL, UB, DR, DF }; edge_t otherEdge[6] = { DL, DB, FR, FL, BL, BR }; int b = idx % 720; // Permutation int a = idx / 720; // Combination for(int e = 0; e < EDGE_COUNT; e++) cubiecube->ep[e] = BR;// Use BR to invalidate all edges for (int j = 1, k; j < 6; j++)// generate permutation from index b { k = b % (j + 1); b /= j + 1; while (k-- > 0) rotateRight_edge(edge6, 0, j); } x = 5;// generate combination and set edges for (int j = BR; j >= 0; j--) if (a - Cnk(j, x + 1) >= 0) { cubiecube->ep[j] = edge6[x]; a -= Cnk(j, x-- + 1); } x = 0; // set the remaining edges DL..BR for (int j = UR; j <= BR; j++) if (cubiecube->ep[j] == BR) cubiecube->ep[j] = otherEdge[x++]; }
void setFRtoBR(cubiecube_t* cubiecube, short idx) { int x; edge_t sliceEdge[4] = { FR, FL, BL, BR }; edge_t otherEdge[8] = { UR, UF, UL, UB, DR, DF, DL, DB }; int b = idx % 24; // Permutation int a = idx / 24; // Combination for (int e = 0; e < EDGE_COUNT; e++) cubiecube->ep[e] = DB;// Use UR to invalidate all edges for (int j = 1, k; j < 4; j++)// generate permutation from index b { k = b % (j + 1); b /= j + 1; while (k-- > 0) rotateRight_edge(sliceEdge, 0, j); } x = 3;// generate combination and set slice edges for (int j = UR; j <= BR; j++) if (a - Cnk(11 - j, x + 1) >= 0) { cubiecube->ep[j] = sliceEdge[3 - x]; a -= Cnk(11 - j, x-- + 1); } x = 0; // set the remaining edges UR..DB for (int j = UR; j <= BR; j++) if (cubiecube->ep[j] == DB) cubiecube->ep[j] = otherEdge[x++]; }
void GraphicsLayer09::drawSpline() { int rate = 800; int n = 4; for(float t=0; t <= 1; t += 1.0f/rate) { float x=0; float y=0; for(int i=0;i <= n; ++i) { // Cnk是二项式系数,其值为 n! / ( i! * ( n - i )! ) x += m_pts[i].x * Cnk(n,i) * pow(t,i) * pow(1-t, n-i); y += m_pts[i].y * Cnk(n,i) * pow(t,i) * pow(1-t, n-i); } GRAPHICS->setPixel(ROUND(x),ROUND(y)); } }
void setUBtoDF(cubiecube_t* cubiecube, short idx) { int x; edge_t edge3[3] = { UB, DR, DF }; int b = idx % 6; // Permutation int a = idx / 6; // Combination for (int e = 0; e < EDGE_COUNT; e++) cubiecube->ep[e] = BR;// Use BR to invalidate all edges for (int j = 1, k; j < 3; j++)// generate permutation from index b { k = b % (j + 1); b /= j + 1; while (k-- > 0) rotateRight_edge(edge3, 0, j); } x = 2;// generate combination and set edges for (int j = BR; j >= 0; j--) if (a - Cnk(j, x + 1) >= 0) { cubiecube->ep[j] = edge3[x]; a -= Cnk(j, x-- + 1); } }
short getUBtoDF(cubiecube_t* cubiecube) { int a = 0, x = 0; edge_t edge3[3] = {0}; // compute the index a < (12 choose 3) and the edge permutation. for (int j = UR; j <= BR; j++) if (UB <= cubiecube->ep[j] && cubiecube->ep[j] <= DF) { a += Cnk(j, x + 1); edge3[x++] = cubiecube->ep[j]; } int b = 0; for (int j = 2; j > 0; j--)// compute the index b < 3! for the // permutation in edge3 { int k = 0; while (edge3[j] != UB + j) { rotateLeft_edge(edge3, 0, j); k++; } b = (j + 1) * b + k; } return (short) (6 * a + b); }
int getURtoDF(cubiecube_t* cubiecube) { int a = 0, x = 0; edge_t edge6[6] = {0}; // compute the index a < (12 choose 6) and the edge permutation. for (int j = UR; j <= BR; j++) if (cubiecube->ep[j] <= DF) { a += Cnk(j, x + 1); edge6[x++] = cubiecube->ep[j]; } int b = 0; for (int j = 5; j > 0; j--)// compute the index b < 6! for the // permutation in edge6 { int k = 0; while (edge6[j] != j) { rotateLeft_edge(edge6, 0, j); k++; } b = (j + 1) * b + k; } return 720 * a + b; }
short getURFtoDLF(cubiecube_t* cubiecube) { int a = 0, x = 0; corner_t corner6[6] = {0}; // compute the index a < (8 choose 6) and the corner permutation. for (int j = URF; j <= DRB; j++) if (cubiecube->cp[j] <= DLF) { a += Cnk(j, x + 1); corner6[x++] = cubiecube->cp[j]; } int b = 0; for (int j = 5; j > 0; j--)// compute the index b < 6! for the // permutation in corner6 { int k = 0; while (corner6[j] != j) { rotateLeft_corner(corner6, 0, j); k++; } b = (j + 1) * b + k; } return (short) (720 * a + b); }
short getFRtoBR(cubiecube_t* cubiecube) { int a = 0, x = 0; edge_t edge4[4] = {0}; // compute the index a < (12 choose 4) and the permutation array perm. for (int j = BR; j >= UR; j--) if (FR <= cubiecube->ep[j] && cubiecube->ep[j] <= BR) { a += Cnk(11 - j, x + 1); edge4[3 - x++] = cubiecube->ep[j]; } int b = 0; for (int j = 3; j > 0; j--)// compute the index b < 4! for the // permutation in perm { int k = 0; while (edge4[j] != j + 8) { rotateLeft_edge(edge4, 0, j); k++; } b = (j + 1) * b + k; } return (short) (24 * a + b); }