Githubおもしろリポジトリ① ~面白そうなグラフィック系のリポジトリを発見したので試してみた~


経緯

前にgithubのトレンドリポジトリから情報を定期通知するという記事を書いたのですが、それを通じて、面白そうなリポジトリを発見したので共有します。今回はtaichiを紹介します。これシリーズ化しようかな(笑)。
追記: シリーズ化しました。目次はこちらです。

taichiとは

Taichi (太极) is a programming language designed for high-performance computer graphics.
リポジトリの最初に上のように書かれているのですが、taichiがプログラミング言語なのかはわかりません。taichiはpythonで書かれたコンピュータグラフィックスのためのライブラリだと、勝手に解釈してます(笑)。違ったら教えてください。
追記: ドキュメントを見ると、taichiはdomain-specific language (DSL)だと書いてありました。DSLについてはこちらをどうぞ。

試してみた

導入はpipでtaichi入れるだけです。自分はcudaを使ったgpuモードでやってみました。cpuモードもあるみたいですが、試してはいません。

pip install taichi
git clone https://github.com/taichi-dev/taichi.git

taichiリポジトリの中にexmaplesフォルダがあり、その中にたくさん使用例があります。今回はfractal.pyのコードを共有します。数学詳しい友人に聞くとフラクタルという数学の概念?を使っているそうです。今回は試すだけので、深入りはしません(笑)。

fractal.py
import taichi as ti

ti.init(arch=ti.gpu)

n = 320
pixels = ti.field(dtype=float, shape=(n * 2, n))


@ti.func
def complex_sqr(z):
    return ti.Vector([z[0]**2 - z[1]**2, z[1] * z[0] * 2])


@ti.kernel
def paint(t: float):
    for i, j in pixels:  # Parallized over all pixels
        c = ti.Vector([-0.8, ti.cos(t) * 0.2])
        z = ti.Vector([i / n - 1, j / n - 0.5]) * 2
        iterations = 0
        while z.norm() < 20 and iterations < 50:
            z = complex_sqr(z) + c
            iterations += 1
        pixels[i, j] = 1 - iterations * 0.02


gui = ti.GUI("Julia Set", res=(n * 2, n))

for i in range(1000000):
    paint(i * 0.03)
    gui.set_image(pixels)
    gui.show()

これを実行するとこんな感じになります。

なんかわかんないけど、すごいですね(笑)。

その他

他の使用例もいくつか載せておきます。

点と点が繋がって面白いやつ

水の波紋みたいなやつ

煙を操れます

まとめ

taichiすごく面白いけど、プログラムに使われてる数学とか物理の知識が自分に足りなさすぎる。勉強します(笑)。

間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。