# Rotate non square matrix 180... Not working...

Discussion in 'C++' started by JustSomeGuy, Jun 3, 2004.

1. ### JustSomeGuyGuest

mx = Cols/2;
if ((mx * 2) != Cols) // Odd.
++mx;
}

for (y1=0; y1 < Rows; ++y1)
{
y2 = Rows-1 - y1;

for (x1=0; x1 < mx; ++x1)
{
x2 = Cols-1 - x1;

p = t[y1][x1];
t[y1][x1] = t[y2][x2];
t[y2][x2] = p;
}
}

This code doesn't seem to do the center column of
a matrix whos dimensions are odd on the x dimensions...
Can any one see why? I tried I don't see it...

JustSomeGuy, Jun 3, 2004

2. ### Victor BazarovGuest

"JustSomeGuy" <> wrote...
> mx = Cols/2;
> if ((mx * 2) != Cols) // Odd.
> ++mx;
> }

This closing curly brace seems misplaced. Besides, you could
simply write

mx = (Cols+1)/2;

instead of three lines above, no?

>
> for (y1=0; y1 < Rows; ++y1)
> {
> y2 = Rows-1 - y1;
>
> for (x1=0; x1 < mx; ++x1)
> {
> x2 = Cols-1 - x1;
>
> p = t[y1][x1];
> t[y1][x1] = t[y2][x2];
> t[y2][x2] = p;
> }
> }
>
>
> This code doesn't seem to do the center column of
> a matrix whos dimensions are odd on the x dimensions...
> Can any one see why? I tried I don't see it...

You probably rotate the middle twice. Try doing it by
hand and see where you screw up.

Victor

Victor Bazarov, Jun 3, 2004

3. ### HowardGuest

"JustSomeGuy" <> wrote in message
news:FEwvc.654789\$Ig.380269@pd7tw2no...
> mx = Cols/2;
> if ((mx * 2) != Cols) // Odd.
> ++mx;
> }
>
> for (y1=0; y1 < Rows; ++y1)
> {
> y2 = Rows-1 - y1;
>
> for (x1=0; x1 < mx; ++x1)
> {
> x2 = Cols-1 - x1;
>
> p = t[y1][x1];
> t[y1][x1] = t[y2][x2];
> t[y2][x2] = p;
> }
> }
>
>
> This code doesn't seem to do the center column of
> a matrix whos dimensions are odd on the x dimensions...
> Can any one see why? I tried I don't see it...

You're swapping the center column twice.

Here's one solution:

// rotate top half with bottom half
int y1 = 0;
int y2 = Rows-1;
for (; y1 < y2; ++y1, --y2)
{
int x2 = Columns-1;
// swap all columns
for (int x1 = 0; x1 < Columns; ++x1, --x2)
swap( t[y1,x1], t[y2,x2] );
}
// odd number of rows? rotate middle row
if (y1 == y2)
{
int x2 = Columns-1;
// only swap left with right (to prevent swapping twice)
for (int x1 = 0; x1 < x2; ++x1, --x2)
swap( t[y1,x1], t[y1,x2] );
}

-Howard

"All programmers write perfect code.
....All other programmers write crap."

"I'm never wrong.
I thought I was wrong once,
but I was mistaken."

Howard, Jun 3, 2004