查看原文
其他

算法创作实战03 - 用 MaxMSP 实现 L-system

kidult00 科技无障碍 2022-11-03



好久不见~

前面两篇算法创作的实战,都是相对容易的小程序。

算法创作实战01 - 巴纳姆效应之随机星座实验

算法创作实战02 - 用 MaxMSP 生成随机颜色

今天我们一起来挑战用 Max/MSP (更准确说,是用 jitter) 来「种」植物。

名称:L-system

主要使用的对象:jit.linden, jit.turtle, jit.matrix, jit.str.fromsymbol, jit.iter, jit.lcd, jit.pwindow

难度系数:★★★★☆


什么是 L-system?

生成式艺术和算法创作07-向自然致敬的 L-system中,已经对 L-system 做了详细的介绍。L-system 是 Aristid Lindenmayer  提出的有关生长发展中的细胞交互作用的数学模型,被广泛应用于植物生长过程的研究和建模,也常用于模拟各种生物体的形态。

L-system 是一系列不同形式的语法规则,它的自然递归规则产生自相似性,也能用于生成自相似的分形,例如迭代函数系统。它一般可以这样定义:

G ={V,S,ω,P},

V: 变量符号集合

S: 常量符号集合

ω: 初始状态串(i.e. seed or axiom)

P: 生成式规则(production)

接下来,我们动手来实现它。

开始的正确姿势

如何在 Max/MSP 实现 L-system?

最开始面对这个问题,会觉得茫然无措:该从哪里开始?

回答与软件相关的工程问题,最好答案永远是——搜索。

而搜索的第一站,不是 Google,应该是官方文档。在经历了长时间漫无头绪的搜索,各种成功不成功的尝试后,00 再次获得了一个多么痛的领悟——永远先搜索软件文档。搜索结果已经清楚明白地列出跟 L-system 有关的对象了!

然后我们来仔细读一下文档里面的说明吧。

jit.linden

打开jit.linden的帮助文档,例子如下:

一阵头晕目眩后冷静下来,试着运行程序。然而并不知道它在做什么……

只好静下心来一点一点看。

首先是找出核心对象。核心对象jit.linden前面连接的是一个矩阵,接收了 tolinden 的消息(unlock patch 后才看到s tolinden的内容);后面连接的是同一个矩阵。将矩阵可视化出来时需要变成 1 维 1 平面的矩阵。但是这个可视化方式非常不直观,需要另外寻找方法。(所以搜索结果列出了jit.turtle是不是……)

例子右边是规则相关的部分。在生成式艺术和算法创作07-向自然致敬的 L-system中我们已经知道,生成式规则(production) 是决定 L-system 生成结果的关键。那么,这里 production 后面的一串* F * +[F+]* G * -[GF-]F - F --是什么意思呢?下面给出的注释是:

list of symbols in the format:

left_context  strict_predecessor  right_context  successor

if a symbol matching the strict_predecessors is found in the matrix it is replaced with the sucessor string if the left and right context is met. the wildcard character ('*' by default) means no left or right context.

还是一知半解的感觉,这时候需要打开顶部p moreinfo子 patch。里面解释了 production 规则是如何设定的。

L-systems work on an interpreted grammar model wherein a syntax is defined for replacing individual elements of the incoming string with a replacement string.

L-systems get larger through successive productions. the size of the Jitter matrix used by the object determines the maximum length of the string, so a large matrix is advisable, even if the axiom (starting string) is very small.

大意是,随着迭代,矩阵会变得越来越大,建议设定一个较大尺寸的矩阵。

'production * F * +F[F]' tells jit.linden to take every 'F' found in the input matrix and replace it with the string '+F[F]'. So the first four generations of an L-system with an axiom of 'F' would look like this:

F
+F[F]
++F[F][+F[F]]
+++F[F][+F[F]][++F[F][+F[F]]]

production 接着的第一个 * F 是初始值,或者叫做 axiom(公理),第二个 * 是 axiom 替代自己的规则。

