есть, их полно. Правда чем дальме - тем более извращённый способ получается.
Например, сведём всё к одной операции прохода строчки и одной операции поворота матрицы (всё это в цикле).
в цикле:
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();
}
}
};
если в линейных преобразованиях не напутал, то должно работать