non vorrei lavorare

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

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

おはようございます。この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')

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

関連記事

150行の量子コンピューターのシミュレーターのコードを知って学んだこと

おはようございます。4月から次男は一人で保育園に通ってます。しかし、登園前に長男と保育園からの同級生と一緒に小学校そばまで一緒に行ってから登園してます。kjunichiです。

背景

ハッカーニュースでPythonで書かれた150行の量子コンピューターのシミュレーター知った

github.com

表題日本語で訳してツイートしたら、思った以上にTLでの反響があった

学んだこと

いきなり、手元の環境では以下のエラーが出力されて動かない

Traceback (most recent call last):
  File "examples.py", line 45, in <module>
    print('NOT Gate: |' + NOT.measure() + '>')
  File "/Users/junichi/work/python/QuSimPy/QuSim.py", line 147, in measure
    self.numQubits
  File "/Users/junichi/.pyenv/versions/3.6.1/lib/python3.6/site-packages/numpy/core/numeric.py", line 2039, in binary_repr
    binary = bin(num)[2:]
TypeError: only integer scalar arrays can be converted to a scalar index

でも、WindowsのAnacondaでは動いた。

ちょっと調べたらNumpyのバージョンが古いと動く模様

使用しているnumpyのバージョンを調べるには

import numpy as np

print(np.version.version)

ということを以下のURLで知った。

自力でエラーに対応した

numpy#binary_reprでとうもスカラ値を入れれば良さそうな事が 察知できたので、以下の様にnp.random.choiceで得られる配列の 先頭を取得するように修正した。

np.random.choice(results, 1,p=self.probabilities)[0],

さらに良い方法

ハッカーニュースで紹介されたからか、同様の事象がすぐにIssue挙げられて、

翌日みたら、以下のように

np.random.choice(results, p=self.probabilities),

random.choiceの第二引数の指定が消されていた、これで、 ランダムに1つだけ選択してスカラ値が取れる模様。

参考資料

もう一年くらい前かIBMクラウド量子コンピューターを一般公開していた 事を思い出し、ちょっとググったら、当時は英語だった気がするが、日本語のページを発見

www.ibm.com

TLで「量子コンピューター」で検索したら日銀の公式で論文紹介していたヤツ

まとめ

当初は、動いたり、動かなかったりするのが量子コンピューターなのかも?そこも含めて シミュレーションしているのかなどとも考えたりした。

学べたこと

  • numpyのバージョンの調べ方
  • numpy#binary_reprの引数の指定方法
  • numpy#random.choiceの結果をスカラ値で取得する方法

関連記事

10年前の記事

2018年第1四半期振り返り

おはようございます。この4月から長男が小学生になって新しい生活が始まったkjunichiです。

全体

良かった点

  • homebrigeつかうとSiriが意外と使えるかもという知見を得た
  • すべての日に記事が書けた(N年前の記事で365日どの日に今後書いてもなにか記事がある状態に)
  • minecraftがすこし分かってきた。
  • plv8のWindows版のプルリクを更新できそう
  • Blenderも少し出来た
  • Three.jsでオープンワールドなゲームを少し作り始めた
  • ImageMagickとGraphicsMagickのAPIの違いが学べた

課題

  • plv8のWindows版のプルリクを更新
  • Youtuber活動がやれなかった。
  • mruby-mrmagickでのフォント関連の対応
  • Linux用にM.2タイプのSSD買ったのに全然起動していない

月別

1月

記事

2月

記事

3月

記事

関連