2016-09-23 10 views
-2

こんにちは私は、pgmファイルからピクセル値を保持する2dベクトルを回転させる関数を持っています。2dベクトルを時計回りに90度回転する

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

、 。また、動作しない短いプログラムの場合は、プログラムの段階に沿って、何をしているのかを示すプリントアウトを追加することもできます。 –

答えて

0

あなたのコードは、実際には垂直中心について鏡面変換を行っています。また、ベクトルをループして、そのベクトルに再び割り当てます。つまり、2番目のfor-loopのある点で元の渡されたベクトルを反映しない値でベクトルを埋めることになります。 xの画素数に一般的なものであり、アルゴリズムのために

、Yここで何かである:私はそれをテストできるように、私は明示的なtypedefを含めました

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 
} 

。ここに簡単なテストがあります:

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 

これは、非対称アレイの場合に役立ちます。

+0

そのような出力が悪化しました。コンパイルされましたが、私が実行したときにエラーが発生しました。 – miamidawgs

+0

正方形の配列をしようとしましたか、またはx、yピクセルのサイズが異なりますか? – Jvinniec

+0

2次元のサイズが等しくない2次元配列を考慮に入れた答えを更新しました。また、私はそれが動作するはずであることを示す例を追加しました。 – Jvinniec

1

問題を簡単に解決する方法です。あなたが推測する必要がIVec` `のようなクラスを含まない、[MCVE](http://stackoverflow.com/help/mcve)を作製することがあります将来的な質問で

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

この場合、あなたは 'std :: swap(p、temp)'が必要ないことに注意してください。この答えは、配列全体の割り当てを必要としないので効率的です。回転しようとする配列の大きさに応じて高価になる可能性があります。 – Jvinniec

+0

@Jvinniec、訂正してくれてありがとう。 – v78

+0

また、「2dベクトルを時計回りに90度回転する」と質問されますが、現在のアルゴリズムは反時計回りに回転します。害虫になって申し訳ありません! :P – Jvinniec

関連する問題