简介 |龙曲线
龙曲线是递归的不相交曲线,也称为哈特-海威龙曲线或侏罗纪公园龙曲线。它是一条数学曲线,可以通过递归方法(例如 Lindenmayer 系统)来近似。
Lindenmayer 系统: Lindenmayer 系统,也称为 L 系统,是一种字符串重写系统,可用于生成分形。两个主要领域包括分形的生成和植物的逼真建模。 Lindenmayer 系统从字符串称为公理的符号开始,并将一组用于重写公理的产生式规则应用于公理。递归 L 系统更有趣,因为它将符号替换为自身的副本加上一些额外的东西。 L 系统遵循一些规则:
An L-system is a formal grammar consisting of 4 parts:
1. A set of variables: symbols that can be replaced by production rules.
2. A set of constants: symbols that do not get replaced.e.g: !, [, ], +, -.
3. A single axiom: a string & is the initial state of the system.
4. A set of production rules: defining the way/rule variables can be replaced.
让我们以以下 L 系统为例:
L-系统规则
Recursion L-System | |
---|---|
axiom | skk |
rules | s = ksk |
generation 1: | (ksk)kk = kskkk |
generation 2: | k(ksk)kkk = kkskkkk |
generation 3: | kk(ksk)kkkk = kkkskkkkk |
gen 1 takes help of gen 0 (axiom)
generation 1 -> apply rule in generation 0
generation 0 = skk
replace s with "ksk" in gen 0 to get gen 1
gen 1 = (s)kk = (ksk)kk = kskskk
replace s with "ksk" in gen 1 to get gen 2
Iterate the same rule for all generations
递归 L 系统,通常会产生在多个尺度上自相似的错综复杂的模式。这些复杂的模式可以在基于海龟图形的 L 系统的图形解释的帮助下进行可视化。当 L 系统与海龟一起使用时在图形中,海龟的状态被定义为四元组 (x, y, a, c)。笛卡尔坐标 (x, y) 表示海龟的位置。称为航向的角度 a 被解释为海龟面向的方向。颜色 c 被解释为海龟当前压在地板上的颜色笔,因此海龟的任何移动都会创建一条该颜色的线。给定步长 d 和角度增量 b,海龟可以根据以下指令响应 L 系统字符串中的符号:
Move forward (in the dir of the current heading) a distance d while drawing a line of color c.
The state of the turtle changes to (x', y', a, c), where
x' = x + d cos(a) and y' = y + d sin(a)
Dragon Curve L-系统
Dragon 曲线的有限逼近可以用 L-System 创建。 Dragon 曲线 L-system 可以表示为:
Dragon Curve L-System | |
---|---|
variables: | f h |
constants: | + – |
axiom: | f |
rules: | f = f-h h = f+h |
angle increment: | 90 degrees |
generation 1: | f-h |
generation 2: | f-h – f+h |
generation 3: | f-h – f+h – f-h + f+h |
generation 4: | f-h – f+h – f-h + f+h – f-h – f+h + f-h + f+h |
2 rules
/ \
replace f with f-h replace h with f+h
+ & - are constants
build up generations by following rules on axiom
gen 1 forms gen 2; gen 2 forms gen 3 and so on...
The generation 2 string is: 'f-h - f+h'
在上面的L系统中,假设乌龟的初始航向在屏幕上是向上的,那么第一个’f’会画一条直线向上。 ‘-‘ 使海龟改变其航向 90 度以直接指向左侧。 “h”在屏幕左侧直接画一条线。第二个“-”符号再次将海龟向左旋转 90 度,它位于屏幕的正下方。 f 符号在向下方向绘制一条单位长度的线。字符串的最后一个转向符号是一个“+”,它将海龟向右旋转 90 度。然而,由于海龟当前的航向是向下的,它的右边是屏幕的左边,所以海龟的航向也是在屏幕的左边。最后,h 符号在屏幕左侧绘制一条单位长度的线。因此我们得到了彩色的结果图像。
如果我们继续形成更多代,我们会得到美丽的曲线,称为龙曲线。正如我们在下面看到的,随着我们几代人的成长,曲线变得更加复杂和复杂。
迭代 3:
迭代 9:
使用纸的龙曲线
这些龙曲线也可以通过折纸来形成:概念如此简单,但潜力却是惊人的。取一条长纸,对折。你会得到一条折叠起来的纸条!重新折叠纸张,然后再次对折。当你向内看时,你有两个朝一个方向的折叠,一个朝另一个方向的折叠。重新折叠并再次对折,当你展开时,你会得到更多的折叠,有些是一个方向,有些是另一个。
展开条带并沿着每条折叠线做一个牢固的折痕,注意保持正确的折叠方向。将条带放在边缘,每个折叠形成 90 度角,然后向下看。您会看到错综复杂的正方形图案和曲折。这些条带得名龙曲线,因为经过几次折叠后,它们开始呈现出一条大头、大腿和大尾巴的龙的外观。
Numberphile 在他们的视频中很好地解释了龙曲线的形成。您也可以在这里观看龙曲线过渡:
编程龙曲线
PSEUDOCODE
→ IMPORT TURTLE
→ TURN TURTLE - RIGHT SIDE('r') #OLD PATTERN = 'r'
→ NEW PATTERN = OLD PATTERN
→ USER INPUT [ Number of Iterations(n), Segment size, Pen color & Background color ]
→ CYCLE = 1
→ WHILE CYCLE < ITERATION :
→ FORM DRAGON CURVE L-SYSTEM
→ STORE THE PATTERN OF 'l'/'r' in NEW PATTERN
→ NEW PATTERN += OLD PATTERN
→ OLD PATTERN = NEW PATTERN
→ INCREMENT CYCLE
→ USER INPUT [Whether to display 'r'/'l' Dragon curve L-system in console]
→ INITIATE THE TURTLE TO DRAW [pencolor, bgcolor, draw right = segment size]
→ ITERATE OVER FULL L SYSTEM FOR n ITERATIONS:
→ IF CHAR == 'r'
→ DRAW RIGHT(90)
→ DRAW FORWARD(Segment Size)
→ ELSE IF CHAR == 'l'
→ DRAW LEFT(90)
→ DRAW FORWARD(Segment Size)
→ END
# import the turtle module to use turtle graphics
import turtle
# make variables for the right and left containing 'r' and 'l'
r = 'r'
l = 'l'
# assign our first iteration a right so we can build off of it
old = r
new = old
# for inputs
iteration = int(input('Enter iteration:'))
length = int(input('Enter length of each segment:'))
pencolor = input('Enter pen color:')
bgcolor = input('Enter background color:')
# set the number of times we have been creating
# the next iteration as the first
cycle = 1
# keep on generating the next iteration until desired iteration is reached
while cycle
输出 :
从 rosettacode 获取不同语言的 Dragon 曲线代码。自己检查分形会给您带来极大的乐趣。还要检查,欧拉计划:问题 220:公路龙。
参考:
- 分形形成的数学
- math.psu.edu [pdf]
- ecademy.agnesscott.edu
- 羊毛思想.com