コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】二次元配列を回転させる拡張メソッド

はじめに

上記サイト様が公開されているプログラムを参考に
二次元配列を回転させる拡張メソッドを作成しました

ソースコード

public static class ArrayExt
{
    // 時計回りに 90 度回転
    public static T[,] RotateClockwise<T>( this T[,] self )
    {
        int rows    = self.GetLength( 0 );
        int columns = self.GetLength( 1 );
        var result  = new T[columns, rows];

        for ( int i = 0; i < rows; i++ )
        {
            for ( int j = 0; j < columns; j++ )
            {
                result[ j, rows - i - 1 ] = self[ i, j ];
            }
        }

        return result;
    }

    // 時計回りに 90 * count 度回転
    public static T[,] RotateClockwise<T>( this T[,] self, int count )
    {
        for ( int i = 0; i < count; i++ )
        {
            self = self.RotateClockwise();
        }

        return self;
    }

    // 反時計回りに 90 度回転
    public static T[,] RotateAnticlockwise<T>( this T[,] self )
    {
        int rows    = self.GetLength( 0 );
        int columns = self.GetLength( 1 );
        var result  = new T[columns, rows];

        for ( int i = 0; i < rows; i++ )
        {
            for ( int j = 0; j < columns; j++ )
            {
                result[ columns - j - 1, i ] = self[ i, j ];
            }
        }

        return result;
    }

    // 反時計回りに 90 * count 度回転
    public static T[,] RotateAnticlockwise<T>( this T[,] self, int count )
    {
        for ( int i = 0; i < count; i++ )
        {
            self = self.RotateAnticlockwise();
        }

        return self;
    }
}

使用例

using System;
using System.Text;

public static class Program
{
    private static void Main()
    {
        var array = new[,]
        {
            { 1, 2, 3, },
            { 4, 5, 6, },
        };

        // 通常
        // 1,2,3
        // 4,5,6
        Draw( array );

        // 時計回りに 90 度回転
        // 4,1,
        // 5,2,
        // 6,3,
        Draw( array.RotateClockwise() );

        // 時計回りに 180 度回転
        // 6,5,4,
        // 3,2,1,
        Draw( array.RotateClockwise( 2 ) );

        // 時計回りに 270 度回転
        // 3,6,
        // 2,5,
        // 1,4,
        Draw( array.RotateClockwise( 3 ) );

        // 反時計回りに 90 度回転
        // 3,6,
        // 2,5,
        // 1,4,
        Draw( array.RotateAnticlockwise() );

        // 反時計回りに 180 度回転
        // 6,5,4,
        // 3,2,1,
        Draw( array.RotateAnticlockwise( 2 ) );

        // 反時計回りに 270 度回転
        // 4,1,
        // 5,2,
        // 6,3,
        Draw( array.RotateAnticlockwise( 3 ) );
    }

    private static void Draw( int[,] array )
    {
        var builder = new StringBuilder();

        for ( int i = 0; i < array.GetLength( 0 ); i++ )
        {
            for ( int j = 0; j < array.GetLength( 1 ); j++ )
            {
                builder.Append( array[ i, j ] + "," );
            }

            builder.AppendLine();
        }

        Console.WriteLine( builder.ToString() );
        Console.WriteLine();
    }
}