顺时针旋转2d矢量90度

时间:2016-09-23 19:51:04

标签: c++

嗨我有一个函数应该旋转一个2d向量,该向量保存pgm文件中的像素值。

void pgm_cw( vector <IVec> &p )
{
    vector <IVec> temp;     // temporary vector of vectors of ints
    int count = 0;         // count variable
    int count2 = 0;       // 2nd count variable

    temp.resize( p.size() );
    for( count = 0; count < p.size(); count++ )
    {
        temp[count].resize( p[count].size() );
        for( count2 = 0; count2 < temp[count].size(); count2++ )
        {
            temp[count][count2] = p[count][count2];
        }
    }
    for( count = 0; count < temp.size(); count++ )
    {
        for( count2 = 0; count2 < temp[count].size(); count2++ )
        {
            temp[count][count2] = temp[count][temp[count].size()-count2-1];
                    // set temp vector to p with 90 degree rotation
        }
    }
    p = temp;       // set p equal to temp
}

输出不正确。关于如何修复它的任何想法?感谢

2 个答案:

答案 0 :(得分:2)

解决问题的更简单方法。

void pgm_cw( vector <IVec> &temp )
{

    int N = temp.size();

    for (int x = 0; x < N / 2; x++)
    {
        for (int y = x; y < N-x-1; y++)
        {
            // store current cell in temp variable
            int tmp = temp[x][y];

            // move values from right to top
            temp[x][y] = temp[y][N-1-x];

            // move values from bottom to right
            temp[y][N-1-x] = temp[N-1-x][N-1-y];

            // move values from left to bottom
            temp[N-1-x][N-1-y] = temp[N-1-y][x];

            // assign temp to left
            temp[N-1-y][x] = tmp;
        }
    }
    //std::swap(p,temp);
    //p = temp;       // set p equal to temp
}

Inplace rotate square matrix by 90 degrees

答案 1 :(得分:0)

您的代码实际上正在对垂直中心进行镜像转换。此外,您循环遍历向量,然后重新分配回该向量。这意味着你将在第二个for循环中的某个点上填充向量,其值不会反映原始传递的向量。

对于x中像素数通用的算法,y是:

typedef std::vector<int> IVec;

void pgm_cw( std::vector<IVec> &p )
{
    // Need to allocate an array to store the transform
    std::vector<IVec> temp(p[0].size(), IVec(p.size()));

    int count = 0;        // count variable
    int count2 = 0;      // 2nd count variable

    for( count = 0; count < p.size(); count++ )
    {
        for( count2 = 0; count2 < p[0].size(); count2++ )
        {
            // Clockwise rotation
            temp[count2][temp[0].size()-count-1] = p[count][count2];
            // Counter-clockwise rotation
            //temp[temp.size()-count2-1][count] = p[count][count2];
        }
    }

    p = temp;       // set p equal to temp
}

我已经包含了一个明确的typedef,以便我可以对其进行测试。这是一个快速测试:

BEFORE:
  1  2  3  4
  5  6  7  8
  9 10 11 12
AFTER:
  9  5  1
 10  6  2
 11  7  3
 12  8  4

希望这对非对称数组的情况有所帮助。