球状の物体をメルカトル図法で2次元にする

MikuHatsune2016-05-23

物体をいじって球にしている。いま、球になった物体があるとして、これを2次元平面に展開して眺めたい。
地球儀が世界地図になるメルカトル図法みたいな感じ。
 
もとのうさぎは、各頂点の(離散)ガウス曲率にしたがって色付けしてある。正なら赤、0近くは灰色、負は緑である。

足の裏は平らなのでほぼ0、背中も0。凸凹に応じて赤か緑である。しっぽはでっぱっているので赤、しっぽの付け根は緑である。

 
球に位相変換したものである。正球に近づくと、半径がRとすれば、ガウス曲率はすべての頂点で\frac{1}{R^2}に近づく。
色をつけるとほとんど1色になるが、もとの頂点と辺で作られる三角形表面がどこに移動しているかを示すため、最初のうさぎの形に応じて色付けしたガウス曲率をそのまま維持しておくとする。
すると、球になったときに、もともと足の裏だったところとか、しっぽだったところの名残がわかりやすい。


 
メルカトル図法への展開は、sphereplot もしくはSphericalCubatureパッケージを使う。使ってみた感触としてはsphereplot のほうが手軽な感じがする。

library(sphereplot)
xyz <- c(1, 1, 0) # xyz 座標
s <- car2sph(x=xyz[1], y=xyz[2], z=xyz[3], deg=FALSE)

library(SphericalCubature)
rect2polar(xyz)

 
座標データをshpereplot を使って緯度・経度にする。半径はデフォルトでは地球の半径になっているので、球に変換したオブジェクトの半径にする。
半径は体積から計算できる。

s <- car2sph(x=xyz[1], y=xyz[2], z=xyz[3], deg=FALSE)
merc2d <- mercator(s[,1:2], r=ra)

 
メルカトル図法をやると、3次元である球を2次元展開しているから、地球儀でいうところの北極や南極が間延びする。
しかも、どうしても連続な地面が分断してしまう。
この状態で、もとの三角形を再構成すると、こんな感じのクッソ長い三角形ができる。

 
間延びするのは北極と南極で、三角形の辺がはんぱなく伸びるから、あまりにも長い辺を持つ三角形は、塗るのをやめよう、という感じにしておくと、まあ、どうにかなる。
すべての三角形の辺の長さを計算しておく。いくらか重複があるけど気にしない。

# 距離の分布
di <- c(mapply(function(x) c(dist(merc2d[ new_v$f[x,], ])), seq(nrow(new_v$f))))
dq <- quantile(di, 0.99) # 99% の三角形は塗る

plot(merc2d, pch=16, cex=0.03)
for(j in 1:nrow(new_v$f)){
  tmp <- merc2d[ new_v$f[j, c(1:3,1)],]
  if( all(c(dist(tmp[1:3,])) < dq) ){
    polygon(tmp, col=cols[j], border=NA)
  }
}

library(MASS)
x0 <- merc2d[,1]; y0 <- merc2d[, 2]
kd <- kde2d(x0, y0, c(bandwidth.nrd(x0), bandwidth.nrd(y0)), n=1000)
contour(kd, xlab="latitude",ylab="longitude", add=TRUE, col="blue", lwd=4)

 
三角形の面積でも判定しようと思った。平面上の3点(x_1, y_1), (x_2, y_2), (x_3, y_3)で囲まれる三角形の面積A
\begin{align}A&=|(x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1)|/2\\&=\begin{vmatrix}x_2-x_1 & x_3-x_1 \\ y_2-y_1 & y_3-y_1\end{vmatrix}/2\end{align}
で表されるが、辺の距離ほど分別能がよくなかったので不採用。

# 三角形の面積の分布
ai <- mapply(function(x){abs(det(merc2d[ new_v$f[x,][1:2],] - merc2d[ new_v$f[x,][3],]))/2}, seq(nrow(new_v$f)))



カーネル密度かぶせてみたりとか。