对生长自动机的研究由来已久,并在计算机科学等众多学科中,使用元胞自动机的概念,用于生长模拟。而复杂花纹的生成,则可以通过重写一定的生长规则,使用生成式来模拟自然纹理。当然,很多纹理是由人本身设计的,其形成过程本身就是在人脑中进行“原胞生成”的过程。

基础理论抄自于基础百科。

来自于百度百科:L-系统是匈牙利生物学家Aristid LinderMayer于1968年提出的。.L-系统的本质是一个重写系统,通过对植物对象生长过程的经验式概括和抽象,初始状态与描述规则,进行有限次迭代,生成字符发展序列以表现植物的拓扑结构,并对产生的字符串进行几何解释,就能生成非常复杂的分形图形。

详细介绍

        一类动态细胞自动机,在每一(时间)步上,其中的各个细胞可以由给定状态变为一个新的状态,或消亡或分裂为具有某种状态组合的细胞串。A.林顿梅伊尔曾用这种细胞自动机描述丝状有机体的发育过程,所以叫作林顿梅伊尔系统,简称L系统
在乔姆斯基形式语言理论中,字母表被分成终结字母表和非终结字母表部分,“字”是由终结字母组成的字母序列。在L系统中,没有单独的终结字母表,所有生成的字都在系统语言中;初始字母可以被初始字所代替;被注视的字所包含的各个字母同时进行改写。每个字母代表一个细胞,用字表示细胞阵列发展的阶段。生成式对应于发展指令,这些指令的应用使有机体生长成已知类型。消亡的细胞可以用空字e表示。细胞之间可以有,也可以没有交互作用(信息传递)。有交互作用的有1L系统和2L系统。没有交互作用的叫作0L系统。
0L系统是一个三元组Γ=(Ggδ),其中G为一个有限非空集合,叫作字母表;gG中元素的非空序列,即非空字;δ为一个(转移)函数,首先取作从GG*(G中元素所能构成的一切序列的集合)的有限非空子集的映射。然后,把δ扩充为从G*到G*的有限非空子集的映射。
如果空字e不能替换任何字母,即对 G中所有字母ɑ,都有e唘δ(ɑ),就称Γ为增殖0L系统,简称P0L系统;如果对字母表内每一个字母有且只有一个转移规则,即对G中所有ɑ,在G*中只有一个字p使δ(ɑ)={p},就称Γ为确定的0L系统,简称 D0L系统。显然(P0L∪D0L)吇0L。而既增殖又确定的DL系统称为DP0L。

分别描述

       从另一角度,元胞自动机可视为动力系统,因而可将初始点、轨道、不动点、周期轨和终极轨等一系列概念用到元胞自动机的研究中,上述分类,又可以分别描述为(谭跃进,1996;谢惠民,1994;李才伟、1997);
      ⑴均匀状态,即点态吸引子,或称不动点;
      ⑵简单的周期结构,即周期性吸引子,或称周期轨;
      ⑶混沌的非周期性模式,即混沌吸引子;
      ⑷这第四类行为可以与生命系统等复杂系统中的自组织现象相比拟,但在连续系统中没有相对应的模式。但从研究元胞自动机的角度讲,最具研究价值的具有第四类行为的元胞自动机,因为这类元胞自动机被认为具有"突现计算"(Emergent
Computation)功能,研究表明,可以用作广义计算机(Universal Computer)以仿真任意复杂的计算过程。另外,此类元胞自动机在发展过程中还表现出很强的不可逆(lrreversibility)特征,而且,这种元胞自动机在若干有限循环后,有可能会 "死"掉,即所有元胞的状态变为零。
        

Python代码:
L系统
def mainex():
#drawsemilogx();
#drawLorenzAttractor();
#drawLeaf();#未成功
#drawLSystem();
#drawIsoLine();
#drawFourFlower();
#drawFlowers();
drawBranch();
#drawStar();
#drawPillar(); #为了画吸引子
def get_lines(rule):
d = rule['direct']
a = rule['angle']
p = (0.0, 0.0)
l = 1.0
lines = []
stack = []
info = rule['S']
for i in range(rule['iter']):
ninfo = []
for c in info:
if c in rule:
ninfo.append(rule[c])
else:
ninfo.append(c)
info = "".join(ninfo) for c in info:
if c in "Ff":
r = d * pi / 180
t = p[0] + l*cos(r), p[1] + l*sin(r)
lines.append(((p[0], p[1]), (t[0], t[1])))
p = t
elif c == "+":
d += a
elif c == "-":
d -= a
elif c == "[":
stack.append((p,d))
elif c == "]":
p, d = stack[-1]
del stack[-1]
return lines def draw(ax, rule, iter=None):
if iter!=None:
rule["iter"] = iter
lines = get_lines( rule )
linecollections = collections.LineCollection(lines)
ax.add_collection(linecollections, autolim=True)
ax.axis("equal")
ax.set_axis_off()
ax.set_xlim(ax.dataLim.xmin, ax.dataLim.xmax)
ax.invert_yaxis() def drawBranch():
fig = plt.figure(figsize=(8,6))
fig.patch.set_facecolor("w")
ax = fig.add_subplot(111);
ruleBranch={
"X":"F-[[X]+X]+F[+FX]-X", "F":"FF", "S":"X",
"direct":-45,
"angle":25,
"iter":4,
"title":"Plant"
}
draw(ax, ruleBranch);
fig.subplots_adjust(left=0,right=1,bottom=0,top=1,wspace=0,hspace=0)
plt.show();

