Beispiel #1
0
        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();
        }
Beispiel #2
0
        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();
        }