行列による一次変換の図を描く


二次元平面上の点が行列による変換によってどこに移動するか?それをXY座標にプロットする図を作りたい。Rで描いて、EPS画像にして取り込む事ができないか?

図をEPS ファイルに書き出すのは、dev.copy2eps( file = "file_name.eps" )という命令でできるようだ。


この図はx座標、y座標ともに−5から5までの値を取る黒丸の点が、行列Xによってどこに移されたかを示したものである。

以下のコードがでのコード。対象行列を作って、行列のかけ算をして、新しい行列と前の行列の座標間を矢印で結んだもの。

#関数の定義
matrix_plot <- function(P,n){
	#対象行列の作成
	for( j in -n : n){
		for( i in -n : n){
			if ((i == -n ) && (j == -n)) {
				x <- c(i,j)
			} else {
				x <- append(x,c(i,j))
			}
		}
	} 
	x <- matrix(x,nrow=2)
	#X2=PXの計算
	x2 <- P %*% x

	#新しい図を描く
	plot.new()
	if (min(x) > min(x2)) {	minP <- min(x2)
		} else { minP <- min(x)}
	if (max(x) > max(x2)) {	maxP <- max(x)
		} else { maxP <- max(x2)}
	plot(minP:maxP,minP:maxP,type="n",ann=F)
	grid()
	axis(1,pos=0,at=minP:maxP,labels=F)
	axis(2,pos=0,at=minP:maxP,labels=F)

	#点と矢印を描く
	n2 <- (2*n+1)*(2*n+1)
	for( i in 1:n2 ){
		points(x[1,i],x[2,i],pch=20)
		points(x2[1,i],x2[2,i],pch=16,col="red")
		if( (x[1,i] != x2[1,i]) || (x[2,i] != x2[2,i]) ){
			arrows(x[1,i],x[2,i],x2[1,i],x2[2,i],length=0.1,col="red")
		}
	}
}

#データディレクトリの変更
setwd("D://temp")

#行列の生成
P <- matrix(c(3,2,2,3),nrow=2)
matrix_plot(P,2)

#EPSファイルの生成
dev.copy2eps( file = "file_name.eps",family="AvantGarde")