数日前、ジバニャン方程式というのを見かけました。結構話題になっているようです。
ジバニャン方程式をついに発見した
https://t.co/6ADdU4LGyw pic.twitter.com/CEtNYcb80x
— Akiya Mizukoshi (@Akiyah) 2014, 11月 12
素晴らしい!
と思ったわけですが、最初はまあWolfram alphaのperson curveだろうと思っていたわけです。
ところが今日、ちょっと中を見てみたら、どうやらそれは間違いだったようです。 いや、素晴らしい!
なんとこのジバニャン方程式、実は2次元平面上の曲線ではなく、3次元空間上の曲面です。 このジバニャン曲面をある平面で切り取った時の輪郭がジバニャンの姿として現れるというわけです。
3次元といえばOpenGL、OpenGLといえばrgl、ということで。
まずジバニャン曲面の準備。WebGL用にポリゴン数は減らしてあります。R上で動かすならもっと多くても大丈夫。
# @Akiyah さんによるジバニャン曲面
jibanyan_equation <- function(x,y) {
min(max(min(1-(x/108)^2-(y/94)^2,y),min(1-((abs(x)-119)/103)^2-((y-56)/86)^2,1-((abs(x)-15)/77)^2-((y-119)/100)^2),1-((abs(x)-42)/66)^2-(y/55)^2,min(55+y,51-abs(x),-y)),3*abs(y-100)-2*(x-75)) *
min(min(max(min(1-(x/106)^2-(y/92)^2,y),min(1-((abs(x)-119)/101)^2-((y-56)/84)^2,((abs(x)-99)/40)^2+((y-54)/86)^2-1,92-abs(x)),1-((abs(x)-42)/64)^2-(y/53)^2),min(((abs(x)-52)/26)^2+((y+28)/26)^2-1,((abs(x)-51)/13)^2+(y/13)^2-1,max(abs(x)-51,y))),abs(x/51+10/51*sin(abs(y/61.2)^(1.2)*pi*(7/2)))^(2/3)+abs(y/61.2)^(2/3)-1) *
min(1-(x/32)^2-((y+30)/32)^2,1-((abs(x)+5)/22)^2-((y-18)/22)^2) *
min(1-((abs(x)-18)/20)^2-((y+10)/20)^2,((abs(x)-20)/22)^2+((y+7)/20)^2-1) *
(1-((abs(x)-51)/11)^2-(y/11)^2)
}
x <- y <- seq(-150, 150, length=50)
z <- outer(x,x, Vectorize(jibanyan_equation))
ジバニャン曲面を可視化してみます。マウスでグリグリ動かせるのでどうぞ。
clear3d(type = "all")
light3d(diffuse="gray90", specular="gray90")
bg3d("gray10")
surface3d(x, y, z, color = "#FFFFFF")
aspect3d(TRUE)
view3d(30, -30, zoom = 1)
You must enable Javascript to view this page properly.
どこにジバニャンがいるのか全くわかりません。 まるで妖怪ウォッチを身につけていない友達のように・・・。
さて、これをz=0
なる平面でクリッピングしてみます。
clear3d(type = "all")
light3d(diffuse="gray90", specular="gray90")
bg3d("gray10")
surface3d(x, y, z, color = "#FFFFFF")
aspect3d(TRUE)
clipplanes3d(0, 0, 1, 0)
view3d(30, -30, zoom = 1)
You must enable Javascript to view this page properly.
ジバニャン、キタ━━━━(゚∀゚)━━━━!!
これもマウスでグリグリできます。 画質が粗いのはポリゴン数を減らしてるからと、輪郭線作ってるわけじゃなくてクリッピングしてるだけなのが理由です。 ジバニャン曲面が悪いわけではありません。
z=0
なる平面というのが肝で、クリッピング平面がずれるとダメです。これはz=100
の平面でクリッピングした場合。
clear3d(type = "all")
light3d(diffuse="gray90", specular="gray90")
bg3d("gray10")
surface3d(x, y, z, color = "#FFFFFF")
aspect3d(TRUE)
clipplanes3d(0, 0, 1, -100)
view3d(30, -30, zoom = 1)
You must enable Javascript to view this page properly.
うーん、面影はありますが、ジバニャンとは言えませんね。
この世で起きる不可解な出来事は、全て妖怪の仕業。 そんな妖怪達を見ることが出来る腕時計こそが妖怪ウォッチです。
実はこの世は妖怪曲面だらけで、 妖怪ウォッチがクリップ平面をつくってるのかもしれませんね。
深いわー