More complex models can be created by adding multiple productions, or by introducing context matching into the L-system grammar.

例如:production G F * +F 意思是只有在F前面是一个G的时候,才将F替换为+F

又如:production G F * +F * G * G-包含两个规则,一个是上面提到的GF替换 为G+F; 另一个是G替换为G-

jit.linden最多可以定义 50 个规则。

the jit.turtle object interprets L-systems as turtle graphics, so that characters such as 'F', '+', and '-' acquire special meaning. you could easily use jit.iter to access the Lindenmayer string in Max.

这一段也剧透了很多重要信息,包括用jit.iter获取字符串和用jit.turtle显示 L-system 生成的图形。

jit.turtle

然后再来看看jit.turtle怎么画图。

jit.turtle前面是设定各种参数,例如步进值、旋转角度、起始点等,然后接收jtr传来的 production 规则,尤其要理解 F、+、- 的含义。jit.turtle后面接的是一个jit.lcd,将规则显示出来。

生成 L-system

下面开始动手尝试了。好消息是,不必从零开始,从jit.linden帮助里面 copy 主要的部分,就可以快速建立起程序的框架。

首先是用规则生成矩阵的部分。又可以分为矩阵、公理和规则三部分:

  1. 矩阵部分:jit.linden前面是一个初始化矩阵,r generate接收每一步的生成指令;jit.linden后面是一步生成后存储的矩阵,在下面用jit.cellblockjit.pwindow显示存储的值和存储占用情况

  2. 公理:用jit.str.fromsymbol接收 axiom 字母并转换成 ASCII 编码,同时指定矩阵的大小,如 1000

  3. 规则:将包含 axiom、production、turtle 参数的规则写入一个message中,然后用r linden接收并传入jit.linden

接下来将矩阵中存储的规则用jit.turtle画出来。

这里的关键是用jit.iter将矩阵中每个值依次传到jit.turtle,并且接收r turtle中关于角度、大小等设置值,然后传给jit.lcd绘制:


Let's Play!

接下来终于进入寻找有趣 production 的游戏环节了~

可以自己试验,也可以从网上搜刮一些已经写好的规则。一个完整的规则可以写到一个message里面,打包传给jit.linden:

下面进入愉快的玩耍时间~

种草:

* A * F * F * F-[[A]+A]+F[+FA]


种(歪的)树:

* X * C0F-[C2[X]+C3X]+C1F[C3+FX]-X * F * FF


种粮食:

* A * G * G * GFX[+G][-G] * X * X[-FFF][+FFF]FX


大城市的“地铁图”:

* F * +F[--F+F]


Ref


- [生成式艺术和算法创作07-向自然致敬的 L-system](https://www.uegeek.com/181123-generative-art-creativity-07.html) 

- [L-system - Wikiwand](https://www.wikiwand.com/en/L-system)

- [Koch snowflake - Wikiwand](https://www.wikiwand.com/en/Koch_snowflake)

- [L-System manual](http://paulbourke.net/fractals/lsys/)

- [Turtle graphics - Wikiwand](https://www.wikiwand.com/en/Turtle_graphics)

- [L-Systems Renderer](http://piratefsh.github.io/p5js-art/public/lsystems/)

- [L-Systems Turtle Graphics Renderer - HTML5 Canvas - by Kevin Roast](http://www.kevs3d.co.uk/dev/lsystems/)




Max/MSP/Jitter 教程系列

Max/MSP/Jitter 教程 01 - 什么是矩阵?
Max/MSP/Jitter 教程 02 - Jitter 对象的属性
Max/MSP/Jitter 教程 03 - 播放 QuickTime 视频
Max/MSP/Jitter 教程 04 - 创建矩阵
Max/MSP/Jitter 教程 05 - 矩阵的数学运算


友情提示:独自折腾 Max 易患上癔症……不妨入群互助

👇👇👇

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存