阿摩線上測驗 登入

申論題資訊

試卷:103年 - 103年專門職業及技術人員高等建築師、技師、第二次食品技師暨普通不動產經紀人、記帳士考高等_資訊技師#29113
科目:程式設計
年份:103年
排序:0

題組內容

二、假設有一灰階影像 img1,其類別為 Image 如下:
class Image {
private:
int width; // 寬
int height; // 高
unsigned char **pixel; // 像素
public:
Image(int w, int h); // 建構子
unsigned char getpixel(int r, int c); // 取出 pixel[r][c]值
void setpixel(int r, int c, unsigned char g);// 設定 pixel[r][c]值為 g
int getwidth(); // 取出影像的寬度
int getheight(); // 取出影像的高度
}
其寬為 width,高為 height,其像素值存在一個二維陣列 pixel 中,資料型態為 unsigned
char。今欲將此灰階影像 img1 順時針旋轉 90 度,並儲存在另一新的灰階影像 img2。

申論題內容

⑶試寫出一個 Rotate( )函式如下,將參數 img1 順時針旋轉 90 度後,存成新的影像
img2,並回傳。(10 分)
Image Rotate(Image & img1)
{
……
}

詳解 (共 1 筆)

詳解 提供者:hchungw
為了實現一個將給定圖像 img1 順時針旋轉90度並返回新圖像 img2 的功能,我們需要考慮到旋轉後圖像的寬度和高度會互換,同時圖元點的位置也需要相應地調整。
以下是如何實現 Rotate() 函數的示例:

Image Rotate(Image &img1) {
    int newWidth = img1.getheight(); // 旋轉後的新寬度是原圖的高度
    int newHeight = img1.getwidth(); // 旋轉後的新高度是原圖的寬度
    // 創建一個新的圖像物件,尺寸是旋轉後的尺寸
    Image img2(newWidth, newHeight);
    // 遍歷原圖的每個圖元,並將它們複製到新圖的對應位置
    for (int r = 0; r < img1.getheight(); ++r) {
        for (int c = 0; c < img1.getwidth(); ++c) {
            // 計算旋轉後的新位置
            int newR = c;
            int newC = newHeight - r - 1;
            // 獲取原圖的圖元值,並設置到新圖的對應位置
            unsigned char pixelValue = img1.getpixel(r, c);
            img2.setpixel(newR, newC, pixelValue);
        }
    }
    // 返回旋轉後的新圖像
    return img2;
}
這段代碼中,Rotate() 函數首先根據 img1 的寬和高計算出旋轉後圖像 img2 的新寬度和高度。然後,它創建一個新的 Image 物件 img2,其尺寸為旋轉後的尺寸。接下來,通過兩層迴圈遍歷 img1 的所有圖元,計算每個圖元旋轉後的新位置,並將其值設置到 img2 的相應位置上。旋轉的關鍵在於如何計算新的行 newR 和列 newC,這裡通過簡單的座標變換實現。
最後,函數返回旋轉後的圖像 img2。這個實現假設 Image 類有足夠的功能來支援複製和返回局部物件,這在現代C++實踐中是合理的,特別是如果 Image 類遵循了規則-of-three/five/zero(即適當實現了構造函數、複製構造函數、賦值操作符、移動構造函數、移動賦值操作符和析構函數)。如果 Image 類使用了動態記憶體分配,確保適當管理資源是很重要的。