Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで描く葉序(ようじょ)パターン ― フィボナッチ螺旋の美しさをコードで再現


葉序パターンとは?

植物学の授業や植物の世界でよく耳にする「葉序(ようじょ)」とは、植物の茎に花・葉・種子などがどのような順序で配置されるかを表す用語です。この配置は、いわゆる「フィボナッチ螺旋」と非常によく似たパターンを示します。

フィボナッチ螺旋は、パスカルの三角形にも似た規則性を持つ数列、すなわちフィボナッチ数列に基づいています。フィボナッチ数列は次のように続きます。

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 …

この数列の特徴は、各項が直前の2つの数の和になっているという点です。自然界のあらゆる場所に潜む、シンプルながら奥深い数理構造と言えます。

フィボナッチ螺旋と私たちの視覚

人間は、周囲の物体を理解するとき、無意識のうちに対称性やパターンを探しています。そのため、私たちの目は気づかぬままフィボナッチ数列を捉え、例えばヒマワリの花であれば、その種の並びをフィボナッチ螺旋として認識しているのです。

実行結果のイメージ

Pythonで描く葉序(ようじょ)パターン ― フィボナッチ螺旋の美しさをコードで再現


Pythonで描く葉序(ようじょ)パターン ― フィボナッチ螺旋の美しさをコードで再現

ヒマワリの螺旋パターン

サンプルコード

以下は、Python標準ライブラリの turtle モジュールを使って葉序パターンを描画するサンプルコードです。math モジュールと組み合わせ、黄金角(約137.508度)に基づいて円を螺旋状に配置していきます。

import math
import turtle

def PhyllotacticPattern( t, petalstart, angle = 137.508, size = 2, cspread = 4 ):
    """print a pattern of circles using spiral phyllotactic data"""
    # initialize position
    turtle.pen(outline=1,pencolor="black",fillcolor="orange")
    # turtle.color("orange")
    phi = angle * ( math.pi / 180.0 )
    xcenter = 0.0
    ycenter = 0.0

    # for loops iterate in this case from the first value until < 4, so
    for n in range (0,t):
        r = cspread * math.sqrt(n)
        theta = n * phi

        x = r * math.cos(theta) + xcenter
        y = r * math.sin(theta) + ycenter

        # move the turtle to that position and draw
        turtle.up()
        turtle.setpos(x,y)
        turtle.down()
        # orient the turtle correctly
        turtle.setheading(n * angle)
        if n > petalstart-1:
            #turtle.color("yellow")
            drawPetal(x,y)
        else: turtle.stamp()

def drawPetal( x, y ):
   turtle.up()
   turtle.setpos(x,y)
   turtle.down()
   turtle.begin_fill()
   #turtle.fill(True)
   turtle.pen(outline=1,pencolor="black",fillcolor="yellow")
   turtle.right(25)
   turtle.forward(100)
   turtle.left(45)
   turtle.forward(100)
   turtle.left(140)
   turtle.forward(100)
   turtle.left(45)
   turtle.forward(100)
   turtle.up()
   turtle.end_fill() # this is needed to complete the last petal

turtle.shape("turtle")
turtle.speed(0) # make the turtle go as fast as possible
PhyllotacticPattern( 200, 160, 137.508, 4, 10 )
turtle.exitonclick() # lets you x out of the window when outside of idle

コードのポイント

  • 黄金角(137.508度):各要素を回転させながら配置する角度です。この角度を使うことで、点同士が重ならず均等に分散した美しい螺旋が生まれます。
  • r = cspread * sqrt(n):中心からの距離を平方根で増加させることで、自然な葉序配置を再現します。
  • drawPetal関数:一定数以上の要素からは円ではなく花びらを描画し、ヒマワリらしい見た目を作り出します。

アレンジ例

Pythonで描く葉序(ようじょ)パターン ― フィボナッチ螺旋の美しさをコードで再現

上記のプログラムに少し手を加えるだけで、出力結果は次のように変化します。色をカスタマイズしたり、角度や間隔などの値を調整したりすることで、さまざまなバリエーションを楽しむことができます。

Pythonで描く葉序(ようじょ)パターン ― フィボナッチ螺旋の美しさをコードで再現

ぜひ、自分好みのパラメータを試して、自然界にひそむフィボナッチの美しさをPythonで体感してみてください。


  1. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実

  2. PythonのTurtleグラフィックス入門!基本メソッド一覧と図形描画サンプルコード集

    Turtle(タートル)はPythonに標準搭載された特殊な機能で、専用の描画ウィンドウ上に簡単に図形を描くことができるモジュールです。 使い方はとてもシンプルです。まずturtleモジュールをインポートし、次にウィンドウ(Screen)を作成、その後タートルオブジェクトを生成します。あとは各種メソッドを呼び出すだけで、キャンバス上に自由に描画できます。この記事では、よく使われるメソッドの一覧表と、正方形・星・六角形などの具体的な描画例をサンプルコード付きで解説します。 主なTurtleメソッド一覧 メソッド パラメータ 説明 Turtle() なし 新しいタートルオブジェクトを作成