発端
twitter を眺めていたら以下のツイートを発見しました.R
を使用して『妖怪ウォッチ』のジバニャンをプロットしたそうです.ぜひとも自分でプロットしてみたいと思いましたが,あまり R
には馴染みがないので,自分が普段使っている octave
でチャレンジしてみました.
ジバニャン方程式をついに発見した https://t.co/6ADdU4LGyw pic.twitter.com/CEtNYcb80x
— Akiya Mizukoshi (@Akiyah) November 12, 2014
ジバニャン方程式にチャレンジ
作者の Akiyah さんは Gist にプロットに使用したスクリプトをアップロードしていらっしゃいました.このスクリプトを octave
仕様に書き換えます.
もともと複雑な式であることに加えて関数の仕様が R
と octave
で少々異なる少し手間取りましたが,なんとか octave
仕様のスクリプトに変換することができました. Akiyah さんに習って僕も fork して Gist に投稿しました.
xr0038/jibanyan_equation.matlab - Gist
jibanyan_equation = @(x,y) ...
min(max(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)), ...
max(1-((abs(x)-42)/66).^2-(y/55).^2, ...
min(min(55+y,51-abs(x)),-y))),3.*abs(y-100)-2.*(x-75)) ...
.* min(min(max(max(min(1-(x/106).^2-(y/92).^2,y), ...
min(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(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 = linspace(-150,150,400)';
[xx yy] = meshgrid(x);
contour(x,x,jibanyan_equation(xx,yy),[-eps,eps]);
冒頭の jibanyan_function = @(x,y) ...
で始まる部分で関数を定義しています.これは octave
における無名関数と呼ばれる記法で,コマンドラインで関数を定義するときや関数内部で関数を定義したいときに役立ちます.また arrayfun
や cellfun
に関数を渡すときや, sqp
などで最適化するときに活躍します.linspace(begin,end,Ntics)
で軸を定義して,meshgrid(range)
で二次元の座標アレイを作成します.最後に contour(X,Y,Z,param)
でコントアを描画します.R
ではコントアの位置を直接指定できるようですが, octave
の contour
では値をまたぐように設定する必要があります.ここでは 0 にコントアを引くために位置を [-eps eps]
と指定しています.
下のツイートは最初にテストとして surface
で描いてみたものです.バージョンアップする前の数式を使ったプロットなのでちょっと間違っているような気がします.
octave で描いた jibanyan_equation https://t.co/rDKFoRkVcz pic.twitter.com/jhJGco0ENd
— どせい (@xr0038) November 12, 2014
きちんとコントアでプロットしたものがこちらです.アスペクト比の関係でちょっとぽっちゃりし過ぎな気もしますが,ちゃんとジバニャンに見えると思います.
コントアで描いたらまともに見えた! http://t.co/48KTH3FOP5 pic.twitter.com/YIoAlPaIH2
— どせい (@xr0038) November 12, 2014
参考資料
- Akiyah/jibanyan_equation - Gist
- xr0038/jibanyan_equation.matlab - Gist
- Akiya Mizukoshi on Twitter: "ジバニャン方程式をついに発見した https://t.co/6ADdU4LGyw http://t.co/CEtNYcb80x"
- どせい on Twitter: "octave で描いた jibanyan_equation https://t.co/rDKFoRkVcz http://t.co/jhJGco0ENd"
- どせい on Twitter: "コントアで描いたらまともに見えた! http://t.co/48KTH3FOP5 http://t.co/YIoAlPaIH2"