『昼夜逆転』工作室
[トップページへ戻る]

マンデルブロ集合 改良版

タイトル画像

2025年6月

先日作成した「マンデルブロ集合(ESP32-C3使用)」を改良しました。 自作のジョイスティックライブラリの試用目的でしたが、 高速描画アルゴリズムを導入、一回り大きな画面に交換、ケースも作成して作品らしく仕上げてみました。

特徴・動作概要

使い方

拡大の制約

1回の拡大操作で拡大レベルが1上がります。1レベル上がるごとに解像度は4倍になります。 マンデルブロ集合自体に拡大の上限はありませんが、プログラム上はdouble型の精度による制約を受けます レベル24で4^24倍(約280兆倍)となり、このあたりで集合領域の区間がdouble型の精度では表現できなくなります。レベル25以上は描画が粗くなります。
※集合領域の縦横の長さ(+Reと-Reの差、+Imと-Imの差)が32bit-double型において計算上なくなってしまうので。

ソフトウェア

マンデルブロ集合の高速描画アルゴリズム

いくつか知られている高速化の方法のうち、境界探索アルゴリズムを利用します。 当アプリでは適度に狭い領域内で計算の反復回数が同じになるかどうかを判定しています。

ジョイスティックライブラリ

前作はボタン2つで同時押しも駆使して操作していました。 これがあまりにも使いづらく、直感的にも操作が分かりにくいので方向入力ができるデバイスに変更することにしました。 十字ボタンだと通常はGPIOを4つ使うことになります。 ESP32-C3-WROOMにはGPIOの数に余裕がないのでアナログレバーを使うことにしました。GPIOは2つで済みます。
これに合わせてジョイスティックライブラリを作成しました。X軸/Y軸のADC値を取得し、レバーの入力方向のオン/オフを判定するものです。  ※当アプリではアナログレバーとしては使用していない。
後にジョイスティックライブラリは、複数のボタンスイッチの入力にも対応したゲームパッドライブラリへ拡張されました。

動作確認環境

ピンアサイン

ESP32-C3 部品
GPIO_NUM_10 (SPI-SS) LCD-CS
GPIO_NUM_7 (SPI-MOSI) LCD-SDA
GPIO_NUM_6 (SPI-SCK) LCD-SCL
GPIO_NUM_4 LCD-DC
GPIO_NUM_0 Joystick-AxisX
GPIO_NUM_1 Joystick-AxisY
GPIO_NUM_3 Joystick-PushSwitch

プログラム公開先

GitHub - ESP32-C3 マンデルブロ集合(ジョイスティックライブラリ応用作)

制作物の様子

作品の様子 作品の様子
作品の様子 作品の様子 作品の様子 作品の様子
作品の様子 作品の様子 作品の様子

ケースはプラ板で試作、形状を確認したあと3Dプリンタで作成。 その際、4方向制限のガードも何個か作ってみましたが、レバーキャップの形状が球面ではないことに気付き、ガード部品は作れないことが分かりました。 レバーキャップの曲面はラグビーボール状なので、レバーを倒すとキャップの裾部分がガードの内側でつっかえるか、頭頂部分がガードの外側でつっかえます。 一般的なゲームパッドにこのようなガードは付いておらず、レバー入力を4方向/2方向に制限するならソフト側で対応するのが普通のようです。

X(Twitter)の一連の投稿

◆ ◆ ◆

「ちょっと作ってみよう」だったものが、操作系を改良したりケースを作成したりで一丁前の作品に仕上がりました。 中身はマンデルブロ集合描画専用機なんですけどね。