嗨我有一个函数应该旋转一个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
}
输出不正确。关于如何修复它的任何想法?感谢
答案 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
}
答案 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
希望这对非对称数组的情况有所帮助。