Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


есть, их полно. Правда чем дальме - тем более извращённый способ получается.
Например, сведём всё к одной операции прохода строчки и одной операции поворота матрицы (всё это в цикле).

в цикле:
1. прошли верхнюю строчку
2. повернули на 90 CCW (кто фотошоп видел, поймёт)

дальше варианты: копировать матрицу или поворачивать координатную ось. Дешевле повернуть ось (понятней - наоборот). Так и сделаем!
Код: Выделить весь код
// извиняюсь, что пишу не на языке вопроса, но если идея зацепит, попробую перевести
class pass_matrix
{
    static const int gwidth = 10;  // начальная ширина
    static const int gheight = 20; // начальная высота

    int matrix[gwidth*gheight];

    int width;  // ширина
    int height; // высота
    int a, b, c, d; // преобразование координат
        // x1 = a*x + b
        // y1 = c*y + d
    int x, y;  // смещение

    void print()
    {
        std::cout << "{" << x << ", " << y << "}: "
                << matrix[x + y*qwidth] << "\n";
    }

public:
    pass_matrix() :
        matrix(),
        width(gwidth),
        height(gheight),
        a(1), b(0),
        c(1), d(0),
        x(0), y(0)
    {
        // начальная позиция:
        //  0123
        // 0x->.
        // 1....
        // 2....
    }
private:

    void step()
    {
        // делаем один шаг
        x += a;
        y += b;
    }

    void rotate()
    {
        // шаг назад
        //  0123
        // 0....x
        // 1...|
        // 2...v
        x += c - a;
        y += d - b;

        // поворот матрицы (направления)
        int a1 = c;
        int b1 =  d;
        int c1 = -a;
        int d1 =  -b;

        a = a1;
        b = b1;
        c = c1;
        d = d1;

        // поворот и усечение размеров
        --height;
        std::swap(width,height);
    }

public:
    void main()
    {
        while (0<height)
        {
            for (int w=width; 0<=--w; step())
            {
                print();
            }

            rotate();
        }
    }
};
если в линейных преобразованиях не напутал, то должно работать

Последний раз редактировалось pva, 25-10-2006 в 22:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:07, 25-10-2006 | #4