Octave で jibanyan_equation

# 発端
twitter を眺めていたら以下のツイートを発見しました．`R` を使用して『妖怪ウォッチ』のジバニャンをプロットしたそうです．ぜひとも自分でプロットしてみたいと思いましたが，あまり `R` には馴染みがないので，自分が普段使っている `octave` でチャレンジしてみました．

<blockquote class="twitter-tweet" lang="en"><p>ジバニャン方程式をついに発見した&#10;<a href="https://t.co/6ADdU4LGyw">https://t.co/6ADdU4LGyw</a> <a href="http://t.co/CEtNYcb80x">pic.twitter.com/CEtNYcb80x</a></p>&mdash; Akiya Mizukoshi (@Akiyah) <a href="https://twitter.com/Akiyah/status/532331051620638720">November 12, 2014</a></blockquote>

# ジバニャン方程式にチャレンジ
作者の Akiyah さんは Gist にプロットに使用したスクリプトをアップロードしていらっしゃいました．このスクリプトを `octave` 仕様に書き換えます．

- [Akiyah/jibanyan_equation - Gist](https://gist.github.com/Akiyah/4da6d04cf7c0f6e33f94)

もともと複雑な式であることに加えて関数の仕様が `R` と `octave` で少々異なる少し手間取りましたが，なんとか `octave` 仕様のスクリプトに変換することができました． Akiyah さんに習って僕も fork して Gist に投稿しました．

[xr0038/jibanyan_equation.matlab - Gist](https://gist.github.com/xr0038/032416822ef752086234)

```octave:jibanyan_equation
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` で描いてみたものです．バージョンアップする前の数式を使ったプロットなのでちょっと間違っているような気がします．

<blockquote class="twitter-tweet" lang="en"><p>octave で描いた jibanyan_equation <a href="https://t.co/rDKFoRkVcz">https://t.co/rDKFoRkVcz</a> <a href="http://t.co/jhJGco0ENd">pic.twitter.com/jhJGco0ENd</a></p>&mdash; どせい (@xr0038) <a href="https://twitter.com/xr0038/status/532432671574462464">November 12, 2014</a></blockquote>

きちんとコントアでプロットしたものがこちらです．アスペクト比の関係でちょっとぽっちゃりし過ぎな気もしますが，ちゃんとジバニャンに見えると思います．

<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p>コントアで描いたらまともに見えた！ <a href="http://t.co/48KTH3FOP5">http://t.co/48KTH3FOP5</a> <a href="http://t.co/YIoAlPaIH2">pic.twitter.com/YIoAlPaIH2</a></p>&mdash; どせい (@xr0038) <a href="https://twitter.com/xr0038/status/532445379908759552">November 12, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


#参考資料
- [Akiyah/jibanyan_equation - Gist](https://gist.github.com/Akiyah/4da6d04cf7c0f6e33f94)
- [xr0038/jibanyan_equation.matlab - Gist](https://gist.github.com/xr0038/032416822ef752086234)
- [Akiya Mizukoshi on Twitter: "ジバニャン方程式をついに発見した https://t.co/6ADdU4LGyw http://t.co/CEtNYcb80x"](https://twitter.com/Akiyah/status/532331051620638720)
- [どせい on Twitter: "octave で描いた jibanyan_equation https://t.co/rDKFoRkVcz http://t.co/jhJGco0ENd"](https://twitter.com/xr0038/status/532432671574462464)
- [どせい on Twitter: "コントアで描いたらまともに見えた！ http://t.co/48KTH3FOP5 http://t.co/YIoAlPaIH2"](https://twitter.com/xr0038/status/532445379908759552)