- こちらで、の世界を作っている
- そこで作っている世界はぐるぐる回ったりする
- たとえば、掲載図に示すように
- 限定した世界、角のとがった世界にするために、2つの工夫をする
- (1)0から無限を有限に納める
- (2)多次元球面を平面に変える
- (1)0から無限を有限に納めるのには、1次元の無限に伸びる直線を2次元空間の点(0,1)から眺めることで実現する。
- 無限遠は角度がで、0は角度が0
- これを、無限の軸の座標→角度→角度をすることで、無限遠も含めてすべての座標をその順序変えずに有限の座標に置き換える
- (2)単位球面上の点は、これを平面に直すのに、xの符号を変えずに2乗して実現する
Cartesian2Angular<-function(x){
r<-sqrt(sum(x^2))
xst<-x/r
n<-length(xst)
t<-rep(0,n-1)
S<-C<-t
S[n-1]<-xst[n]
if(S[n-1]>1)S[n-1]<-1
if(S[n-1]<(-1))S[n-1]<-(-1)
t[n-1]<-asin(S[n-1])
C[n-1]<-cos(t[n-1])
cumC<-C[n-1]
for(i in (n-2):1){
if(cumC!=0){
S[i]<-xst[i+1]/cumC
if(S[i]>1)S[i]<-1
if(S[i]<(-1))S[i]<-(-1)
t[i]<-asin(S[i])
C[i]<-cos(t[i])
cumC<-cumC*C[i]
}else{
S[i]<-0
t[i]<-asin(S[i])
C[i]<-cos(t[i])
}
}
list(r=r,t=t)
}
Cartesian2Angular(c(0,1/sqrt(2),1/sqrt(2)))
Angular2Cartesian<-function(r,t){
n<-length(t)+1
C<-cos(t)
S<-sin(t)
C2<-cumprod(C[length(C):1])
x<-c(1,S)
x[1:(n-1)]<-x[1:(n-1)]*C2[length(C):1]
x<-x*r
x
}
x<-runif(4)
a<-Cartesian2Angular(x)
x2<-Angular2Cartesian(a$r,a$t)
x
a
x2
TangentDist<-function(R,MaxX){
tmax<-atan(MaxX)
tan(atan(R)/(pi/2)*tmax)
}
TangentDist2<-function(R,MinX,MaxX){
tmax<-atan(MaxX)
tmin<-atan(MinX)
tcurrent<-atan(R)
tan((tcurrent+pi/2)/(pi)*(tmax-tmin)+tmin)
}
TangentDist3<-function(R){
exp(R)
}
SignSquare<-function(x,k=2){
sign(x)*(abs(x))^k
}
Sphere2Simplex<-function(r,t,Maxr=1){
tmpr<-TangentDist(r,Maxr)
tmpx<-Angular2Cartesian(tmpr,t)
SignSquare(tmpx)
}
Sphere2Simplex2<-function(r,t,Minr=0,Maxr=1){
tmpr<-TangentDist2(r,Minr,Maxr)
tmpx<-Angular2Cartesian(tmpr,t)
tmpx^2
}
n<-3
Np<-1000
xs<-matrix(rnorm(n*Np),Np,n)
simplexs<-xs
simplexs2<-xs
simplexs3<-xs
for(i in 1:Np){
tmp<-Cartesian2Angular(xs[i,])
simplexs[i,]<-Sphere2Simplex(tmp$r,tmp$t)
simplexs2[i,]<-TangentDist3(simplexs2[i,])
tmp2<-Cartesian2Angular(simplexs2[i,])
simplexs3[i,]<-Sphere2Simplex(tmp2$r,tmp2$t)
}
plot3d(xs[,1],xs[,2],xs[,3],col=rainbow(Np))
open3d()
plot3d(simplexs[,1],simplexs[,2],simplexs[,3],col=rainbow(Np))
open3d()
plot3d(simplexs2[,1],simplexs2[,2],simplexs2[,3],col=rainbow(Np))
open3d()
plot3d(simplexs3[,1],simplexs3[,2],simplexs3[,3],col=rainbow(Np))
- 正負の無限大を有限に納めた
- 正のみの世界にするにはどうするか
- 上記と同じ方法でtangentを使う。そのときに「角度」をからにする代わりにからにする
- 指数関数を使うこともできる
TangentDist2<-function(R,MinX,MaxX){
tmax<-atan(MaxX)
tmin<-atan(MinX)
tcurrent<-atan(R)
tan((tcurrent+pi/2)/(pi)*(tmax-tmin)+tmin)
}
- この処理を加えることで、以下が可能
- 正の世界へ
- 正の無限大を有限に抑え
- の平面内に納める
sphereCoords<-function(v){
C<-cos(v)
S<-sin(v)
ret<-c(1,S)
for(i in 1:length(v)){
for(j in i:length(v)){
ret[i]<-ret[i]*C[j]
}
}
return(ret)
}
k<-2
incrRatio<-1
Ps<-c(7,11)
n<-1000
t<-seq(from=0,to=1,length.out=n)*2*pi
MultDimTorus3<-function(v,k){
C<-cos(v)
S<-sin(v)
ret<-rep(0,length(v)+1)
preret<-ret
for(i in 1:length(v)){
if(i==1){
ret[1]<-C[1]
ret[2]<-S[1]
}else{
incr<-ret-preret
preret<-ret
incr<-incr/sqrt(sum(incr^2))
ret<-k*ret+C[i]*incr
ret[i+1]<-S[i]
}
}
return(ret)
}
Cartesian2Angular(c(0,1/sqrt(2),1/sqrt(2)))
Cartesian2Angular(c(0,1/sqrt(2),1/sqrt(2)))
Angular2Cartesian<-function(r,t){
n<-length(t)+1
C<-abs(cos(t))
S<-sin(t)
C2<-cumprod(C[length(C):1])
x<-c(1,S)
x[1:(n-1)]<-x[1:(n-1)]*C2[length(C):1]
x[1]<-x[1]*sign(cos(t[1]))
x<-x*r
x
}
x<-runif(4)
a<-Cartesian2Angular(x)
x2<-Angular2Cartesian(a$r,a$t)
x
a
x2
library(rgl)
n<-5
Niter<-10000
xs<-matrix(0,Niter,n)
ts<-matrix(0,Niter,n-1)
ts[1,]<-runif(n-1)
r<-1
xs[1,]<-Angular2Cartesian(r,ts[1,])
ps<-rnorm(n-1)
dt<-0.01
for(i in 2:Niter){
ts[i,]<-ts[i-1,]+ps*dt
xs[i,]<-Angular2Cartesian(r,ts[i,])
}
plot3d(xs[,1],xs[,2],xs[,3],cex=0.1,col=gray((1:Niter/Niter)))
matplot(xs,type="l")
n<-3
m<-3
Ctr<-runif(n)
R<-runif(1)*min(Ctr,1-Ctr)
incrRatio<-0
Ps<-sqrt(sample(2:100,n-1,replace=TRUE))
Ps<-Ps%%(2*pi)
Nrep<-5
insideoutRatio<-0.5
xssum<-NULL
col<-c()
Niter<-1000
dt<-pi/100
k<-1
dt2<-R*0.1
dt2<-0.01
for(rep in 1:Nrep){
col<-c(col,1,rep(rep,Niter-1))
xs<-matrix(0,Niter,n)
rs<-rep(Niter)
ts<-matrix(0,Niter,n-1)
xs[1,]<-runif(n)*100
tmpr<-runif(1)
if(tmpr<insideoutRatio){
tmpr<-1/tmpr
}
xs[1,]<-Ctr+xs[1,]/sqrt(sum(xs[1,]^2))*R*tmpr
tmp<-Cartesian2Angular(xs[1,]-Ctr)
rs[1]<-tmp$r
ts[1,]<-tmp$t
for(i in 2:Niter){
DifVec<-xs[i-1,]-Ctr
DifVecLen<-sqrt(sum(DifVec^2))
ts[i,]<-ts[i-1,]+Ps*dt
rs[i]<-rs[i-1]-dt2*(DifVecLen-R)
xs[i,]<-Angular2Cartesian(rs[i],ts[i,])+Ctr
Dif<-xs[i,]-xs[i-1,]
Dif<-Dif*xs[i-1,]
tmp<-Cartesian2Angular(xs[i,]-Ctr)
}
xssum<-rbind(xssum,xs)
}
xlim<-ylim<-zlim<-c(min(xssum),max(xssum))
plot3d(xssum[,1],xssum[,2],xssum[,3],col=col,xlim=xlim,ylim=ylim,zlim=zlim)
xssum2<-xssum
for(i in 1:length(xssum[,1])){
tmpxssum2<-TangentDist3(xssum[i,])
tmp2<-Cartesian2Angular(tmpxssum2)
xssum2[i,]<-Sphere2Simplex(tmp2$r,tmp2$t)
}
xlim<-ylim<-zlim<-c(min(xssum),max(xssum))
plot3d(xssum[,1],xssum[,2],xssum[,3],col=col,xlim=xlim,ylim=ylim,zlim=zlim)
open3d()
xlim<-ylim<-zlim<-c(min(xssum2),max(xssum2))
plot3d(xssum2[,1],xssum2[,2],xssum2[,3],col=col,xlim=xlim,ylim=ylim,zlim=zlim)