Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】made a fractal tree thing when bored, forgot about it, then it solved a problem i was stuck on for days

2025年09月19日に「Dev.to」が公開したITニュース「made a fractal tree thing when bored, forgot about it, then it solved a problem i was stuck on for days」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

暇つぶしで作成したフラクタルツリーのコードが、後日、別のプロジェクトで直面したツリーレイアウト問題の解決策となった。枝が成長し子を生み出す仕組みが、複雑なツリー構造の効率的な描画に応用できた事例だ。

ITニュース解説

退屈しのぎに作られたフラクタルツリーのプログラムが、後日、別の問題解決に大いに役立ったという興味深い事例が紹介されている。このプログラムは、わずか1時間ほどの作業で作成されたものだったが、数ヶ月後に開発者が直面していたインタラクティブフィクションツール「Pathforge」におけるストーリーノードのツリーレイアウトという、難航していた問題の解決策となった。

フラクタルツリーとは、自然界の木の枝分かれのように、全体と部分が同じ形をしている「自己相似性」を持つ図形のことだ。プログラミングでこのような図形を生成するには、枝が一定のルールに従って分岐し、その子孫もまた同じルールで分岐を繰り返す、という再帰的な構造を実装するのが一般的である。

このプログラムの中核は「Branch(枝)」というクラスで表現されている。クラスとは、現実世界のものをコンピュータ上で表現するための設計図のようなものだと考えると良い。この設計図から具体的な「枝」のオブジェクト(実体)がいくつも作られ、それぞれが独立して振る舞う。

Branchクラスが持つデータ、つまり「属性」には、枝の「スタート地点(start)」、生える「角度(angle)」、現在の「長さ(length)」、目標とする「長さ(target_length)」、そして木のどの階層にいるかを示す「深さ(depth)」などがある。その他にも、枝の成長が完了したかを示す「finished」フラグ、自身から伸びる「子どもの枝(children)」を格納するリストなどが定義されている。

次に、このBranchクラスの「振る舞い」を定義するのが「grow(成長)」というメソッドだ。メソッドとは、クラスに属する具体的な処理のことで、ここでは枝を成長させるためのロジックが記述されている。

growメソッドが呼び出されると、まず枝の現在の長さ(self.length)が、目標とする長さ(self.target_length)に達しているかどうかが確認される。もし現在の長さが目標の長さに満たない場合、枝は一定の速度(GROWTH_SPEED)で少しずつ長くなる。これにより、枝が徐々に伸びていくアニメーションのような表現が可能になる。

枝が目標の長さに到達すると、今度は新しい枝、つまり「子どもの枝」を生み出すフェーズに移る。ただし、枝は一度成長を終えたら、それ以上子どもを増やさないように「finished」フラグが真に設定される。また、木の深さ(depth)が最大値(MAX_DEPTH)を超えている場合は、それ以上枝は生えないように制御される。

新しい子どもの枝が生成されるとき、そのスタート地点は親の枝の終点となる。子どもの枝の「角度」は、親の枝の角度を基準に、ランダムな範囲(-BRANCH_ANGLEからBRANCH_ANGLEまで)で少しずらされる。これにより、すべての枝が同じ方向を向くのではなく、自然で不規則な広がりが生まれる。

さらに、子どもの枝の「長さ」も、親の枝の長さの0.8倍から「BRANCH_FACTOR」倍の間でランダムに決定される。これにより、すべての枝が均一に伸びるのではなく、短い枝や長い枝が混在し、より有機的な見た目になる。また、ある程度短い枝は生成しないように、「MIN_BRANCH_LENGTH」という最小値も設けられている。

このようにして生成された子どもの枝は、現在の枝の「children」リストに追加される。そして、これらの子どもの枝もまた、それぞれが自身のgrowメソッドを呼び出し、同じルールに従って成長し、さらに孫の枝を生み出していく。この自己参照的な仕組みが、フラクタルツリーの無限とも思える複雑な構造を作り出す原動力となっているのだ。

このフラクタルツリーの生成ロジックは、開発者が数日間も悩んでいた「Pathforge」というインタラクティブフィクションツールにおける、ストーリーノードのツリーレイアウト問題に応用された。Pathforgeでは、物語の分岐や展開を示すノードを、視覚的に分かりやすいツリー構造で表示する必要があった。しかし、複雑な物語の構造を自動で美しくレイアウトするのは非常に難しい課題だった。

そこで、退屈しのぎに作ったフラクタルツリーのプログラムを思い出し、その枝の成長と分岐のロジックが、ストーリーノードの自然な配置に使えるのではないかと閃いた。結果として、このプログラムはPathforgeのツリーレイアウトとして見事に機能し、開発者を悩ませていた問題が解決されたのだ。

この事例は、プログラミングにおける思わぬ発見や、遊び心から生まれた成果が、後に実用的な大きな問題解決に繋がることがあるという貴重な教訓を示している。目の前の課題に直接関係なく思えるコードや実験も、長期的に見れば新たな視点や解決策をもたらす可能性を秘めていると言えるだろう。システムエンジニアを目指す上では、好奇心を持って様々なコードに触れ、試行錯誤する姿勢が非常に重要であることを示唆している。

関連コンテンツ