[Python] マンデルブロ集合を描画して PNG 出力

  • 2022年9月16日
  • 2022年9月18日
  • Python
  • 4View
  • 0件

はじめに

マンデルブロ集合は複素数の簡単な計算で生成される図形です。
フラクタル図形のひとつであり、いくら拡大しても複雑な図形が出現するような不思議な幾何図形です。

マンデルブロ集合 – Wikipedia

Python でマンデルブロ集合を描画して、これを png として画像出力します。

マンデルブロ集合を PNG 出力

動作環境

  • Windows 11
  • WSL Ubuntu 20.04
  • Python 3.8.10

WSL ディストリビューションの複製

お試しで実行する場合は Ubuntu イメージを複製しておくのがお勧めです。
本手順は必須ではありません。

事前準備

初めに、Ubuntu パッケージを最新化しておきます。

$ sudo apt update
$ sudo apt upgrade

python パッケージをインストールするための pip をインストールします。

$ sudo apt install python3-pip

次に、画像ファイルを扱うために Pillow のパッケージをインストールします。

$ pip install Pillow

マンデルブロ集合の描画

Pillow を利用して、マンデルブロ集合を描画した png ファイルを出力します。

import PIL.Image


def is_mandelbrot(c):
    z = 0
    for i in range(200):
        z = z * z + c
        if abs(z) > 4:
            return False
    return True


def run():
    width = 1024
    height = 768
    pitch = 2.5 / height
    image = PIL.Image.new("L", (width, height))
    for w in range(width):
        for h in range(height):
            re = pitch * w - 2.5
            im = pitch * h - 1.25
            c = complex(re, im)
            pixel = 0 if is_mandelbrot(c) else 255
            image.putpixel((w, h), pixel)
    image.save("mandelbrot.png")


if __name__ == "__main__":
    run()

is_mandelbrot メソッドでは、ある複素数 c がマンデルブロ集合に属するかどうかを判定しています。
c = -2 の点がマンデルブロ集合に属するため、閾値はここから少し余裕をもって 4 としています。

マンデルブロ集合に属する点を黒色とするように描画しています。
横軸は -2.5 ~ 0.833、縦軸は -1.25 ~ 1.25 の範囲を指定しています。

$ python3 main.py

実行すると png ファイルが出力されます。
なお、Windows エクスプローラのアドレスバーに \\wsl$ と入力することで、WSL のディスク領域にアクセスすることができます。