データ構造 〜 第1章 配列と文字列 問題1-6

問題1-6.

M✕Nの行列に描かれた、1つのピクセルが4バイト四方の画像を90度回転させる。

複素平面上で(x,y)を{\theta}回転させると下記になる。


{(x+iy)(\cos\theta + i\sin\theta) = (x\cos\theta - y\sin\theta)+i(x\sin\theta + y\cos\theta)}
従って、{\theta=\pi / 2}の場合は、{(x,y) \rightarrow (-y,x)}と変換される。

N×Nの正方形の座標(x,y)を1次元配列pに下記のように対応させる。


{(x,y) \rightarrow p[x+(y-1)N]}

90度回転させるとは、この配列pを下記配列に変換することを意味する。


{(x,y) \rightarrow p[-y+(x-1)N]}

これでは原点中心に90度回転させることになるので、追加領域が必要となる。
追加領域なしにするには、90度回転させてから、Nだけ平行移動する必要がある。
それを考慮すると下記のようになる。


{(x,y) \rightarrow p[-y+N-1+(x-1)N]}

上記を踏まえて書いたコードが以下だが、どこかにバグが有る。現在考え中。

package solve;

public class Solve {

	public static void main(String[] args) {
		if(args.length == 0){
			System.out.println("正方形のサイズNを入力してください。");
			return;
		}
		int N = Integer.parseInt(args[0]);
		
		String[] p1 = new String[N*N];
		String[] p2 = new String[N*N];
		
		int v = 0;
		for(int x=0; x<N; ++x){
			for(int y=0; y<N; ++y){
				p1[x+y*N] = (y%3==0 ? "○" : "×");
				System.out.print(p1[x+y*N]);
			}
			System.out.println("");
		}
		System.out.println("");
		
		for(int x=0; x<N; ++x){
			for(int y=0; y<N; ++y){
				p2[-y+N-1+x*N] = p1[x+y*N];
				System.out.print(p2[-y+N-1+x*N]);
			}
			System.out.println("");
		}
	}
}