2016-09-23 125 views
-2

嗨我有一個函數應該旋轉一個2d向量,它保存來自pgm文件的像素值。順時針旋轉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

在未來的問題,你可能需要準備[MCVE(http://stackoverflow.com/help/mcve),不包含類,如'IVec'需要猜測。另外,對於不起作用的簡短程序,您可能希望在程序的各個階段添加打印輸出,指出他們正在做什麼。 –

回答

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 

希望這有助於不對稱陣列的情況。

+0

這種做出輸出更糟糕。它編譯但給了我一個錯誤,當我跑它說,無效的下一個isze – miamidawgs

+0

你想做一個方陣,或者你的x,y像素大小不同? – Jvinniec

+0

我已經更新了答案,以說明二維數組中的尺寸不相等的答案。另外,我添加了一個示例,表明它應該可以工作。 – Jvinniec

1

更簡單的方法來解決您的問題。

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