為了實現一個將給定圖像 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 類使用了動態記憶體分配,確保適當管理資源是很重要的。