📜  Python的叶序模式 |算法植物学的一个单元

📅  最后修改于: 2021-10-19 05:54:06             🧑  作者: Mango

叶序/叶序是植物茎上叶子的排列,叶序螺旋在自然界中形成了一类独特的图案。这个词本身来自希腊语 phullon,意思是“叶子”和出租车,意思是“安排”。基本的花卉叶序安排包括:
1. 螺旋叶序——在螺旋叶序中,单个花器官以相同的发散角在规则的时间间隔内形成。具有螺旋叶序的花的发散角约为 137.5 度,这表示遵循斐波那契数列的模式。下图显示了具有顺时针和逆时针螺旋模式的螺旋叶序模式。


需要注意的要点:

  1. 斐波那契数列通常描述自然界中发现的螺旋线。它被计算为一个系列,其中前一对数字与系列中的下一个数字相加。系列是 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 … 。
  2. 实际上有一组顺时针方向的螺旋线和一组逆时针方向的螺旋线。
  3. 花卉器官螺旋遵循一组偏移斐波那契数列的分子和分母(1/2、1/3、2/5、3/8、5/13、8/21、13/34……)。分子是返回起始原点的次数或绕轴旋转的次数。分母表示在转弯期间启动的器官数量。因此,2/5 表示绕轴旋转 2 圈和 5 个器官返回原点。
  4. 例如 – 在松树中,我们有 (2, 3)、(5, 3) 和 (5, 8) phyllotaxes,在 capituli 中找到的对是 (21, 34), (55, 34), (55, 89) , 和 (89, 144),并且在六边形鳞片菠萝上发现了三胞胎 (8, 13, 21) 或 (13, 21, 34),具体取决于标本的大小。
  5. 斐波那契数列在叶序中的普遍性通常被称为“叶序之谜”。

其他类型的花卉叶序排列是:
2. 轮生叶序,3. 单轮叶序,4. 复轮叶序 & 5. 不规则叶序

模式的形成:总结

一些植物中美丽的叶子排列,称为叶序,遵循许多微妙的数学关系。例如,向日葵头部的小花形成两个方向相反的螺旋:其中 55 个顺时针旋转,34 个逆时针旋转。出奇,

  1. 这些数字是连续的斐波那契数字。
  2. 交替斐波那契数的比率由收敛于 φ^(-2) 给出,其中 φ 是黄金比例,据说可以测量植物茎上连续叶子之间的转数:
  3. 例如:榆树和菩提树的 1/2,山毛榉和榛子的 1/3,橡树和苹果的 2/5,杨树和玫瑰的 3/8,柳树和杏仁的 5/13,等等。
  4. 植物茎上的每一片新叶子都与前一片叶子成一定角度,并且这个角度在叶子之间是恒定的:通常约为 137.5 度。

也就是说,如果你从植物的上方往下看,测量从茎到叶子的连线和下一片叶子的对应线之间的夹角,你会发现一般有一个固定的角度,称为发散度角度。
在这里,我们对 Spiral phyllotaxy 感兴趣,我们将使用海龟图形编写代码以在Python形成 Spiral Phyllotaxy 模式。

设计代码

  1. 我们将编写两个函数,一个用于绘制叶序图案,另一个用于绘制花瓣。
  2. 花瓣需要绘制后,才叶序格局completed.So,我们将调用drawPetal()函数从上一次的x和y坐标的drawPhyllPattern()函数中绘制叶序模式之后被访问。
  3. drawPetal()函数将绘制带有海龟功能和特征的花瓣,参考海龟编程。

要对叶序模式进行编码,我们需要遵循以下等式:

x = r*cos(θ)
y = r*sin(θ)

r, θ can also vary - so the to form phyllotactic pattern we substitutethe cartesian form
by polar form:

r = c*sqrt(n)
θ = n*137.508°

Reduces the problem to optimal packing on a disc, so
    r = c*sqrt(n) is from the area of the circle
        Area = πr² and n fills the Area in some units
        c1 * n/π = r²,    c is 1/sqrt(c1/π)
So, r = some constant c * sqrt(n)

伪代码:叶序模式

IMPORT MODULES ( MATH, TURTLE )

FUNCTION - DrawPhyllotaxisPattern( turtle, t length, petalstart, angle = 137.508, size, cspread)
    turtleColor("Black")
    FillColor('"Orange")
    Convert angle to radians (Φ)
    initialize ( xcenter,ycenter ) = ( 0,0 )
    Drawing the Pattern Starts:
    For n in Range ( 0,t ):
        r = cspread * sqrt(n)
        θ = n * Φ

        x = r * cos(θ) + xcenter
            y = r * sin(θ) + ycenter

        TURTLE POSITION(x,y)
        START DRAWING():
        if Drawing pattern ends:
            DrawFlowerPetals()
 
FUNCTION - DrawFlowerPetals(Turtle, x coordinate, y coordinate)
    DRAW using Turtle methods

Create Turtle  =  gfg
Call DrawPhyllotaxisPattern( gfg, t length, petalstart, angle = 137.508, size, cspread)

END
Python Pattern A
import math       
import turtle
  
def drawPhyllPattern(turtle, 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('black')
    turtle.fillcolor("orange")
    phi = angle * ( math.pi / 180.0 ) #we convert to radian
    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(turtle, x, y)
        else: turtle.stamp()
              
  
def drawPetal(turtle, x, y ):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.color('black')
    turtle.fillcolor('yellow')
    turtle.begin_fill()
    turtle.right(20)
    turtle.forward(70)
    turtle.left(40)
    turtle.forward(70)
    turtle.left(140)
    turtle.forward(70)
    turtle.left(40)
    turtle.forward(70)
    turtle.penup()
    turtle.end_fill() # this is needed to complete the last petal
  
  
gfg = turtle.Turtle()
gfg.shape("turtle")
gfg.speed(0) # make the turtle go as fast as possible
drawPhyllPattern(gfg, 200, 160, 137.508 )
gfg.penup()
gfg.forward(1000)


Python Pattern B
import math       
import turtle
  
def drawPhyllotacticPattern( 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(20)
        turtle.forward(100)
        turtle.left(40)
        turtle.forward(100)
        turtle.left(140)
        turtle.forward(100)
        turtle.left(40)
        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
drawPhyllotacticPattern( 200, 160, 137.508, 4, 10 )
turtle.exitonclick() # lets you x out of the window when outside of idle


输出:叶序模式。

来源:

  • Deborah R. Fowler 的Python和海龟图形
  • Deborah R. Fowler 的叶序模式
  • Deborah R. Fowler 的Python实现
  • www.sciteneg.com/PhiTaxis/
  • 叶序:自然界中的斐波那契数列
  • algorithmicbotany.org 论文