3次元の形状移行

  • 3次元の閉じた曲面の滑らかな移行とかを考えると、埋め込みとか、Harmonic スペクトル分解とか、いろいろ出てくる
  • 出てきて、何が面倒くさいかというと、いろいろな(3D画像処理とかの)手法があるけれど「これだ!」というのがない(らしい)こと
  • 球面上へのMDSとか(それは球面上の点の距離や、多様体上の距離やの相対的な関係を保つ方法)(こちら)→点間距離よりは三角形面積の相対値を保持、とかの方がよさそうだが…
  • ラプラシアン行列を持ち出してきて、その最適化をするとか(こちら)
  • Harmonics(こちらこちら。そもそもHarmonicsを調べるにはこちら)
  • 球面embeddingはそもそもSLE曲線の話のこの論文から始めた話題だったのだが
  • 単位球にすることがUniformizationというのだが、それの任意次元版だったり(こちら)
  • どれも、うーーーん、自分の価値判断的にはいまいちだ
  • じゃあ…
  • 今、二次元空間の円の変形は、複素数を用いた共形変換で、それなりに納得がいっているから、それの組み合わせでできないの?というのをやってみる
  • 単純に、3次元から3通りの相互に直交する2方向ペアを作り、そこを複素平面と見立てて、それぞれに多項式表示される共形変換をする。ただし、3つの変換を順番にするのではなく(そうすると、変換に順序が出て、方向に序列が入るから)、それぞれの変換による増分を、全変換の分だけ足し合わせてやる、っていうのはどうだろう?

  • これ、結構、よくないですか?しかも、推定するべき、変換係数のハンドリングも楽そうだし…
n <- 1000
X <- matrix(rnorm(n*3),ncol=3)
X <- X/sqrt(apply(X^2,1,sum))
library(rgl)
plot3d(X)

my.plot3d.asp <- function(X,asp=TRUE,col,type="b"){
	if(asp){
		X. <- rbind(X,rep(max(X),length(X[1,])),rep(min(X),length(X[1,])))
		
		if(is.null(col)){
			tmp <- c(rep(0,length(X[,1])),rep(1,2))
			col <-rgb(tmp,tmp,tmp)
		}else{
			col <- c(col,rgb(c(1,1),c(1,1),c(1,1)))
		}
		plot3d(X.,col=col,type=type)
	}else{
		plot3d(X,col=col,type=type)
	}
}

X <- X + 5
d <- 3
#as <- rnorm(d) + runif(d)*1i
#my.plot3d.asp(X)

theta <- seq(from=0,to=2*pi,length=50)
phi <- seq(from=-pi/2,to=pi/2,length=50)
thetaphi <- expand.grid(theta,phi)
X <- cbind(cos(thetaphi[,1])*cos(thetaphi[,2]),sin(thetaphi[,1])*cos(thetaphi[,2]),sin(thetaphi[,2]))

my.standard <- function(x){
	(x-min(x))/(max(x)-min(x))
}
col <- apply(X,2,my.standard)
col2 <- rgb(col[,1],col[,2],col[,3])
plot3d(X,col=col2,type="l")
X2 <- matrix(0,length(X[,1]),length(X[1,]))

for(i in 1:2){
	for(j in (i+1):3){
		tmp <- X[,c(i,j)]
		tmp.z <- tmp[,1]+tmp[,2]*1i
		as <- rnorm(d)*0.1 + rnorm(d)*1i*0.3
		tmp.z2 <- as[1]
		for(k in 2:length(as)){
			tmp.z2 <- tmp.z2 + as[k] * tmp.z^k
		}
		X2[,c(i,j)] <- X2[,c(i,j)] + cbind(Re(tmp.z2),Im(tmp.z2)) - X[,c(i,j)]
		#X[,c(i,j)] <- cbind(Re(tmp.z2),Im(tmp.z2))
		#open3d()
		#plot3d(X,col=col2,type="l")
		#my.plot3d.asp(X,asp=FALSE)
	}
}
X2 <- X2 + X
plot3d(X2,col=col2,type="l")

my.plot3d.asp(X2,asp=TRUE,type="l",col=col2)