C#でサイズn×nの行列を90度ずつk回回転させる方法
n×n の正方行列全体を、指定された回数(k 回)だけ 90 度ずつ回転させるアルゴリズムを解説します。
アルゴリズムの考え方
n×n の行列には、外周から内周へ向かって同心円状の「層」が合計 n/2 個存在します。入れ子になったループを使えば、これらの層を 1 つずつ順番に処理できます。
各層の中では、要素が 4 個ずつのグループで循環しながら移動します。そこで、サイクルごとに関係する 4 つの要素をまとめて入れ替えることで、行列全体の回転を実現します。
具体的な要素の移動ルールは次のとおりです。
- (n-1-j, i) の位置にある要素は (i, j) へ移動する
- (i, j) の位置にある要素は (j, n-1-i) へ移動する
- (j, n-1-i) の位置にある要素は (n-1-i, n-1-j) へ移動する
- (n-1-i, n-1-j) の位置にある要素は (n-1-j, i) へ移動する
C#での実装例
using System;
using System.Text;
namespace ConsoleApplication{
public class Matrix{
public void RotateMatrixByKTimes(int[] matrix, int numberOftimes){
int n = matrix.GetLength(0);
for (int k = 0; k < numberOftimes; k++){
for (int i = 0; i < n / 2; i++){
for (int j = i; j < n - i - 1; j++){
int top = matrix[i, j];
// 左側の値を上へ移動
matrix[i, j] = matrix[n - 1 - j, i];
// 下側の値を左へ移動
matrix[n - 1 - j, i] = matrix[n - i - 1, n - 1 - j];
// 右側の値を下へ移動
matrix[n - i - 1, n - 1 - j] = matrix[j, n - i - 1];
// 上側の値を右へ移動
matrix[j, n - i - 1] = top;
}
}
}
for (int i = 0; i < n; i++){
StringBuilder s = new StringBuilder();
for (int j = 0; j < n; j++){
s.Append(matrix[i, j] + " ");
}
Console.WriteLine(s);
s = null;
}
}
}
class Program{
static void Main(string[] args){
Matrix m = new Matrix();
int[] matrix = { { 5, 1, 9, 11 }, { 2, 4, 8, 10 }, { 13, 3, 6, 7 }, { 15, 14, 12, 16 } };
m.RotateMatrixByKTimes(matrix, 2);
}
}
}コードのポイント
- RotateMatrixByKTimes メソッド:引数 numberOftimes の回数だけ、行列全体を 90 度ずつ回転させます。
- 三重ループ構造:外側のループで回転回数を管理し、内側の 2 つのループで各層・各サイクルを処理します。
- 一時変数 top:上側の要素を退避させてから残りの 3 要素を順にずらし、最後に退避した値を右側へ書き込むことで、4 要素の入れ替えを安全に行っています。
実行結果
4×4 のサンプル行列を 2 回(180 度)回転させた場合の出力は次のとおりです。
16 12 14 15 7 6 3 13 10 8 4 2 11 9 1 5
-
C++とOpenCVを使って動画を回転させる方法
OpenCVにおける動画の回転処理は、画像を回転させる場合と基本的に同じ仕組みです。唯一の違いは、静止画像を画像行列(Mat)に読み込む代わりに、動画ファイルを読み込むか、カメラから映像ストリームを取得するという点です。この記事では、動画ファイルを読み込むのではなく、カメラで撮影した映像をリアルタイムに回転させて表示します。もし既存の動画ファイルを使用したい場合は、VideoCaptureの引数に動画ファイルのパスを正しく指定するだけで対応できます。また、トラックバー(スライダー)を追加することで、実行中に回転角度を自由に変更できるようにしています。回転角度の初期値は180度に設定されており、
-
C++とOpenCVを使って画像を回転させる方法
OpenCVによる画像回転の基本OpenCVに組み込まれた関数を使用すれば、画像の回転は非常に簡単な作業です。画像を回転させるには、「highgui.hpp」と「imgproc.hpp」の2つのヘッダーファイルを読み込みます。本プログラムでは、これらに加えて画像の回転処理に関わる複数の関数を紹介します。以下のプログラムは、C++でOpenCVを使用して画像を回転させる方法を示しています。サンプルコード#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/i