洛伦兹吸引子:

def drawLorenzAttractor():
xs, ys, zs = [], [], [];
def mkPoints():
a, b, c = 10.0, 28.0, 8.0 / 3.0
h = 0.01
x0, y0, z0 = 0.1, 0, 0
for i in xrange(10000):
x1 = x0 + h * a * (y0 - x0)
y1 = y0 + h * (x0 * (b - z0) - y0)
z1 = z0 + h * (x0 * y0 - c * z0)
x0, y0, z0 = x1, y1, z1
xs.append(x0)
ys.append(y0)
zs.append(z0); mpl.rcParams["legend.fontsize"] = 10;
fig = plt.figure()
ax = Axes3D(fig) mkPoints(); ax.plot(xs, ys, zs, label = "Lorenz's strange attractor")
ax.legend()
plt.show()

显示结果:

    





ProE复杂曲线方程:Python Matplotlib 版本代码(L系统,吸引子和分形)的更多相关文章

  1. ProE常用曲线方程:Python Matplotlib 版本代码(蝴蝶曲线)

    花纹的生成可以使用贴图的方式,同样也可以使用方程,本文列出了几种常用曲线的方程式,以取代贴图方式完成特定花纹的生成. 注意极坐标的使用................. 前面部分基础资料,参考:Pyt ...

  2. ProE常用曲线方程:Python Matplotlib 版本代码(玫瑰曲线)

    Pyplot教程:https://matplotlib.org/gallery/index.html#pyplots-examples 玫瑰曲线 文字描述 平面内,围绕某一中心点平均分布整数个正弦花瓣 ...

  3. python 低版本一段扫描代码

    个人在做Linux渗透测试往内网跨的时候,通常我碰到的Linux环境都会是如下集中情况 1: DMZ,严格的DMZ,根本跨不到内网里去.这种最恶心了. 2:WEB SERVER,严格区分,工作机和工作 ...

  4. python 常忘代码查询 和autohotkey补括号脚本和一些笔记和面试常见问题

    笔试一些注意点: --,23点43 今天做的京东笔试题目: 编程题目一定要先写变量取None的情况.今天就是因为没有写这个边界条件所以程序一直不对.以后要注意!!!!!!!!!!!!!!!!!!!!! ...

  5. python matplotlib 中文显示参数设置

    python matplotlib 中文显示参数设置 方法一:每次编写代码时进行参数设置 #coding:utf-8import matplotlib.pyplot as pltplt.rcParam ...

  6. python的PEP8 代码风格指南

    PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...

  7. Python实现C代码统计工具(四)

    目录 Python实现C代码统计工具(四) 标签: Python 计时 持久化 声明 运行测试环境 一. 自定义计时函数 1.1 整个程序计时 1.2 代码片段计时 1.3 单条语句计时 二. 性能优 ...

  8. Linux下python多版本多环境介绍

     一.python多版本配置说明 安装python相关依赖 [root@centos6 ~]# yum install -y gcc make patch gdbm-devel openssl-dev ...

  9. Linux系统中python默认版本为python2.7,修改为python3 项目上传码云

    # 查询系统本系统中安装的python版本 ls -l /usr/bin/python* 1.在虚拟机上新建虚拟环境 # 系统中python默认版本为python2.,可以将其修改为python3 # ...

随机推荐

  1. cogs——1786. 韩信点兵

    1786. 韩信点兵 ★★★   输入文件:HanXin.in   输出文件:HanXin.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 韩信是中国军事思想“谋战” ...

  2. Android实现微博分享及其注意事项

    在前面我写了两篇关于QQ和微信的分享(http://blog.csdn.net/dawanganban/article/details/42015249)(http://blog.csdn.net/d ...

  3. Tomcat手工搭建Jsp和Servlet程序

    要执行J2EE的程序,就必须安装相关的容器.而怎样选择JSP+Servlet模式.Tomcat是非常重要的选择之中的一个,是世界上最为广泛的Servlet和JSP容器. 下载: 1. URL: htt ...

  4. 2015 Multi-University Training Contest 2 1004 Delicious Apples(DP)

    pid=5303">题目链接 题意:长度为l 的环,有n棵果树,背包容量为k,告诉你k棵苹果树的id.以及每棵树上结的果子数.背包一旦装满要返回起点(id==0) 清空,问你至少走多少 ...

  5. Mongo使用

    在用mongo进行查询时,$exists表示是否document是否包括这个field,即使field的value为null也算是包括. $exists Syntax: { field: { $exi ...

  6. java中不能使用小数点(.)来作为分隔符

    split()括号里是一个String的参数,所以一定要符合这种:split(".")形式,即点'.'要用双引号""括起来"."在java中 ...

  7. Cocos2d-x教程(26)-Cocos2d-x + Lua脚本实现大地图缩放功能

    欢迎增加 Cocos2d-x 交流群: 193411763 视频教程地址:http://www.tudou.com/programs/view/qRiOfppMghM/ 转载请注明原文出处:http: ...

  8. PHP数字左侧自动补零

    1.输出数字为001,002... <?php $number=0; if($number<100) { $number=$number+1; $txt=sprintf("%03 ...

  9. sql_server_action

    ''' SELECT * FROM Info_Roles WHERE Flag=1 LIMIT 2; select top y * from 表 where 主键 not in(select top ...

  10. GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别

    数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的入参传入时将复制一份数 ...