non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

陰関数の仮想3D空間へのプロットあるいは、ラズパイ版マインクラフト(mcpi)にたけのこの里を出す

おはようございます。この4月から小学校生活の始まった長男。早速呼び出しがかかり先日保健室へ引取りに行ったkjunichiです。

陰関数とは

x2+y2+z2=1

のような形をしてy=で表現していない形式の関数をそう呼んでいるようです。 Wikipediaの説明読んでも数学を専門的にやってないので、記事の書く際の説明の 参考にならなかった。。

どうすればプロットできるのか

答え:数値を代入して試す

そうはいってももう少し説明すると

上の例だと、x2+y2+z2-1=0と式を変形した、 左辺=0 にして、左辺が正、負が変化するx,y,zをプロットして つなげれば、おおよその式が満たす曲面が描画される。

仮想3D空間にプロットする

曲面を構成する点から面をつくるのは難しい

曲面を構成する点から面をつくるのは、特許がきれたマーチングキューブ法を用いるのが 常套手段の模様。

しかし、これ、自前で実装するの面倒。

仮想3D空間にプロットする

立方体でプロットすればなめらかな面は表現できないが、数式のおおよその概形は 掴めるのでは?

マインクラフトPi版はPythonでブロックを任意の座標における。 具体的には以下の様にPythonで記述することで実現できる。

setBlock(x,y,z,id,[data])

陰関数の良さげな式を見つけた

TLでたけのこの里を数式にされた方の以下のツイートを見かけた。

実はこの式が陰関数形式であって、これを自前でプロットしてみたくなり、試行錯誤している最中に Minecraft Pi Editionでプロット出来るのでは?となりやり始めた。

成果物

f:id:kjw_junichi:20180421080916p:plain

遊び方

git clone https://github.com/kjunichi/mcpi-takenoko.git
cd mcpi-takenoko
python3 takenoko.py

そのままPlotをクリックするとたけのこの里の式のプロット結果が出現する。

応用編

preset以外にもいろいろな数式を試して描画してみるとなにか発見があるかも!?

学べたこと

Raspberry Piでの画面キャプチャー

Raspberry Pi版マインクラフトの画面をキャプチャーするには普通のXの画面キャプチャーツールだと、ウィンドウが真っ黒になってしまう。 これはRaspberry Pi版マインクラフトがGPUを使って描画している為と思われる。

このツールで無事キャプチャー出来た。

入力された数式のチェック

astモジュールを使って、 構文中に文字列を含んだらNGにすることで、

import os
os.system('rm ./daijinafile.txt')

のような危険な入力を防ぐ工夫をしてみた。

関連記事