叶序/叶序是植物茎上叶子的排列,叶序螺旋在自然界中形成了一类独特的图案。这个词本身来自希腊语 phullon,意思是“叶子”和出租车,意思是“安排”。基本的花卉叶序安排包括:
1. 螺旋叶序——在螺旋叶序中,单个花器官以相同的发散角在规则的时间间隔内形成。具有螺旋叶序的花的发散角约为 137.5 度,这表示遵循斐波那契数列的模式。下图显示了具有顺时针和逆时针螺旋模式的螺旋叶序模式。
需要注意的要点:
- 斐波那契数列通常描述自然界中发现的螺旋线。它被计算为一个系列,其中前一对数字与系列中的下一个数字相加。系列是 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 … 。
- 实际上有一组顺时针方向的螺旋线和一组逆时针方向的螺旋线。
- 花卉器官螺旋遵循一组偏移斐波那契数列的分子和分母(1/2、1/3、2/5、3/8、5/13、8/21、13/34……)。分子是返回起始原点的次数或绕轴旋转的次数。分母表示在转弯期间启动的器官数量。因此,2/5 表示绕轴旋转 2 圈和 5 个器官返回原点。
- 例如 – 在松树中,我们有 (2, 3)、(5, 3) 和 (5, 8) phyllotaxes,在 capituli 中找到的对是 (21, 34), (55, 34), (55, 89) , 和 (89, 144),并且在六边形鳞片菠萝上发现了三胞胎 (8, 13, 21) 或 (13, 21, 34),具体取决于标本的大小。
- 斐波那契数列在叶序中的普遍性通常被称为“叶序之谜”。
其他类型的花卉叶序排列是:
2. 轮生叶序,3. 单轮叶序,4. 复轮叶序 & 5. 不规则叶序
模式的形成:总结
一些植物中美丽的叶子排列,称为叶序,遵循许多微妙的数学关系。例如,向日葵头部的小花形成两个方向相反的螺旋:其中 55 个顺时针旋转,34 个逆时针旋转。出奇,
- 这些数字是连续的斐波那契数字。
- 交替斐波那契数的比率由收敛于 φ^(-2) 给出,其中 φ 是黄金比例,据说可以测量植物茎上连续叶子之间的转数:
- 例如:榆树和菩提树的 1/2,山毛榉和榛子的 1/3,橡树和苹果的 2/5,杨树和玫瑰的 3/8,柳树和杏仁的 5/13,等等。
- 植物茎上的每一片新叶子都与前一片叶子成一定角度,并且这个角度在叶子之间是恒定的:通常约为 137.5 度。
也就是说,如果你从植物的上方往下看,测量从茎到叶子的连线和下一片叶子的对应线之间的夹角,你会发现一般有一个固定的角度,称为发散度角度。
在这里,我们对 Spiral phyllotaxy 感兴趣,我们将使用海龟图形编写代码以在Python形成 Spiral Phyllotaxy 模式。
设计代码
- 我们将编写两个函数,一个用于绘制叶序图案,另一个用于绘制花瓣。
- 花瓣需要绘制后,才叶序格局completed.So,我们将调用drawPetal()函数从上一次的x和y坐标的drawPhyllPattern()函数中绘制叶序模式之后被访问。
- 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 论文