形態形成へ〜ぱらぱらめくる『射影幾何学入門〜生物の形態と数学〜

  • 準備ができたので、射影変換を繰り返そう
  • ある点がある(超)平面上にあって、そこから1回、射影変換して、もとの(超)平面に戻る、ついで、戻ったところからもう一度射影変換をして戻ってくる、それを繰り返す
  • 1回の射影変換には、写像する(超)平面と、行って帰るために2箇所の光源・視点が必要
    • ちなみに、以下の「初期点」は「元の平面」上ではないので、初期点から(超)平面に行って、「あるべき元の平面」に戻ってきたとして、そこから打点している

  • 間延びして、また収束して、というカーブになる
# 元の平面に戻す射影変換
# d次元平面の点の集合xは第1成分が0の点の集まりとする
# L1,L2は二つの視点・光源座標
# 超平面pは原点を通るのをデフォルトとする
# vは法線
my.projection.transform <- function(x,L1,L2,v1,v2,p0=rep(0,length(L1))){
	#v2 <- c(1,rep(0,length(L1)-1))
	tmp.x <- my.projection(x,L1,p0,v1)
	my.projection(tmp.x,L2,p0,v2)
}
# 何度も射影変換を繰り返す。
my.projection.transform.n <- function(x,L1,L2,v1,v2,n,p0=rep(0,length(L1))){
	ret <- list()
	ret[[1]] <- x
	for(i in 1:n){
		ret[[i+1]] <- my.projection.transform(ret[[i]],L1,L2,v1,v2,p0)
	}
	ret
}

x <- matrix(c(0,1),ncol=1)
L1 <- c(2,5)
L2 <- L1 + c(-0.1,-0.1)
v1 <- c(-1,0.6)
v2 <- c(0.1,1)
n.iter<-100
out <- my.projection.transform.n(x,L1,L2,v1,v2,n.iter)

out.mat <-matrix(0,n.iter,length(L1))
for(i in 2:length(out)){
	out.mat[i-1,] <- out[[i]]
}
plot(out.mat)
matplot(out.mat,type="l")

base1 <- base.v(v2)

# 次元を下げた平面にする
out.mat.rot <- t(t(base1) %*% t(out.mat))

plot(out.mat.rot[,-1],type="l")
  • 二つの射影(超)平面と二つの光源との関係で、両端が閉じた(場合によっては無限遠になるが)範囲に点が並ぶ。その点の間隔は初め狭く、中ほどで広く、また狭くなる、というパターンになる。
  • 二つの射影(超)平面が平行で、二つの光源を結んだ線もそれに平行だと、両端は閉じず、点の並び方は「等間隔」になる。「等間隔」というのは、射影変換のごく特殊な場合であることがわかる