library(rgl) # パッケージの呼び出し
open3d() # デバイスの起動
rgl.bg(color="#808080")
rgl.light(theta = 5, phi = 5)
x <- seq(-110, 110, length = 880)
y <- x
anpanman <- function(x,y) {
s(((x )/85)^2+((y )/85)^2-1) * # face
s(((x-55)/24)^2+((y +5)/24)^2-1) * # cheek
s(((x )/28)^2+((y +5)/23)^2-1) * # nose
s(((x-18)/ 9)^2+((y-40)/15)^2-1) * # eye
s((((x-18)/12)^2+((y-45)/20)^2-2) * h(y-45) + 1) * # eyebrow
s((((x )/42)^2+((y+35)/18)^2-2) * h(-y-35) + 1) # mouse
}
s <- function(z) { sin(z*pi/2) * ((z < 1) * (z > -1)) + (z >= 1)*1 + (z <= -1)*(-1) }
h <- function(z) { z>0 } # function(z) { (abs(z)/z + 1)/2 }
anpanman_view <- function(x,y) {
-abs(anpanman(abs(x),y) * 30)
}
z <- outer(x, y, anpanman_view)
col_g <- gray(0:3/3)
col <- col_g[1 + 1-((z < 3) & (z > -3))]
terrain3d(x, y, z, color=col)
方程式の正体は、楕円の方程式の組み合わせです。眉毛と口の式を工夫して、うまく楕円の半分になるようにしました。
前の二回のアンパンマンは眉毛がかけなくて悔しかったのですが、やっと完璧なアンパンマンにすることができましたよ。