- 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
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)]
}
}
X2 <- X2 + X
plot3d(X2,col=col2,type="l")
my.plot3d.asp(X2,asp=TRUE,type="l",col=col2)