はじめに

数日前、ジバニャン方程式というのを見かけました。結構話題になっているようです。

素晴らしい!

と思ったわけですが、最初はまあ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)