LoginSignup
2
2

More than 5 years have passed since last update.

Octave で jibanyan_equation

Posted at

発端

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

ジバニャン方程式にチャレンジ

作者の Akiyah さんは Gist にプロットに使用したスクリプトをアップロードしていらっしゃいました.このスクリプトを octave 仕様に書き換えます.

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

xr0038/jibanyan_equation.matlab - Gist

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 における無名関数と呼ばれる記法で,コマンドラインで関数を定義するときや関数内部で関数を定義したいときに役立ちます.また arrayfuncellfun に関数を渡すときや, sqp などで最適化するときに活躍します.linspace(begin,end,Ntics) で軸を定義して,meshgrid(range) で二次元の座標アレイを作成します.最後に contour(X,Y,Z,param) でコントアを描画します.R ではコントアの位置を直接指定できるようですが, octavecontour では値をまたぐように設定する必要があります.ここでは 0 にコントアを引くために位置を [-eps eps] と指定しています.

下のツイートは最初にテストとして surface で描いてみたものです.バージョンアップする前の数式を使ったプロットなのでちょっと間違っているような気がします.

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

参考資料

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2