private void rotatePartFast(EasingTimer.rotateAxisType axis, int rotate_n, int dir) { int delta; int i, j, k, l, m, n; int[] new_pos = new int[N * N]; Dictionary<int, int> pos_to_cube_number = new Dictionary<int, int>(N * N * N); for (i = 0; i < N * N * N; i++) { pos_to_cube_number[positions[i]] = i; } if (axis == EasingTimer.rotateAxisType.Y) { i = rotate_n * N * N; float angle = -90 * dir; for (j = 1; j <= N * N; j++) { k = pos_to_cube_number[i];//k - номер кубика angles[k].Y = 0; //rotate_cube(k, angle, Axis.Y); rotate_cube(k, angle, Axis.Y, false); i++; } for (k = 0; k < N; k++) { l = N * (N - 1) + k + rotate_n * N * N;//6, 3, 0, 7, 4, 1, 8, 5, 2 for (j = 0; j < N; j++) { new_pos[k * N + j] = l; l -= N; } } if (dir == -1) { Array.Reverse(new_pos); } for (j = 0; j < N * N; j++) { i = pos_to_cube_number[j + rotate_n * N * N];//номер кубика на позициях 0, 1, 2, 3, 4, 5, 6, 7, 8 l = new_pos[j]; positions[i] = l; } } else if (axis == EasingTimer.rotateAxisType.X) { i = rotate_n; delta = N; for (j = 1; j <= N * N; j++) { //debug("i = " + i.ToString() + ", positions[" + i.ToString() + "] = " + positions[i].ToString() + ", pos_to_cube_number[" + i.ToString() + "] = " + pos_to_cube_number[i].ToString()); i += delta; } i = rotate_n; float angle = -90 * dir; for (j = 1; j <= N * N; j++) { k = pos_to_cube_number[i];//k - номер кубика angles[k].X = 0; //rotate_cube(i, angle, Axis.X); rotate_cube(k, angle, Axis.X, false); i += N; } for (k = 0; k < N; k++) { l = N * N * (N - 1) + k * N + rotate_n;//18, 9, 0, 21, 12, 3, 24, 15, 6 for (j = 0; j < N; j++) { new_pos[k * N + j] = l; l -= N * N; } } if (dir == -1) { Array.Reverse(new_pos); } i = rotate_n;//0, 3, 6, 9, 12, 15, 18, 21, 24, for (k = 0; k < N * N; k++) { m = pos_to_cube_number[i];//номер кубика на позициях 0, 3, 6, 9, 12, 15, 18, 21, 24, l = new_pos[k]; positions[m] = l;//у этого кубика новая позиция i += N; } } else if (axis == EasingTimer.rotateAxisType.Z) { i = rotate_n * N; float angle = -90 * dir; for (j = 0; j < N; j++) { l = i;//0, 1, 2, 9, 10, 11, 18, 19, 20 for (k = 0; k < N; k++) { m = pos_to_cube_number[l];//m - номер кубика angles[m].Z = 0; //rotate_cube(l, angle, Axis.Z); rotate_cube(m, angle, Axis.Z, false); l++; } i += N * N; } for (j = 0; j < N; j++) { l = N - j - 1 + rotate_n * N;//2, 11, 20, 1, 10, 19, 0, 9, 18 for (k = 0; k < N; k++) { new_pos[j * N + k] = l; l += N * N; } } if (dir == -1) { Array.Reverse(new_pos); } i = rotate_n * N; for (j = 0; j < N; j++) { l = i;//0, 1, 2, 9, 10, 11, 18, 19, 20 for (k = 0; k < N; k++) { m = pos_to_cube_number[l];//m - номер кубика на позициях 0, 1, 2, 9, 10, 11, 18, 19, 20 n = new_pos[j * N + k];//у кубика новая позиция positions[m] = n; l++; } i += N * N; } } int eirwir = 0; glControl1.Invalidate(); }
public static void rotate(int n, TimerFunction func, List<angleXYZ> angles, int dir, rotateAxisType rotateAxis, timerUPFunction funcUp = null) { if (t == null) { //MessageBox.Show("firstAngle = " + firstAngle.ToString()); t = new EasingTimer(n, func, angles, dir, rotateAxis, funcUp); t.rotateAxis = rotateAxis; } else { //если прокручивание работает, то просто возвращаем таймер //если прокручинваие уже не работает, то заново инициализируем переменные, как бы вызываем конструктор if (!t._run) { //MessageBox.Show("2: firstAngle = " + firstAngle.ToString()); t.firstAngle = 0; t.rotateN = n; t.begin_time = DateTime.Now; t.Elapsed -= t.func; t.func = new ElapsedEventHandler(func); t.Elapsed += t.func; t.dir = dir; t.rotateAxis = rotateAxis; t.funcUp = funcUp; } } //Если уже пошёл процесс кручения, то выходим if (t._run) { return; } t._run = true; t.Start(); }